blob: d4402227f3a0e69313a95b252caeaa3b87b06466 [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"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000024#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000025#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000026#include "llvm/ADT/Triple.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000027#include "llvm/IR/Type.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000030#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000031#include <memory>
Chris Lattner5ba61f02006-10-14 07:39:34 +000032using namespace clang;
33
Chris Lattner5ba61f02006-10-14 07:39:34 +000034//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000035// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000036//===----------------------------------------------------------------------===//
37
Chris Lattner1e1c0b92009-03-20 16:06:38 +000038/// DefineStd - Define a macro name and standard variants. For example if
39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000041static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000042 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000044
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46 // in the user's namespace.
47 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000048 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055}
56
Benjamin Kramere3b442d2012-01-10 11:50:09 +000057static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58 bool Tuning = true) {
59 Builder.defineMacro("__" + CPUName);
60 Builder.defineMacro("__" + CPUName + "__");
61 if (Tuning)
62 Builder.defineMacro("__tune_" + CPUName + "__");
63}
64
Chris Lattner09d98f52008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000068
Torok Edwinb2b37c62009-06-30 17:10:35 +000069namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000072protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000074 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000075public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000076 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000077 void getTargetDefines(const LangOptions &Opts,
78 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000079 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000081 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000082
83};
Chris Lattner859c37a2009-08-12 06:24:27 +000084} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000085
Chris Lattner30ba6742009-08-10 19:03:04 +000086
Daniel Dunbard86666f2010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000091 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000092 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000094 // AddressSanitizer doesn't play well with source fortification, which is on
95 // by default on Darwin.
Will Dietzf54319c2013-01-18 11:30:38 +000096 if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000097
John McCall5d36a8c2011-06-16 00:03:19 +000098 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +000099 // __weak is always defined, for use in blocks and with objc pointers.
100 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000101
John McCall31168b02011-06-15 23:02:42 +0000102 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000103 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000104 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
105 else
106 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000107
John McCall31168b02011-06-15 23:02:42 +0000108 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
109 // allow this in C, since one might have block pointers in structs that
110 // are used in pure C code and in Objective-C ARC.
111 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000112 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000113
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000114 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000115 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000116 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000118
119 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000121
Daniel Dunbarecf13562011-04-19 21:40:34 +0000122 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000123 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000124 if (Triple.isMacOSX()) {
125 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000126 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000127 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000128 Triple.getOSVersion(Maj, Min, Rev);
129 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000130 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000131
Sebastian Pop422377c2012-01-20 22:01:23 +0000132 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000133 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000134 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
135 if (PlatformName == "win32") {
136 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
137 return;
138 }
139
Evan Cheng31dd9a62014-01-26 23:12:43 +0000140 // Set the appropriate OS version define.
141 if (Triple.isiOS()) {
142 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
143 char Str[6];
144 Str[0] = '0' + Maj;
145 Str[1] = '0' + (Min / 10);
146 Str[2] = '0' + (Min % 10);
147 Str[3] = '0' + (Rev / 10);
148 Str[4] = '0' + (Rev % 10);
149 Str[5] = '\0';
150 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
151 Str);
152 } else if (Triple.isMacOSX()) {
153 // Note that the Driver allows versions which aren't representable in the
154 // define (because we only get a single digit for the minor and micro
155 // revision numbers). So, we limit them to the maximum representable
156 // version.
157 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
158 char Str[5];
159 Str[0] = '0' + (Maj / 10);
160 Str[1] = '0' + (Maj % 10);
161 Str[2] = '0' + std::min(Min, 9U);
162 Str[3] = '0' + std::min(Rev, 9U);
163 Str[4] = '\0';
164 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000165 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000166
Tim Northover157d9112014-01-16 08:48:16 +0000167 // Tell users about the kernel if there is one.
168 if (Triple.isOSDarwin())
169 Builder.defineMacro("__MACH__");
170
Daniel Dunbarecf13562011-04-19 21:40:34 +0000171 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000172}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000173
Chris Lattner30ba6742009-08-10 19:03:04 +0000174namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000175template<typename Target>
176class DarwinTargetInfo : public OSTargetInfo<Target> {
177protected:
Craig Topper3164f332014-03-11 03:39:26 +0000178 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
179 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000180 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000181 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000182 }
Mike Stump11289f42009-09-09 15:08:12 +0000183
Torok Edwinb2b37c62009-06-30 17:10:35 +0000184public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000185 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
186 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
187 this->MCountName = "\01mcount";
188 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000189
Craig Topper3164f332014-03-11 03:39:26 +0000190 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000191 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000192 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000193 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000194 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000195 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000196 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000197 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000198
Craig Topper3164f332014-03-11 03:39:26 +0000199 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000200 // FIXME: We should return 0 when building kexts.
201 return "__TEXT,__StaticInit,regular,pure_instructions";
202 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000203
John McCalleed64c72012-01-29 01:20:30 +0000204 /// Darwin does not support protected visibility. Darwin's "default"
205 /// is very similar to ELF's "protected"; Darwin requires a "weak"
206 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000207 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000208 return false;
209 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000210};
211
Chris Lattner30ba6742009-08-10 19:03:04 +0000212
Torok Edwinb2b37c62009-06-30 17:10:35 +0000213// DragonFlyBSD Target
214template<typename Target>
215class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
216protected:
Craig Topper3164f332014-03-11 03:39:26 +0000217 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
218 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000219 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000220 Builder.defineMacro("__DragonFly__");
221 Builder.defineMacro("__DragonFly_cc_version", "100001");
222 Builder.defineMacro("__ELF__");
223 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
224 Builder.defineMacro("__tune_i386__");
225 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000226 }
227public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000228 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
229 : OSTargetInfo<Target>(Triple) {
230 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000231
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000232 switch (Triple.getArch()) {
233 default:
234 case llvm::Triple::x86:
235 case llvm::Triple::x86_64:
236 this->MCountName = ".mcount";
237 break;
238 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000239 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000240};
241
242// FreeBSD Target
243template<typename Target>
244class FreeBSDTargetInfo : public OSTargetInfo<Target> {
245protected:
Craig Topper3164f332014-03-11 03:39:26 +0000246 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
247 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000248 // FreeBSD defines; list based off of gcc output
249
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000250 unsigned Release = Triple.getOSMajorVersion();
251 if (Release == 0U)
252 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000254 Builder.defineMacro("__FreeBSD__", Twine(Release));
255 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000256 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
257 DefineStd(Builder, "unix", Opts);
258 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000259
260 // On FreeBSD, wchar_t contains the number of the code point as
261 // used by the character set of the locale. These character sets are
262 // not necessarily a superset of ASCII.
263 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000264 }
265public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000266 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
267 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000268
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000269 switch (Triple.getArch()) {
270 default:
271 case llvm::Triple::x86:
272 case llvm::Triple::x86_64:
273 this->MCountName = ".mcount";
274 break;
275 case llvm::Triple::mips:
276 case llvm::Triple::mipsel:
277 case llvm::Triple::ppc:
278 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000279 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000280 this->MCountName = "_mcount";
281 break;
282 case llvm::Triple::arm:
283 this->MCountName = "__mcount";
284 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000285 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000286 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000287};
288
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000289// GNU/kFreeBSD Target
290template<typename Target>
291class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
292protected:
Craig Topper3164f332014-03-11 03:39:26 +0000293 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
294 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000295 // GNU/kFreeBSD defines; list based off of gcc output
296
297 DefineStd(Builder, "unix", Opts);
298 Builder.defineMacro("__FreeBSD_kernel__");
299 Builder.defineMacro("__GLIBC__");
300 Builder.defineMacro("__ELF__");
301 if (Opts.POSIXThreads)
302 Builder.defineMacro("_REENTRANT");
303 if (Opts.CPlusPlus)
304 Builder.defineMacro("_GNU_SOURCE");
305 }
306public:
Sylvestre Ledru15832282013-09-05 13:58:07 +0000307 KFreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000308 this->UserLabelPrefix = "";
309 }
310};
311
Chris Lattner3e2ee142010-07-07 16:01:42 +0000312// Minix Target
313template<typename Target>
314class MinixTargetInfo : public OSTargetInfo<Target> {
315protected:
Craig Topper3164f332014-03-11 03:39:26 +0000316 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
317 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000318 // Minix defines
319
320 Builder.defineMacro("__minix", "3");
321 Builder.defineMacro("_EM_WSIZE", "4");
322 Builder.defineMacro("_EM_PSIZE", "4");
323 Builder.defineMacro("_EM_SSIZE", "2");
324 Builder.defineMacro("_EM_LSIZE", "4");
325 Builder.defineMacro("_EM_FSIZE", "4");
326 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000327 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000328 DefineStd(Builder, "unix", Opts);
329 }
330public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000331 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
332 this->UserLabelPrefix = "";
333 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000334};
335
Torok Edwinb2b37c62009-06-30 17:10:35 +0000336// Linux target
337template<typename Target>
338class LinuxTargetInfo : public OSTargetInfo<Target> {
339protected:
Craig Topper3164f332014-03-11 03:39:26 +0000340 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
341 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000343 DefineStd(Builder, "unix", Opts);
344 DefineStd(Builder, "linux", Opts);
345 Builder.defineMacro("__gnu_linux__");
346 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000347 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000348 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000349 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000350 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000351 if (Opts.CPlusPlus)
352 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000353 }
354public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000355 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000356 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000357 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000358
359 switch (Triple.getArch()) {
360 default:
361 break;
362 case llvm::Triple::ppc:
363 case llvm::Triple::ppc64:
364 case llvm::Triple::ppc64le:
365 this->MCountName = "_mcount";
366 break;
367 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000368 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000369
Craig Topper3164f332014-03-11 03:39:26 +0000370 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000371 return ".text.startup";
372 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000373};
374
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000375// NetBSD Target
376template<typename Target>
377class NetBSDTargetInfo : public OSTargetInfo<Target> {
378protected:
Craig Topper3164f332014-03-11 03:39:26 +0000379 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
380 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000381 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000382 Builder.defineMacro("__NetBSD__");
383 Builder.defineMacro("__unix__");
384 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000385 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000386 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000387 }
388public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000389 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
390 this->UserLabelPrefix = "";
391 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000392};
393
Torok Edwinb2b37c62009-06-30 17:10:35 +0000394// OpenBSD Target
395template<typename Target>
396class OpenBSDTargetInfo : public OSTargetInfo<Target> {
397protected:
Craig Topper3164f332014-03-11 03:39:26 +0000398 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
399 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000400 // OpenBSD defines; list based off of gcc output
401
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000402 Builder.defineMacro("__OpenBSD__");
403 DefineStd(Builder, "unix", Opts);
404 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000405 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000406 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000407 }
408public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000409 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
410 this->UserLabelPrefix = "";
411 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000412
Eli Friedman3715d1f2011-12-15 02:15:56 +0000413 switch (Triple.getArch()) {
414 default:
415 case llvm::Triple::x86:
416 case llvm::Triple::x86_64:
417 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000418 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000419 this->MCountName = "__mcount";
420 break;
421 case llvm::Triple::mips64:
422 case llvm::Triple::mips64el:
423 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000424 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000425 this->MCountName = "_mcount";
426 break;
427 }
428 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000429};
430
Eli Friedman9fa28852012-08-08 23:57:20 +0000431// Bitrig Target
432template<typename Target>
433class BitrigTargetInfo : public OSTargetInfo<Target> {
434protected:
Craig Topper3164f332014-03-11 03:39:26 +0000435 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
436 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000437 // Bitrig defines; list based off of gcc output
438
439 Builder.defineMacro("__Bitrig__");
440 DefineStd(Builder, "unix", Opts);
441 Builder.defineMacro("__ELF__");
442 if (Opts.POSIXThreads)
443 Builder.defineMacro("_REENTRANT");
444 }
445public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000446 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
447 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000448 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000449 }
450};
451
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000452// PSP Target
453template<typename Target>
454class PSPTargetInfo : public OSTargetInfo<Target> {
455protected:
Craig Topper3164f332014-03-11 03:39:26 +0000456 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
457 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000458 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000459 Builder.defineMacro("PSP");
460 Builder.defineMacro("_PSP");
461 Builder.defineMacro("__psp__");
462 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000463 }
464public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000465 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000466 this->UserLabelPrefix = "";
467 }
468};
469
John Thompsone467e192009-11-19 17:18:50 +0000470// PS3 PPU Target
471template<typename Target>
472class PS3PPUTargetInfo : public OSTargetInfo<Target> {
473protected:
Craig Topper3164f332014-03-11 03:39:26 +0000474 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
475 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000476 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000477 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000478 Builder.defineMacro("__PPU__");
479 Builder.defineMacro("__CELLOS_LV2__");
480 Builder.defineMacro("__ELF__");
481 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000482 Builder.defineMacro("_ARCH_PPC64");
483 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000484 }
485public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000486 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000487 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000488 this->LongWidth = this->LongAlign = 32;
489 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000490 this->IntMaxType = TargetInfo::SignedLongLong;
491 this->UIntMaxType = TargetInfo::UnsignedLongLong;
492 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000493 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000494 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000495 }
496};
497
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000498// AuroraUX target
499template<typename Target>
500class AuroraUXTargetInfo : public OSTargetInfo<Target> {
501protected:
Craig Topper3164f332014-03-11 03:39:26 +0000502 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
503 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000504 DefineStd(Builder, "sun", Opts);
505 DefineStd(Builder, "unix", Opts);
506 Builder.defineMacro("__ELF__");
507 Builder.defineMacro("__svr4__");
508 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000509 }
510public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000511 AuroraUXTargetInfo(const llvm::Triple &Triple)
512 : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000513 this->UserLabelPrefix = "";
514 this->WCharType = this->SignedLong;
515 // FIXME: WIntType should be SignedLong
516 }
517};
518
Torok Edwinb2b37c62009-06-30 17:10:35 +0000519// Solaris target
520template<typename Target>
521class SolarisTargetInfo : public OSTargetInfo<Target> {
522protected:
Craig Topper3164f332014-03-11 03:39:26 +0000523 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
524 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000525 DefineStd(Builder, "sun", Opts);
526 DefineStd(Builder, "unix", Opts);
527 Builder.defineMacro("__ELF__");
528 Builder.defineMacro("__svr4__");
529 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000530 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
531 // newer, but to 500 for everything else. feature_test.h has a check to
532 // ensure that you are not using C99 with an old version of X/Open or C89
533 // with a new version.
534 if (Opts.C99 || Opts.C11)
535 Builder.defineMacro("_XOPEN_SOURCE", "600");
536 else
537 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000538 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000539 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000540 Builder.defineMacro("_LARGEFILE_SOURCE");
541 Builder.defineMacro("_LARGEFILE64_SOURCE");
542 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000543 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000544 }
545public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000546 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000547 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000548 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000549 // FIXME: WIntType should be SignedLong
550 }
551};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000552
553// Windows target
554template<typename Target>
555class WindowsTargetInfo : public OSTargetInfo<Target> {
556protected:
Craig Topper3164f332014-03-11 03:39:26 +0000557 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
558 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000559 Builder.defineMacro("_WIN32");
560 }
561 void getVisualStudioDefines(const LangOptions &Opts,
562 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000563 if (Opts.CPlusPlus) {
564 if (Opts.RTTI)
565 Builder.defineMacro("_CPPRTTI");
566
567 if (Opts.Exceptions)
568 Builder.defineMacro("_CPPUNWIND");
569 }
570
571 if (!Opts.CharIsSigned)
572 Builder.defineMacro("_CHAR_UNSIGNED");
573
574 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
575 // but it works for now.
576 if (Opts.POSIXThreads)
577 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000578
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000579 if (Opts.MSCVersion != 0)
580 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
581
582 if (Opts.MicrosoftExt) {
583 Builder.defineMacro("_MSC_EXTENSIONS");
584
585 if (Opts.CPlusPlus11) {
586 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
587 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
588 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
589 }
590 }
591
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000592 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000593 }
594
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000595public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000596 WindowsTargetInfo(const llvm::Triple &Triple)
597 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000598};
599
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000600template <typename Target>
601class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000602protected:
Craig Topper3164f332014-03-11 03:39:26 +0000603 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
604 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000605 if (Opts.POSIXThreads)
606 Builder.defineMacro("_REENTRANT");
607 if (Opts.CPlusPlus)
608 Builder.defineMacro("_GNU_SOURCE");
609
610 DefineStd(Builder, "unix", Opts);
611 Builder.defineMacro("__ELF__");
612 Builder.defineMacro("__native_client__");
613 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000614
615public:
616 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000617 this->UserLabelPrefix = "";
618 this->LongAlign = 32;
619 this->LongWidth = 32;
620 this->PointerAlign = 32;
621 this->PointerWidth = 32;
622 this->IntMaxType = TargetInfo::SignedLongLong;
623 this->UIntMaxType = TargetInfo::UnsignedLongLong;
624 this->Int64Type = TargetInfo::SignedLongLong;
625 this->DoubleAlign = 64;
626 this->LongDoubleWidth = 64;
627 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000628 this->LongLongWidth = 64;
629 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000630 this->SizeType = TargetInfo::UnsignedInt;
631 this->PtrDiffType = TargetInfo::SignedInt;
632 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000633 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000634 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000635 if (Triple.getArch() == llvm::Triple::arm) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000636 this->DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000637 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000638 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000639 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000640 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000641 } else if (Triple.getArch() == llvm::Triple::mipsel) {
642 // Handled on mips' setDescriptionString.
643 } else {
644 assert(Triple.getArch() == llvm::Triple::le32);
645 this->DescriptionString = "e-p:32:32-i64:64";
646 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000647 }
Craig Topper3164f332014-03-11 03:39:26 +0000648 typename Target::CallingConvCheckResult checkCallingConvention(
649 CallingConv CC) const override {
Derek Schuffa2020962012-10-16 22:30:41 +0000650 return CC == CC_PnaclCall ? Target::CCCR_OK :
651 Target::checkCallingConvention(CC);
652 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000653};
Mike Stump11289f42009-09-09 15:08:12 +0000654} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000655
Chris Lattner09d98f52008-10-05 21:50:58 +0000656//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000657// Specific target implementations.
658//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000659
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000660namespace {
661// PPC abstract base class
662class PPCTargetInfo : public TargetInfo {
663 static const Builtin::Info BuiltinInfo[];
664 static const char * const GCCRegNames[];
665 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000666 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000667
668 // Target cpu features.
669 bool HasVSX;
670
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000671public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000672 PPCTargetInfo(const llvm::Triple &Triple)
673 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000674 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000675 LongDoubleWidth = LongDoubleAlign = 128;
676 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
677 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000678
Hal Finkel6b984f02012-07-03 16:51:04 +0000679 /// \brief Flags for architecture specific defines.
680 typedef enum {
681 ArchDefineNone = 0,
682 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
683 ArchDefinePpcgr = 1 << 1,
684 ArchDefinePpcsq = 1 << 2,
685 ArchDefine440 = 1 << 3,
686 ArchDefine603 = 1 << 4,
687 ArchDefine604 = 1 << 5,
688 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000689 ArchDefinePwr5 = 1 << 7,
690 ArchDefinePwr5x = 1 << 8,
691 ArchDefinePwr6 = 1 << 9,
692 ArchDefinePwr6x = 1 << 10,
693 ArchDefinePwr7 = 1 << 11,
694 ArchDefineA2 = 1 << 12,
695 ArchDefineA2q = 1 << 13
Hal Finkel6b984f02012-07-03 16:51:04 +0000696 } ArchDefineTypes;
697
Bill Schmidt38378a02013-02-01 20:23:10 +0000698 // Note: GCC recognizes the following additional cpus:
699 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
700 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
701 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000702 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000703 bool CPUKnown = llvm::StringSwitch<bool>(Name)
704 .Case("generic", true)
705 .Case("440", true)
706 .Case("450", true)
707 .Case("601", true)
708 .Case("602", true)
709 .Case("603", true)
710 .Case("603e", true)
711 .Case("603ev", true)
712 .Case("604", true)
713 .Case("604e", true)
714 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000715 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000716 .Case("g3", true)
717 .Case("7400", true)
718 .Case("g4", true)
719 .Case("7450", true)
720 .Case("g4+", true)
721 .Case("750", true)
722 .Case("970", true)
723 .Case("g5", true)
724 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000725 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000726 .Case("e500mc", true)
727 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000728 .Case("power3", true)
729 .Case("pwr3", true)
730 .Case("power4", true)
731 .Case("pwr4", true)
732 .Case("power5", true)
733 .Case("pwr5", true)
734 .Case("power5x", true)
735 .Case("pwr5x", true)
736 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000737 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000738 .Case("power6x", true)
739 .Case("pwr6x", true)
740 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000741 .Case("pwr7", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000742 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000743 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000744 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000745 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000746 .Case("powerpc64le", true)
747 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000748 .Default(false);
749
750 if (CPUKnown)
751 CPU = Name;
752
753 return CPUKnown;
754 }
755
Craig Topper3164f332014-03-11 03:39:26 +0000756 void getTargetBuiltins(const Builtin::Info *&Records,
757 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000758 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000759 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000760 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000761
Craig Topper3164f332014-03-11 03:39:26 +0000762 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000763
Craig Topper3164f332014-03-11 03:39:26 +0000764 void getTargetDefines(const LangOptions &Opts,
765 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000766
Craig Topper3164f332014-03-11 03:39:26 +0000767 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000768
Craig Topper3164f332014-03-11 03:39:26 +0000769 bool handleTargetFeatures(std::vector<std::string> &Features,
770 DiagnosticsEngine &Diags) override;
771 bool hasFeature(StringRef Feature) const override;
772
773 void getGCCRegNames(const char * const *&Names,
774 unsigned &NumNames) const override;
775 void getGCCRegAliases(const GCCRegAlias *&Aliases,
776 unsigned &NumAliases) const override;
777 bool validateAsmConstraint(const char *&Name,
778 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000779 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000780 default: return false;
781 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000782 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000783 case 'b': // Base register
784 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000785 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000786 break;
787 // FIXME: The following are added to allow parsing.
788 // I just took a guess at what the actions should be.
789 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000790 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000791 case 'v': // Altivec vector register
792 Info.setAllowsRegister();
793 break;
794 case 'w':
795 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000796 case 'd':// VSX vector register to hold vector double data
797 case 'f':// VSX vector register to hold vector float data
798 case 's':// VSX vector register to hold scalar float data
799 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000800 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000801 break;
802 default:
803 return false;
804 }
805 Info.setAllowsRegister();
806 Name++; // Skip over 'w'.
807 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000808 case 'h': // `MQ', `CTR', or `LINK' register
809 case 'q': // `MQ' register
810 case 'c': // `CTR' register
811 case 'l': // `LINK' register
812 case 'x': // `CR' register (condition register) number 0
813 case 'y': // `CR' register (condition register)
814 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000815 Info.setAllowsRegister();
816 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000817 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000818 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000819 // (use `L' instead for SImode constants)
820 case 'K': // Unsigned 16-bit constant
821 case 'L': // Signed 16-bit constant shifted left 16 bits
822 case 'M': // Constant larger than 31
823 case 'N': // Exact power of 2
824 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000825 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000826 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000827 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000828 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000829 break;
830 case 'm': // Memory operand. Note that on PowerPC targets, m can
831 // include addresses that update the base register. It
832 // is therefore only safe to use `m' in an asm statement
833 // if that asm statement accesses the operand exactly once.
834 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000835 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000836 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000837 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000838 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000839 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
840 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000841 // register to be updated.
842 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000843 if (Name[1] != 's')
844 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000845 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000846 // include any automodification of the base register. Unlike
847 // `m', this constraint can be used in asm statements that
848 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000849 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000850 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000851 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000852 break;
853 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000854 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000855 case 'Z': // Memory operand that is an indexed or indirect from a
856 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000857 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000858 Info.setAllowsMemory();
859 Info.setAllowsRegister();
860 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000861 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000862 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000863 // register (`p' is preferable for asm statements)
864 case 'S': // Constant suitable as a 64-bit mask operand
865 case 'T': // Constant suitable as a 32-bit mask operand
866 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000867 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000868 // instructions
869 case 'W': // Vector constant that does not require memory
870 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000871 break;
872 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000873 }
John Thompson07a61a42010-06-24 22:44:13 +0000874 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000875 }
Craig Topper3164f332014-03-11 03:39:26 +0000876 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000877 std::string R;
878 switch (*Constraint) {
879 case 'e':
880 case 'w':
881 // Two-character constraint; add "^" hint for later parsing.
882 R = std::string("^") + std::string(Constraint, 2);
883 Constraint++;
884 break;
885 default:
886 return TargetInfo::convertConstraint(Constraint);
887 }
888 return R;
889 }
Craig Topper3164f332014-03-11 03:39:26 +0000890 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000891 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000892 }
Craig Topper3164f332014-03-11 03:39:26 +0000893 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000894 if (RegNo == 0) return 3;
895 if (RegNo == 1) return 4;
896 return -1;
897 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000898};
Anders Carlssonf511f642007-11-27 04:11:28 +0000899
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000900const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000901#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000902#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000903 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000904#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000905};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000906
Eric Christopher3ff21b32013-10-16 21:26:26 +0000907 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000908/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000909bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000910 DiagnosticsEngine &Diags) {
911 // Remember the maximum enabled sselevel.
912 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
913 // Ignore disabled features.
914 if (Features[i][0] == '-')
915 continue;
916
917 StringRef Feature = StringRef(Features[i]).substr(1);
918
919 if (Feature == "vsx") {
920 HasVSX = true;
921 continue;
922 }
923
924 // TODO: Finish this list and add an assert that we've handled them
925 // all.
926 }
927
928 return true;
929}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000930
Chris Lattnerecd49032009-03-02 22:27:17 +0000931/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
932/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000933void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000934 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000935 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000936 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000937 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000938 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000939 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000940 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000941 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000942 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000943 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000944 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000945 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000946 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000947
Chris Lattnerecd49032009-03-02 22:27:17 +0000948 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000949 if (getTriple().getArch() == llvm::Triple::ppc64le) {
950 Builder.defineMacro("_LITTLE_ENDIAN");
Will Schmidt22d24352014-03-24 17:27:03 +0000951 Builder.defineMacro("_CALL_ELF","2");
Bill Schmidt778d3872013-07-26 01:36:11 +0000952 } else {
953 if (getTriple().getOS() != llvm::Triple::NetBSD &&
954 getTriple().getOS() != llvm::Triple::OpenBSD)
955 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000956 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000957
Chris Lattnerecd49032009-03-02 22:27:17 +0000958 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000959 Builder.defineMacro("__NATURAL_ALIGNMENT__");
960 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000961
Chris Lattnerecd49032009-03-02 22:27:17 +0000962 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000963 if (LongDoubleWidth == 128)
964 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000965
John Thompsone467e192009-11-19 17:18:50 +0000966 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000967 Builder.defineMacro("__VEC__", "10206");
968 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000969 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000970
971 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000972 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
973 .Case("440", ArchDefineName)
974 .Case("450", ArchDefineName | ArchDefine440)
975 .Case("601", ArchDefineName)
976 .Case("602", ArchDefineName | ArchDefinePpcgr)
977 .Case("603", ArchDefineName | ArchDefinePpcgr)
978 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
979 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
980 .Case("604", ArchDefineName | ArchDefinePpcgr)
981 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
982 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +0000983 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +0000984 .Case("7400", ArchDefineName | ArchDefinePpcgr)
985 .Case("7450", ArchDefineName | ArchDefinePpcgr)
986 .Case("750", ArchDefineName | ArchDefinePpcgr)
987 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
988 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000989 .Case("a2", ArchDefineA2)
990 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +0000991 .Case("pwr3", ArchDefinePpcgr)
992 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
993 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
994 | ArchDefinePpcsq)
995 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
996 | ArchDefinePpcgr | ArchDefinePpcsq)
997 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
998 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
999 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1000 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1001 | ArchDefinePpcsq)
1002 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1003 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1004 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
1005 .Case("power3", ArchDefinePpcgr)
1006 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1007 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1008 | ArchDefinePpcsq)
1009 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1010 | ArchDefinePpcgr | ArchDefinePpcsq)
1011 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1012 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1013 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1014 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1015 | ArchDefinePpcsq)
1016 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1017 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1018 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001019 .Default(ArchDefineNone);
1020
1021 if (defs & ArchDefineName)
1022 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1023 if (defs & ArchDefinePpcgr)
1024 Builder.defineMacro("_ARCH_PPCGR");
1025 if (defs & ArchDefinePpcsq)
1026 Builder.defineMacro("_ARCH_PPCSQ");
1027 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001028 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001029 if (defs & ArchDefine603)
1030 Builder.defineMacro("_ARCH_603");
1031 if (defs & ArchDefine604)
1032 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001033 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001034 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001035 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001036 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001037 if (defs & ArchDefinePwr5x)
1038 Builder.defineMacro("_ARCH_PWR5X");
1039 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001040 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001041 if (defs & ArchDefinePwr6x)
1042 Builder.defineMacro("_ARCH_PWR6X");
1043 if (defs & ArchDefinePwr7)
1044 Builder.defineMacro("_ARCH_PWR7");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001045 if (defs & ArchDefineA2)
1046 Builder.defineMacro("_ARCH_A2");
1047 if (defs & ArchDefineA2q) {
1048 Builder.defineMacro("_ARCH_A2Q");
1049 Builder.defineMacro("_ARCH_QP");
1050 }
1051
1052 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1053 Builder.defineMacro("__bg__");
1054 Builder.defineMacro("__THW_BLUEGENE__");
1055 Builder.defineMacro("__bgq__");
1056 Builder.defineMacro("__TOS_BGQ__");
1057 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001058
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001059 if (HasVSX)
1060 Builder.defineMacro("__VSX__");
1061
Bill Schmidt38378a02013-02-01 20:23:10 +00001062 // FIXME: The following are not yet generated here by Clang, but are
1063 // generated by GCC:
1064 //
1065 // _SOFT_FLOAT_
1066 // __RECIP_PRECISION__
1067 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001068 // __RECIP__
1069 // __RECIPF__
1070 // __RSQRTE__
1071 // __RSQRTEF__
1072 // _SOFT_DOUBLE_
1073 // __NO_LWSYNC__
1074 // __HAVE_BSWAP__
1075 // __LONGDOUBLE128
1076 // __CMODEL_MEDIUM__
1077 // __CMODEL_LARGE__
1078 // _CALL_SYSV
1079 // _CALL_DARWIN
1080 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001081}
1082
1083void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1084 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1085 .Case("7400", true)
1086 .Case("g4", true)
1087 .Case("7450", true)
1088 .Case("g4+", true)
1089 .Case("970", true)
1090 .Case("g5", true)
1091 .Case("pwr6", true)
1092 .Case("pwr7", true)
1093 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001094 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001095 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001096
1097 Features["qpx"] = (CPU == "a2q");
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001098}
1099
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001100bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1101 return Feature == "powerpc";
1102}
Chris Lattner17df24e2008-04-21 18:56:49 +00001103
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001104
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001105const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001106 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1107 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1108 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1109 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1110 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1111 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1112 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1113 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001114 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001115 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001116 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001117 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1118 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1119 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1120 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001121 "vrsave", "vscr",
1122 "spe_acc", "spefscr",
1123 "sfp"
1124};
Chris Lattner10a5b382007-01-29 05:24:35 +00001125
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001126void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001127 unsigned &NumNames) const {
1128 Names = GCCRegNames;
1129 NumNames = llvm::array_lengthof(GCCRegNames);
1130}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001131
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001132const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1133 // While some of these aliases do map to different registers
1134 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001135 { { "0" }, "r0" },
1136 { { "1"}, "r1" },
1137 { { "2" }, "r2" },
1138 { { "3" }, "r3" },
1139 { { "4" }, "r4" },
1140 { { "5" }, "r5" },
1141 { { "6" }, "r6" },
1142 { { "7" }, "r7" },
1143 { { "8" }, "r8" },
1144 { { "9" }, "r9" },
1145 { { "10" }, "r10" },
1146 { { "11" }, "r11" },
1147 { { "12" }, "r12" },
1148 { { "13" }, "r13" },
1149 { { "14" }, "r14" },
1150 { { "15" }, "r15" },
1151 { { "16" }, "r16" },
1152 { { "17" }, "r17" },
1153 { { "18" }, "r18" },
1154 { { "19" }, "r19" },
1155 { { "20" }, "r20" },
1156 { { "21" }, "r21" },
1157 { { "22" }, "r22" },
1158 { { "23" }, "r23" },
1159 { { "24" }, "r24" },
1160 { { "25" }, "r25" },
1161 { { "26" }, "r26" },
1162 { { "27" }, "r27" },
1163 { { "28" }, "r28" },
1164 { { "29" }, "r29" },
1165 { { "30" }, "r30" },
1166 { { "31" }, "r31" },
1167 { { "fr0" }, "f0" },
1168 { { "fr1" }, "f1" },
1169 { { "fr2" }, "f2" },
1170 { { "fr3" }, "f3" },
1171 { { "fr4" }, "f4" },
1172 { { "fr5" }, "f5" },
1173 { { "fr6" }, "f6" },
1174 { { "fr7" }, "f7" },
1175 { { "fr8" }, "f8" },
1176 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001177 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001178 { { "fr11" }, "f11" },
1179 { { "fr12" }, "f12" },
1180 { { "fr13" }, "f13" },
1181 { { "fr14" }, "f14" },
1182 { { "fr15" }, "f15" },
1183 { { "fr16" }, "f16" },
1184 { { "fr17" }, "f17" },
1185 { { "fr18" }, "f18" },
1186 { { "fr19" }, "f19" },
1187 { { "fr20" }, "f20" },
1188 { { "fr21" }, "f21" },
1189 { { "fr22" }, "f22" },
1190 { { "fr23" }, "f23" },
1191 { { "fr24" }, "f24" },
1192 { { "fr25" }, "f25" },
1193 { { "fr26" }, "f26" },
1194 { { "fr27" }, "f27" },
1195 { { "fr28" }, "f28" },
1196 { { "fr29" }, "f29" },
1197 { { "fr30" }, "f30" },
1198 { { "fr31" }, "f31" },
1199 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001200};
1201
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001202void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001203 unsigned &NumAliases) const {
1204 Aliases = GCCRegAliases;
1205 NumAliases = llvm::array_lengthof(GCCRegAliases);
1206}
1207} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001208
Chris Lattner5ba61f02006-10-14 07:39:34 +00001209namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001210class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001211public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001212 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001213 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001214
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001215 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001216 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001217 case llvm::Triple::FreeBSD:
1218 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001219 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001220 PtrDiffType = SignedInt;
1221 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001222 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001223 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001224 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001225 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001226
Roman Divacky3ffe7462012-03-13 19:20:17 +00001227 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1228 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001229 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001230 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001231
1232 // PPC32 supports atomics up to 4 bytes.
1233 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001234 }
1235
Craig Topper3164f332014-03-11 03:39:26 +00001236 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001237 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001238 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001239 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001240};
1241} // end anonymous namespace.
1242
Bill Schmidt778d3872013-07-26 01:36:11 +00001243// Note: ABI differences may eventually require us to have a separate
1244// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001245namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001246class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001247public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001248 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001249 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001250 IntMaxType = SignedLong;
1251 UIntMaxType = UnsignedLong;
1252 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001253
Roman Divacky3ffe7462012-03-13 19:20:17 +00001254 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1255 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001256 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001257 DescriptionString = "E-m:e-i64:64-n32:64";
Will Schmidt0c67b7e2014-03-24 15:48:02 +00001258 } else {
1259 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1260 DescriptionString = "e-m:e-i64:64-n32:64";
1261 } else {
1262 DescriptionString = "E-m:e-i64:64-n32:64";
1263 }
1264}
Benjamin Kramer37196de2012-11-17 17:30:55 +00001265
1266 // PPC64 supports atomics up to 8 bytes.
1267 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001268 }
Craig Topper3164f332014-03-11 03:39:26 +00001269 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001270 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001271 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001272};
1273} // end anonymous namespace.
1274
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001275
1276namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001277class DarwinPPC32TargetInfo :
1278 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001279public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001280 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1281 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001282 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001283 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherc04fe092013-10-16 21:19:19 +00001284 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001285 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001286 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001287 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001288 }
Craig Topper3164f332014-03-11 03:39:26 +00001289 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001290 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001291 }
1292};
1293
1294class DarwinPPC64TargetInfo :
1295 public DarwinTargetInfo<PPC64TargetInfo> {
1296public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001297 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1298 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001299 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001300 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001301 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001302 }
1303};
1304} // end anonymous namespace.
1305
Chris Lattner5ba61f02006-10-14 07:39:34 +00001306namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001307 static const unsigned NVPTXAddrSpaceMap[] = {
1308 1, // opencl_global
1309 3, // opencl_local
1310 4, // opencl_constant
1311 1, // cuda_device
1312 4, // cuda_constant
1313 3, // cuda_shared
1314 };
1315 class NVPTXTargetInfo : public TargetInfo {
1316 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001317 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001318 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001319 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001320 BigEndian = false;
1321 TLSSupported = false;
1322 LongWidth = LongAlign = 64;
1323 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001324 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001325 // Define available target features
1326 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001327 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001328 }
Craig Topper3164f332014-03-11 03:39:26 +00001329 void getTargetDefines(const LangOptions &Opts,
1330 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001331 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001332 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001333 }
Craig Topper3164f332014-03-11 03:39:26 +00001334 void getTargetBuiltins(const Builtin::Info *&Records,
1335 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001336 Records = BuiltinInfo;
1337 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001338 }
Craig Topper3164f332014-03-11 03:39:26 +00001339 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001340 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001341 }
Craig Topper3164f332014-03-11 03:39:26 +00001342
1343 void getGCCRegNames(const char * const *&Names,
1344 unsigned &NumNames) const override;
1345 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1346 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001347 // No aliases.
1348 Aliases = 0;
1349 NumAliases = 0;
1350 }
Craig Topper3164f332014-03-11 03:39:26 +00001351 bool validateAsmConstraint(const char *&Name,
1352 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001353 switch (*Name) {
1354 default: return false;
1355 case 'c':
1356 case 'h':
1357 case 'r':
1358 case 'l':
1359 case 'f':
1360 case 'd':
1361 Info.setAllowsRegister();
1362 return true;
1363 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001364 }
Craig Topper3164f332014-03-11 03:39:26 +00001365 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001366 // FIXME: Is this really right?
1367 return "";
1368 }
Craig Topper3164f332014-03-11 03:39:26 +00001369 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001370 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001371 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001372 }
Craig Topper3164f332014-03-11 03:39:26 +00001373 bool setCPU(const std::string &Name) override {
Justin Holewinski91203e82013-03-30 14:38:26 +00001374 bool Valid = llvm::StringSwitch<bool>(Name)
1375 .Case("sm_20", true)
1376 .Case("sm_21", true)
1377 .Case("sm_30", true)
1378 .Case("sm_35", true)
1379 .Default(false);
1380
1381 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001382 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001383 };
1384
1385 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1386#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1387#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1388 ALL_LANGUAGES },
1389#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001390 };
1391
1392 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1393 "r0"
1394 };
1395
1396 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1397 unsigned &NumNames) const {
1398 Names = GCCRegNames;
1399 NumNames = llvm::array_lengthof(GCCRegNames);
1400 }
1401
1402 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1403 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001404 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001405 PointerWidth = PointerAlign = 32;
Justin Holewinski83e96682012-05-24 17:43:12 +00001406 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001407 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001408 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001409 };
1410
1411 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1412 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001413 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001414 PointerWidth = PointerAlign = 64;
Justin Holewinski83e96682012-05-24 17:43:12 +00001415 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001416 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001417 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001418 };
1419}
1420
1421namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001422
1423static const unsigned R600AddrSpaceMap[] = {
1424 1, // opencl_global
1425 3, // opencl_local
1426 2, // opencl_constant
1427 1, // cuda_device
1428 2, // cuda_constant
1429 3 // cuda_shared
1430};
1431
Tom Stellardc74b1e02013-03-04 17:40:53 +00001432static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001433 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1434 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001435
1436static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001437 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1438 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001439
1440static const char *DescriptionStringSI =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001441 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:32:32-p5:64:64"
1442 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1443 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001444
Eli Friedmand13b41e2012-10-12 23:32:00 +00001445class R600TargetInfo : public TargetInfo {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001446 /// \brief The GPU profiles supported by the R600 target.
1447 enum GPUKind {
1448 GK_NONE,
1449 GK_R600,
1450 GK_R600_DOUBLE_OPS,
1451 GK_R700,
1452 GK_R700_DOUBLE_OPS,
1453 GK_EVERGREEN,
1454 GK_EVERGREEN_DOUBLE_OPS,
1455 GK_NORTHERN_ISLANDS,
1456 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001457 GK_SOUTHERN_ISLANDS,
1458 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001459 } GPU;
1460
Eli Friedmand13b41e2012-10-12 23:32:00 +00001461public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001462 R600TargetInfo(const llvm::Triple &Triple)
1463 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001464 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001465 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001466 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001467 }
1468
Craig Topper3164f332014-03-11 03:39:26 +00001469 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001470 return "";
1471 }
1472
Craig Topper3164f332014-03-11 03:39:26 +00001473 void getGCCRegNames(const char * const *&Names,
1474 unsigned &numNames) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001475 Names = NULL;
1476 numNames = 0;
1477 }
1478
Craig Topper3164f332014-03-11 03:39:26 +00001479 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1480 unsigned &NumAliases) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001481 Aliases = NULL;
1482 NumAliases = 0;
1483 }
1484
Craig Topper3164f332014-03-11 03:39:26 +00001485 bool validateAsmConstraint(const char *&Name,
1486 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001487 return true;
1488 }
1489
Craig Topper3164f332014-03-11 03:39:26 +00001490 void getTargetBuiltins(const Builtin::Info *&Records,
1491 unsigned &NumRecords) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001492 Records = NULL;
1493 NumRecords = 0;
1494 }
1495
1496
Craig Topper3164f332014-03-11 03:39:26 +00001497 void getTargetDefines(const LangOptions &Opts,
1498 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001499 Builder.defineMacro("__R600__");
1500 }
1501
Craig Topper3164f332014-03-11 03:39:26 +00001502 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001503 return TargetInfo::CharPtrBuiltinVaList;
1504 }
1505
Craig Topper3164f332014-03-11 03:39:26 +00001506 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001507 GPU = llvm::StringSwitch<GPUKind>(Name)
1508 .Case("r600" , GK_R600)
1509 .Case("rv610", GK_R600)
1510 .Case("rv620", GK_R600)
1511 .Case("rv630", GK_R600)
1512 .Case("rv635", GK_R600)
1513 .Case("rs780", GK_R600)
1514 .Case("rs880", GK_R600)
1515 .Case("rv670", GK_R600_DOUBLE_OPS)
1516 .Case("rv710", GK_R700)
1517 .Case("rv730", GK_R700)
1518 .Case("rv740", GK_R700_DOUBLE_OPS)
1519 .Case("rv770", GK_R700_DOUBLE_OPS)
1520 .Case("palm", GK_EVERGREEN)
1521 .Case("cedar", GK_EVERGREEN)
1522 .Case("sumo", GK_EVERGREEN)
1523 .Case("sumo2", GK_EVERGREEN)
1524 .Case("redwood", GK_EVERGREEN)
1525 .Case("juniper", GK_EVERGREEN)
1526 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1527 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1528 .Case("barts", GK_NORTHERN_ISLANDS)
1529 .Case("turks", GK_NORTHERN_ISLANDS)
1530 .Case("caicos", GK_NORTHERN_ISLANDS)
1531 .Case("cayman", GK_CAYMAN)
1532 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001533 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001534 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1535 .Case("verde", GK_SOUTHERN_ISLANDS)
1536 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001537 .Case("bonaire", GK_SEA_ISLANDS)
1538 .Case("kabini", GK_SEA_ISLANDS)
1539 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001540 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001541 .Default(GK_NONE);
1542
1543 if (GPU == GK_NONE) {
1544 return false;
1545 }
1546
1547 // Set the correct data layout
1548 switch (GPU) {
1549 case GK_NONE:
1550 case GK_R600:
1551 case GK_R700:
1552 case GK_EVERGREEN:
1553 case GK_NORTHERN_ISLANDS:
1554 DescriptionString = DescriptionStringR600;
1555 break;
1556 case GK_R600_DOUBLE_OPS:
1557 case GK_R700_DOUBLE_OPS:
1558 case GK_EVERGREEN_DOUBLE_OPS:
1559 case GK_CAYMAN:
1560 DescriptionString = DescriptionStringR600DoubleOps;
1561 break;
1562 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001563 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001564 DescriptionString = DescriptionStringSI;
1565 break;
1566 }
1567
1568 return true;
1569 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001570};
1571
1572} // end anonymous namespace
1573
1574namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001575// Namespace for x86 abstract base class
1576const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001577#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001578#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001579 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001580#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001581};
Eli Friedmanb5366062008-05-20 14:21:01 +00001582
Nuno Lopescfca1f02009-12-23 17:49:57 +00001583static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001584 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1585 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001586 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001587 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1588 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1589 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001590 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001591 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1592 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001593};
1594
Eric Christophercdd36352011-06-21 00:05:20 +00001595const TargetInfo::AddlRegName AddlRegNames[] = {
1596 { { "al", "ah", "eax", "rax" }, 0 },
1597 { { "bl", "bh", "ebx", "rbx" }, 3 },
1598 { { "cl", "ch", "ecx", "rcx" }, 2 },
1599 { { "dl", "dh", "edx", "rdx" }, 1 },
1600 { { "esi", "rsi" }, 4 },
1601 { { "edi", "rdi" }, 5 },
1602 { { "esp", "rsp" }, 7 },
1603 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001604};
1605
1606// X86 target abstract base class; x86-32 and x86-64 are very close, so
1607// most of the implementation can be shared.
1608class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001609 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001610 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001611 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001612 enum MMX3DNowEnum {
1613 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1614 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001615 enum XOPEnum {
1616 NoXOP,
1617 SSE4A,
1618 FMA4,
1619 XOP
1620 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001621
Eric Christophere1ddaf92010-04-02 23:50:19 +00001622 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001623 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001624 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001625 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001626 bool HasBMI;
1627 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001628 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001629 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001630 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001631 bool HasRDSEED;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001632 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001633 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001634 bool HasF16C;
Craig Topper679b53a2013-08-21 05:29:10 +00001635 bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
Ben Langmuir58078d02013-09-19 13:22:04 +00001636 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001637 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001638
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001639 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1640 ///
1641 /// Each enumeration represents a particular CPU supported by Clang. These
1642 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1643 enum CPUKind {
1644 CK_Generic,
1645
1646 /// \name i386
1647 /// i386-generation processors.
1648 //@{
1649 CK_i386,
1650 //@}
1651
1652 /// \name i486
1653 /// i486-generation processors.
1654 //@{
1655 CK_i486,
1656 CK_WinChipC6,
1657 CK_WinChip2,
1658 CK_C3,
1659 //@}
1660
1661 /// \name i586
1662 /// i586-generation processors, P5 microarchitecture based.
1663 //@{
1664 CK_i586,
1665 CK_Pentium,
1666 CK_PentiumMMX,
1667 //@}
1668
1669 /// \name i686
1670 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1671 //@{
1672 CK_i686,
1673 CK_PentiumPro,
1674 CK_Pentium2,
1675 CK_Pentium3,
1676 CK_Pentium3M,
1677 CK_PentiumM,
1678 CK_C3_2,
1679
1680 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1681 /// Clang however has some logic to suport this.
1682 // FIXME: Warn, deprecate, and potentially remove this.
1683 CK_Yonah,
1684 //@}
1685
1686 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001687 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001688 //@{
1689 CK_Pentium4,
1690 CK_Pentium4M,
1691 CK_Prescott,
1692 CK_Nocona,
1693 //@}
1694
1695 /// \name Core
1696 /// Core microarchitecture based processors.
1697 //@{
1698 CK_Core2,
1699
1700 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1701 /// codename which GCC no longer accepts as an option to -march, but Clang
1702 /// has some logic for recognizing it.
1703 // FIXME: Warn, deprecate, and potentially remove this.
1704 CK_Penryn,
1705 //@}
1706
1707 /// \name Atom
1708 /// Atom processors
1709 //@{
1710 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001711 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001712 //@}
1713
1714 /// \name Nehalem
1715 /// Nehalem microarchitecture based processors.
1716 //@{
1717 CK_Corei7,
1718 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001719 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001720 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001721 //@}
1722
Craig Topper449314e2013-08-20 07:09:39 +00001723 /// \name Knights Landing
1724 /// Knights Landing processor.
1725 CK_KNL,
1726
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001727 /// \name K6
1728 /// K6 architecture processors.
1729 //@{
1730 CK_K6,
1731 CK_K6_2,
1732 CK_K6_3,
1733 //@}
1734
1735 /// \name K7
1736 /// K7 architecture processors.
1737 //@{
1738 CK_Athlon,
1739 CK_AthlonThunderbird,
1740 CK_Athlon4,
1741 CK_AthlonXP,
1742 CK_AthlonMP,
1743 //@}
1744
1745 /// \name K8
1746 /// K8 architecture processors.
1747 //@{
1748 CK_Athlon64,
1749 CK_Athlon64SSE3,
1750 CK_AthlonFX,
1751 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001752 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001753 CK_Opteron,
1754 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001755 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001756 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001757
Benjamin Kramer569f2152012-01-10 11:50:18 +00001758 /// \name Bobcat
1759 /// Bobcat architecture processors.
1760 //@{
1761 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001762 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001763 //@}
1764
1765 /// \name Bulldozer
1766 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001767 //@{
1768 CK_BDVER1,
1769 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001770 CK_BDVER3,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001771 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001772
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001773 /// This specification is deprecated and will be removed in the future.
1774 /// Users should prefer \see CK_K8.
1775 // FIXME: Warn on this when the CPU is set to it.
1776 CK_x86_64,
1777 //@}
1778
1779 /// \name Geode
1780 /// Geode processors.
1781 //@{
1782 CK_Geode
1783 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001784 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001785
Rafael Espindolaeb265472013-08-21 21:59:03 +00001786 enum FPMathKind {
1787 FP_Default,
1788 FP_SSE,
1789 FP_387
1790 } FPMath;
1791
Eli Friedman3fd920a2008-08-20 02:34:37 +00001792public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001793 X86TargetInfo(const llvm::Triple &Triple)
1794 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001795 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1796 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001797 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1798 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001799 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1800 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001801 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001802 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001803 }
Craig Topper3164f332014-03-11 03:39:26 +00001804 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001805 // X87 evaluates with 80 bits "long double" precision.
1806 return SSELevel == NoSSE ? 2 : 0;
1807 }
Craig Topper3164f332014-03-11 03:39:26 +00001808 void getTargetBuiltins(const Builtin::Info *&Records,
1809 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001810 Records = BuiltinInfo;
1811 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001812 }
Craig Topper3164f332014-03-11 03:39:26 +00001813 void getGCCRegNames(const char * const *&Names,
1814 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001815 Names = GCCRegNames;
1816 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001817 }
Craig Topper3164f332014-03-11 03:39:26 +00001818 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1819 unsigned &NumAliases) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001820 Aliases = 0;
1821 NumAliases = 0;
1822 }
Craig Topper3164f332014-03-11 03:39:26 +00001823 void getGCCAddlRegNames(const AddlRegName *&Names,
1824 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001825 Names = AddlRegNames;
1826 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001827 }
Craig Topper3164f332014-03-11 03:39:26 +00001828 bool validateAsmConstraint(const char *&Name,
1829 TargetInfo::ConstraintInfo &info) const override;
1830 std::string convertConstraint(const char *&Constraint) const override;
1831 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001832 return "~{dirflag},~{fpsr},~{flags}";
1833 }
Craig Topper3164f332014-03-11 03:39:26 +00001834 void getTargetDefines(const LangOptions &Opts,
1835 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001836 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1837 bool Enabled);
1838 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1839 bool Enabled);
1840 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1841 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001842 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1843 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00001844 setFeatureEnabledImpl(Features, Name, Enabled);
1845 }
1846 // This exists purely to cut down on the number of virtual calls in
1847 // getDefaultFeatures which calls this repeatedly.
1848 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1849 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001850 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1851 bool hasFeature(StringRef Feature) const override;
1852 bool handleTargetFeatures(std::vector<std::string> &Features,
1853 DiagnosticsEngine &Diags) override;
1854 const char* getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001855 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001856 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001857 else if (getTriple().getArch() == llvm::Triple::x86 &&
1858 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001859 return "no-mmx";
1860 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001861 }
Craig Topper3164f332014-03-11 03:39:26 +00001862 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00001863 CPU = llvm::StringSwitch<CPUKind>(Name)
1864 .Case("i386", CK_i386)
1865 .Case("i486", CK_i486)
1866 .Case("winchip-c6", CK_WinChipC6)
1867 .Case("winchip2", CK_WinChip2)
1868 .Case("c3", CK_C3)
1869 .Case("i586", CK_i586)
1870 .Case("pentium", CK_Pentium)
1871 .Case("pentium-mmx", CK_PentiumMMX)
1872 .Case("i686", CK_i686)
1873 .Case("pentiumpro", CK_PentiumPro)
1874 .Case("pentium2", CK_Pentium2)
1875 .Case("pentium3", CK_Pentium3)
1876 .Case("pentium3m", CK_Pentium3M)
1877 .Case("pentium-m", CK_PentiumM)
1878 .Case("c3-2", CK_C3_2)
1879 .Case("yonah", CK_Yonah)
1880 .Case("pentium4", CK_Pentium4)
1881 .Case("pentium4m", CK_Pentium4M)
1882 .Case("prescott", CK_Prescott)
1883 .Case("nocona", CK_Nocona)
1884 .Case("core2", CK_Core2)
1885 .Case("penryn", CK_Penryn)
1886 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001887 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001888 .Case("corei7", CK_Corei7)
1889 .Case("corei7-avx", CK_Corei7AVX)
1890 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001891 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001892 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00001893 .Case("k6", CK_K6)
1894 .Case("k6-2", CK_K6_2)
1895 .Case("k6-3", CK_K6_3)
1896 .Case("athlon", CK_Athlon)
1897 .Case("athlon-tbird", CK_AthlonThunderbird)
1898 .Case("athlon-4", CK_Athlon4)
1899 .Case("athlon-xp", CK_AthlonXP)
1900 .Case("athlon-mp", CK_AthlonMP)
1901 .Case("athlon64", CK_Athlon64)
1902 .Case("athlon64-sse3", CK_Athlon64SSE3)
1903 .Case("athlon-fx", CK_AthlonFX)
1904 .Case("k8", CK_K8)
1905 .Case("k8-sse3", CK_K8SSE3)
1906 .Case("opteron", CK_Opteron)
1907 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001908 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001909 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001910 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001911 .Case("bdver1", CK_BDVER1)
1912 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001913 .Case("bdver3", CK_BDVER3)
Chandler Carruth212334f2011-09-28 08:55:37 +00001914 .Case("x86-64", CK_x86_64)
1915 .Case("geode", CK_Geode)
1916 .Default(CK_Generic);
1917
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001918 // Perform any per-CPU checks necessary to determine if this CPU is
1919 // acceptable.
1920 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1921 // invalid without explaining *why*.
1922 switch (CPU) {
1923 case CK_Generic:
1924 // No processor selected!
1925 return false;
1926
1927 case CK_i386:
1928 case CK_i486:
1929 case CK_WinChipC6:
1930 case CK_WinChip2:
1931 case CK_C3:
1932 case CK_i586:
1933 case CK_Pentium:
1934 case CK_PentiumMMX:
1935 case CK_i686:
1936 case CK_PentiumPro:
1937 case CK_Pentium2:
1938 case CK_Pentium3:
1939 case CK_Pentium3M:
1940 case CK_PentiumM:
1941 case CK_Yonah:
1942 case CK_C3_2:
1943 case CK_Pentium4:
1944 case CK_Pentium4M:
1945 case CK_Prescott:
1946 case CK_K6:
1947 case CK_K6_2:
1948 case CK_K6_3:
1949 case CK_Athlon:
1950 case CK_AthlonThunderbird:
1951 case CK_Athlon4:
1952 case CK_AthlonXP:
1953 case CK_AthlonMP:
1954 case CK_Geode:
1955 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00001956 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001957 return false;
1958
1959 // Fallthrough
1960 case CK_Nocona:
1961 case CK_Core2:
1962 case CK_Penryn:
1963 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00001964 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001965 case CK_Corei7:
1966 case CK_Corei7AVX:
1967 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00001968 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00001969 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001970 case CK_Athlon64:
1971 case CK_Athlon64SSE3:
1972 case CK_AthlonFX:
1973 case CK_K8:
1974 case CK_K8SSE3:
1975 case CK_Opteron:
1976 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00001977 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00001978 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001979 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001980 case CK_BDVER1:
1981 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001982 case CK_BDVER3:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001983 case CK_x86_64:
1984 return true;
1985 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00001986 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001987 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001988
Craig Topper3164f332014-03-11 03:39:26 +00001989 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00001990
Craig Topper3164f332014-03-11 03:39:26 +00001991 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001992 // We accept all non-ARM calling conventions
1993 return (CC == CC_X86ThisCall ||
1994 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00001995 CC == CC_X86StdCall ||
1996 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00001997 CC == CC_X86Pascal ||
1998 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001999 }
2000
Craig Topper3164f332014-03-11 03:39:26 +00002001 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002002 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002003 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002004};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002005
Rafael Espindolaeb265472013-08-21 21:59:03 +00002006bool X86TargetInfo::setFPMath(StringRef Name) {
2007 if (Name == "387") {
2008 FPMath = FP_387;
2009 return true;
2010 }
2011 if (Name == "sse") {
2012 FPMath = FP_SSE;
2013 return true;
2014 }
2015 return false;
2016}
2017
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002018void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002019 // FIXME: This *really* should not be here.
2020
2021 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002022 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002023 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002024
Chandler Carruth212334f2011-09-28 08:55:37 +00002025 switch (CPU) {
2026 case CK_Generic:
2027 case CK_i386:
2028 case CK_i486:
2029 case CK_i586:
2030 case CK_Pentium:
2031 case CK_i686:
2032 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002033 break;
2034 case CK_PentiumMMX:
2035 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002036 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002037 break;
2038 case CK_Pentium3:
2039 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002040 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002041 break;
2042 case CK_PentiumM:
2043 case CK_Pentium4:
2044 case CK_Pentium4M:
2045 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002046 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002047 break;
2048 case CK_Yonah:
2049 case CK_Prescott:
2050 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002051 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002052 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002053 break;
2054 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002055 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002056 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002057 break;
2058 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002059 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002060 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002061 break;
2062 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002063 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002064 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002065 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002066 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002067 setFeatureEnabledImpl(Features, "sse4.2", true);
2068 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002069 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002070 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002071 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002072 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002073 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002074 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002075 break;
2076 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002077 setFeatureEnabledImpl(Features, "avx", true);
2078 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002079 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002080 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002081 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002082 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002083 setFeatureEnabledImpl(Features, "avx", true);
2084 setFeatureEnabledImpl(Features, "aes", true);
2085 setFeatureEnabledImpl(Features, "pclmul", true);
2086 setFeatureEnabledImpl(Features, "rdrnd", true);
2087 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002088 break;
Craig Topper865fff52011-12-17 19:55:21 +00002089 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002090 setFeatureEnabledImpl(Features, "avx2", true);
2091 setFeatureEnabledImpl(Features, "aes", true);
2092 setFeatureEnabledImpl(Features, "pclmul", true);
2093 setFeatureEnabledImpl(Features, "lzcnt", true);
2094 setFeatureEnabledImpl(Features, "rdrnd", true);
2095 setFeatureEnabledImpl(Features, "f16c", true);
2096 setFeatureEnabledImpl(Features, "bmi", true);
2097 setFeatureEnabledImpl(Features, "bmi2", true);
2098 setFeatureEnabledImpl(Features, "rtm", true);
2099 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002100 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002101 break;
Craig Topper449314e2013-08-20 07:09:39 +00002102 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002103 setFeatureEnabledImpl(Features, "avx512f", true);
2104 setFeatureEnabledImpl(Features, "avx512cd", true);
2105 setFeatureEnabledImpl(Features, "avx512er", true);
2106 setFeatureEnabledImpl(Features, "avx512pf", true);
2107 setFeatureEnabledImpl(Features, "aes", true);
2108 setFeatureEnabledImpl(Features, "pclmul", true);
2109 setFeatureEnabledImpl(Features, "lzcnt", true);
2110 setFeatureEnabledImpl(Features, "rdrnd", true);
2111 setFeatureEnabledImpl(Features, "f16c", true);
2112 setFeatureEnabledImpl(Features, "bmi", true);
2113 setFeatureEnabledImpl(Features, "bmi2", true);
2114 setFeatureEnabledImpl(Features, "rtm", true);
2115 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002116 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002117 case CK_K6:
2118 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002119 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002120 break;
2121 case CK_K6_2:
2122 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002123 case CK_WinChip2:
2124 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002125 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002126 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002127 case CK_Athlon:
2128 case CK_AthlonThunderbird:
2129 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002130 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002131 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002132 case CK_Athlon4:
2133 case CK_AthlonXP:
2134 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002135 setFeatureEnabledImpl(Features, "sse", true);
2136 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002137 break;
2138 case CK_K8:
2139 case CK_Opteron:
2140 case CK_Athlon64:
2141 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002142 setFeatureEnabledImpl(Features, "sse2", true);
2143 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002144 break;
2145 case CK_K8SSE3:
2146 case CK_OpteronSSE3:
2147 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002148 setFeatureEnabledImpl(Features, "sse3", true);
2149 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002150 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002151 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002152 setFeatureEnabledImpl(Features, "sse3", true);
2153 setFeatureEnabledImpl(Features, "sse4a", true);
2154 setFeatureEnabledImpl(Features, "3dnowa", true);
2155 setFeatureEnabledImpl(Features, "lzcnt", true);
2156 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002157 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002158 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002159 setFeatureEnabledImpl(Features, "ssse3", true);
2160 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002161 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002162 setFeatureEnabledImpl(Features, "lzcnt", true);
2163 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002164 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002165 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002166 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002167 setFeatureEnabledImpl(Features, "avx", true);
2168 setFeatureEnabledImpl(Features, "sse4a", true);
2169 setFeatureEnabledImpl(Features, "lzcnt", true);
2170 setFeatureEnabledImpl(Features, "aes", true);
2171 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002172 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002173 setFeatureEnabledImpl(Features, "bmi", true);
2174 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002175 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002176 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002177 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002178 setFeatureEnabledImpl(Features, "xop", true);
2179 setFeatureEnabledImpl(Features, "lzcnt", true);
2180 setFeatureEnabledImpl(Features, "aes", true);
2181 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002182 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002183 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002184 break;
Eli Friedman3e94f572012-11-17 01:43:10 +00002185 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002186 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002187 setFeatureEnabledImpl(Features, "xop", true);
2188 setFeatureEnabledImpl(Features, "lzcnt", true);
2189 setFeatureEnabledImpl(Features, "aes", true);
2190 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002191 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002192 setFeatureEnabledImpl(Features, "bmi", true);
2193 setFeatureEnabledImpl(Features, "fma", true);
2194 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002195 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002196 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002197 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002198 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002199 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002200 break;
Eli Friedman33465822011-07-08 23:31:17 +00002201 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002202}
2203
Rafael Espindolae62e2792013-08-20 13:44:29 +00002204void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002205 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002206 if (Enabled) {
2207 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002208 case AVX512F:
2209 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002210 case AVX2:
2211 Features["avx2"] = true;
2212 case AVX:
2213 Features["avx"] = true;
2214 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002215 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002216 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002217 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002218 case SSSE3:
2219 Features["ssse3"] = true;
2220 case SSE3:
2221 Features["sse3"] = true;
2222 case SSE2:
2223 Features["sse2"] = true;
2224 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002225 Features["sse"] = true;
2226 case NoSSE:
2227 break;
2228 }
2229 return;
2230 }
2231
2232 switch (Level) {
2233 case NoSSE:
2234 case SSE1:
2235 Features["sse"] = false;
2236 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002237 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2238 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002239 case SSE3:
2240 Features["sse3"] = false;
2241 setXOPLevel(Features, NoXOP, false);
2242 case SSSE3:
2243 Features["ssse3"] = false;
2244 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002245 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002246 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002247 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002248 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002249 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002250 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002251 case AVX2:
2252 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002253 case AVX512F:
Craig Topper679b53a2013-08-21 05:29:10 +00002254 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2255 Features["avx512pf"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002256 }
2257}
2258
2259void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002260 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002261 if (Enabled) {
2262 switch (Level) {
2263 case AMD3DNowAthlon:
2264 Features["3dnowa"] = true;
2265 case AMD3DNow:
2266 Features["3dnow"] = true;
2267 case MMX:
2268 Features["mmx"] = true;
2269 case NoMMX3DNow:
2270 break;
2271 }
2272 return;
2273 }
2274
2275 switch (Level) {
2276 case NoMMX3DNow:
2277 case MMX:
2278 Features["mmx"] = false;
2279 case AMD3DNow:
2280 Features["3dnow"] = false;
2281 case AMD3DNowAthlon:
2282 Features["3dnowa"] = false;
2283 }
2284}
2285
2286void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002287 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002288 if (Enabled) {
2289 switch (Level) {
2290 case XOP:
2291 Features["xop"] = true;
2292 case FMA4:
2293 Features["fma4"] = true;
2294 setSSELevel(Features, AVX, true);
2295 case SSE4A:
2296 Features["sse4a"] = true;
2297 setSSELevel(Features, SSE3, true);
2298 case NoXOP:
2299 break;
2300 }
2301 return;
2302 }
2303
2304 switch (Level) {
2305 case NoXOP:
2306 case SSE4A:
2307 Features["sse4a"] = false;
2308 case FMA4:
2309 Features["fma4"] = false;
2310 case XOP:
2311 Features["xop"] = false;
2312 }
2313}
2314
Craig Topper86d79ef2013-09-17 04:51:29 +00002315void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2316 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002317 // FIXME: This *really* should not be here. We need some way of translating
2318 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002319 if (Name == "sse4")
2320 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002321
Rafael Espindolae62e2792013-08-20 13:44:29 +00002322 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002323
Craig Topper29561122013-09-19 01:13:07 +00002324 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002325 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002326 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002327 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002328 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002329 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002330 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002331 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002332 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002333 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002334 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002335 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002336 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002337 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002338 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002339 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002340 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002341 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002342 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002343 if (Enabled)
2344 setSSELevel(Features, SSE2, Enabled);
2345 } else if (Name == "pclmul") {
2346 if (Enabled)
2347 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002348 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002349 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002350 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002351 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002352 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002353 setSSELevel(Features, AVX512F, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002354 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002355 if (Enabled)
2356 setSSELevel(Features, AVX512F, Enabled);
2357 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002358 if (Enabled)
2359 setSSELevel(Features, AVX, Enabled);
2360 } else if (Name == "fma4") {
2361 setXOPLevel(Features, FMA4, Enabled);
2362 } else if (Name == "xop") {
2363 setXOPLevel(Features, XOP, Enabled);
2364 } else if (Name == "sse4a") {
2365 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002366 } else if (Name == "f16c") {
2367 if (Enabled)
2368 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002369 } else if (Name == "sha") {
2370 if (Enabled)
2371 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002372 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002373}
2374
Eric Christopher3ff21b32013-10-16 21:26:26 +00002375/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002376/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002377bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002378 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002379 // Remember the maximum enabled sselevel.
2380 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2381 // Ignore disabled features.
2382 if (Features[i][0] == '-')
2383 continue;
2384
Benjamin Kramer27402c62012-03-05 15:10:44 +00002385 StringRef Feature = StringRef(Features[i]).substr(1);
2386
2387 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002388 HasAES = true;
2389 continue;
2390 }
2391
Craig Topper3f122a72012-05-31 05:18:48 +00002392 if (Feature == "pclmul") {
2393 HasPCLMUL = true;
2394 continue;
2395 }
2396
Benjamin Kramer27402c62012-03-05 15:10:44 +00002397 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002398 HasLZCNT = true;
2399 continue;
2400 }
2401
Rafael Espindola89049822013-08-23 20:21:37 +00002402 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002403 HasRDRND = true;
2404 continue;
2405 }
2406
Benjamin Kramer27402c62012-03-05 15:10:44 +00002407 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002408 HasBMI = true;
2409 continue;
2410 }
2411
Benjamin Kramer27402c62012-03-05 15:10:44 +00002412 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002413 HasBMI2 = true;
2414 continue;
2415 }
2416
Benjamin Kramer27402c62012-03-05 15:10:44 +00002417 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002418 HasPOPCNT = true;
2419 continue;
2420 }
2421
Michael Liao625a8752012-11-10 05:17:46 +00002422 if (Feature == "rtm") {
2423 HasRTM = true;
2424 continue;
2425 }
2426
Michael Liao74f4eaf2013-03-26 17:52:08 +00002427 if (Feature == "prfchw") {
2428 HasPRFCHW = true;
2429 continue;
2430 }
2431
Michael Liaoffaae352013-03-29 05:17:55 +00002432 if (Feature == "rdseed") {
2433 HasRDSEED = true;
2434 continue;
2435 }
2436
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002437 if (Feature == "tbm") {
2438 HasTBM = true;
2439 continue;
2440 }
2441
Craig Topperbba778b2012-06-03 21:46:30 +00002442 if (Feature == "fma") {
2443 HasFMA = true;
2444 continue;
2445 }
2446
Manman Rena45358c2012-10-11 00:59:55 +00002447 if (Feature == "f16c") {
2448 HasF16C = true;
2449 continue;
2450 }
2451
Craig Topper679b53a2013-08-21 05:29:10 +00002452 if (Feature == "avx512cd") {
2453 HasAVX512CD = true;
2454 continue;
2455 }
2456
2457 if (Feature == "avx512er") {
2458 HasAVX512ER = true;
2459 continue;
2460 }
2461
2462 if (Feature == "avx512pf") {
2463 HasAVX512PF = true;
2464 continue;
2465 }
2466
Ben Langmuir58078d02013-09-19 13:22:04 +00002467 if (Feature == "sha") {
2468 HasSHA = true;
2469 continue;
2470 }
2471
Nick Lewycky50e8f482013-10-05 20:14:27 +00002472 if (Feature == "cx16") {
2473 HasCX16 = true;
2474 continue;
2475 }
2476
Daniel Dunbar979586e2009-11-11 09:38:56 +00002477 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002478 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002479 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002480 .Case("avx2", AVX2)
2481 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002482 .Case("sse4.2", SSE42)
2483 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002484 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002485 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002486 .Case("sse2", SSE2)
2487 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002488 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002489 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002490
Eli Friedman33465822011-07-08 23:31:17 +00002491 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002492 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002493 .Case("3dnowa", AMD3DNowAthlon)
2494 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002495 .Case("mmx", MMX)
2496 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002497 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002498
2499 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2500 .Case("xop", XOP)
2501 .Case("fma4", FMA4)
2502 .Case("sse4a", SSE4A)
2503 .Default(NoXOP);
2504 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002505 }
Eli Friedman33465822011-07-08 23:31:17 +00002506
Craig Topper7481d8a2013-09-10 06:55:47 +00002507 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2508 // Can't do this earlier because we need to be able to explicitly enable
2509 // popcnt and still disable sse4.2.
2510 if (!HasPOPCNT && SSELevel >= SSE42 &&
2511 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2512 HasPOPCNT = true;
2513 Features.push_back("+popcnt");
2514 }
2515
Yunzhong Gao61089362013-10-16 19:07:02 +00002516 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2517 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2518 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2519 HasPRFCHW = true;
2520 Features.push_back("+prfchw");
2521 }
2522
Rafael Espindolaeb265472013-08-21 21:59:03 +00002523 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2524 // matches the selected sse level.
2525 if (FPMath == FP_SSE && SSELevel < SSE1) {
2526 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2527 return false;
2528 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2529 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2530 return false;
2531 }
2532
Eli Friedman33465822011-07-08 23:31:17 +00002533 // Don't tell the backend if we're turning off mmx; it will end up disabling
2534 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002535 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2536 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002537 std::vector<std::string>::iterator it;
2538 it = std::find(Features.begin(), Features.end(), "-mmx");
2539 if (it != Features.end())
2540 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002541 else if (SSELevel > NoSSE)
2542 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002543 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002544}
Chris Lattnerecd49032009-03-02 22:27:17 +00002545
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002546/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2547/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002548void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002549 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002550 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002551 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002552 Builder.defineMacro("__amd64__");
2553 Builder.defineMacro("__amd64");
2554 Builder.defineMacro("__x86_64");
2555 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002556 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002557 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002558 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002559
Chris Lattnerecd49032009-03-02 22:27:17 +00002560 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002561 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2562 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002563 switch (CPU) {
2564 case CK_Generic:
2565 break;
2566 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002567 // The rest are coming from the i386 define above.
2568 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002569 break;
2570 case CK_i486:
2571 case CK_WinChipC6:
2572 case CK_WinChip2:
2573 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002574 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002575 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002576 case CK_PentiumMMX:
2577 Builder.defineMacro("__pentium_mmx__");
2578 Builder.defineMacro("__tune_pentium_mmx__");
2579 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002580 case CK_i586:
2581 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002582 defineCPUMacros(Builder, "i586");
2583 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002584 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002585 case CK_Pentium3:
2586 case CK_Pentium3M:
2587 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002588 Builder.defineMacro("__tune_pentium3__");
2589 // Fallthrough
2590 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002591 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002592 Builder.defineMacro("__tune_pentium2__");
2593 // Fallthrough
2594 case CK_PentiumPro:
2595 Builder.defineMacro("__tune_i686__");
2596 Builder.defineMacro("__tune_pentiumpro__");
2597 // Fallthrough
2598 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002599 Builder.defineMacro("__i686");
2600 Builder.defineMacro("__i686__");
2601 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2602 Builder.defineMacro("__pentiumpro");
2603 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002604 break;
2605 case CK_Pentium4:
2606 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002607 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002608 break;
2609 case CK_Yonah:
2610 case CK_Prescott:
2611 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002612 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002613 break;
2614 case CK_Core2:
2615 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002616 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002617 break;
2618 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002619 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002620 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002621 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002622 defineCPUMacros(Builder, "slm");
2623 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002624 case CK_Corei7:
2625 case CK_Corei7AVX:
2626 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002627 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002628 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002629 break;
Craig Topper449314e2013-08-20 07:09:39 +00002630 case CK_KNL:
2631 defineCPUMacros(Builder, "knl");
2632 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002633 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002634 Builder.defineMacro("__k6_2__");
2635 Builder.defineMacro("__tune_k6_2__");
2636 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002637 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002638 if (CPU != CK_K6_2) { // In case of fallthrough
2639 // FIXME: GCC may be enabling these in cases where some other k6
2640 // architecture is specified but -m3dnow is explicitly provided. The
2641 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002642 Builder.defineMacro("__k6_3__");
2643 Builder.defineMacro("__tune_k6_3__");
2644 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002645 // Fallthrough
2646 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002647 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002648 break;
2649 case CK_Athlon:
2650 case CK_AthlonThunderbird:
2651 case CK_Athlon4:
2652 case CK_AthlonXP:
2653 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002654 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002655 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002656 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002657 Builder.defineMacro("__tune_athlon_sse__");
2658 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002659 break;
2660 case CK_K8:
2661 case CK_K8SSE3:
2662 case CK_x86_64:
2663 case CK_Opteron:
2664 case CK_OpteronSSE3:
2665 case CK_Athlon64:
2666 case CK_Athlon64SSE3:
2667 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002668 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002669 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002670 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002671 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002672 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002673 case CK_BTVER1:
2674 defineCPUMacros(Builder, "btver1");
2675 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002676 case CK_BTVER2:
2677 defineCPUMacros(Builder, "btver2");
2678 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002679 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002680 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002681 break;
2682 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002683 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002684 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002685 case CK_BDVER3:
2686 defineCPUMacros(Builder, "bdver3");
2687 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002688 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002689 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002690 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002691 }
Chris Lattner96e43572009-03-02 22:40:39 +00002692
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002693 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002694 Builder.defineMacro("__REGISTER_PREFIX__", "");
2695
Chris Lattner6df41af2009-04-19 17:32:33 +00002696 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2697 // functions in glibc header files that use FP Stack inline asm which the
2698 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002699 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002700
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002701 if (HasAES)
2702 Builder.defineMacro("__AES__");
2703
Craig Topper3f122a72012-05-31 05:18:48 +00002704 if (HasPCLMUL)
2705 Builder.defineMacro("__PCLMUL__");
2706
Craig Topper22967d42011-12-25 05:06:45 +00002707 if (HasLZCNT)
2708 Builder.defineMacro("__LZCNT__");
2709
Benjamin Kramer1e250392012-07-07 09:39:18 +00002710 if (HasRDRND)
2711 Builder.defineMacro("__RDRND__");
2712
Craig Topper22967d42011-12-25 05:06:45 +00002713 if (HasBMI)
2714 Builder.defineMacro("__BMI__");
2715
2716 if (HasBMI2)
2717 Builder.defineMacro("__BMI2__");
2718
Craig Topper1de83482011-12-29 16:10:46 +00002719 if (HasPOPCNT)
2720 Builder.defineMacro("__POPCNT__");
2721
Michael Liao625a8752012-11-10 05:17:46 +00002722 if (HasRTM)
2723 Builder.defineMacro("__RTM__");
2724
Michael Liao74f4eaf2013-03-26 17:52:08 +00002725 if (HasPRFCHW)
2726 Builder.defineMacro("__PRFCHW__");
2727
Michael Liaoffaae352013-03-29 05:17:55 +00002728 if (HasRDSEED)
2729 Builder.defineMacro("__RDSEED__");
2730
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002731 if (HasTBM)
2732 Builder.defineMacro("__TBM__");
2733
Rafael Espindolae62e2792013-08-20 13:44:29 +00002734 switch (XOPLevel) {
2735 case XOP:
2736 Builder.defineMacro("__XOP__");
2737 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002738 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002739 case SSE4A:
2740 Builder.defineMacro("__SSE4A__");
2741 case NoXOP:
2742 break;
2743 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002744
Craig Topperbba778b2012-06-03 21:46:30 +00002745 if (HasFMA)
2746 Builder.defineMacro("__FMA__");
2747
Manman Rena45358c2012-10-11 00:59:55 +00002748 if (HasF16C)
2749 Builder.defineMacro("__F16C__");
2750
Craig Topper679b53a2013-08-21 05:29:10 +00002751 if (HasAVX512CD)
2752 Builder.defineMacro("__AVX512CD__");
2753 if (HasAVX512ER)
2754 Builder.defineMacro("__AVX512ER__");
2755 if (HasAVX512PF)
2756 Builder.defineMacro("__AVX512PF__");
2757
Ben Langmuir58078d02013-09-19 13:22:04 +00002758 if (HasSHA)
2759 Builder.defineMacro("__SHA__");
2760
Nick Lewycky50e8f482013-10-05 20:14:27 +00002761 if (HasCX16)
2762 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2763
Chris Lattner96e43572009-03-02 22:40:39 +00002764 // Each case falls through to the previous one here.
2765 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002766 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002767 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002768 case AVX2:
2769 Builder.defineMacro("__AVX2__");
2770 case AVX:
2771 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002772 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002773 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002774 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002775 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002776 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002777 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002778 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002779 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002780 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002781 Builder.defineMacro("__SSE2__");
2782 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002783 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002784 Builder.defineMacro("__SSE__");
2785 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002786 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002787 break;
2788 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002789
Derek Schuffc7dd7222012-10-11 15:52:22 +00002790 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002791 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002792 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002793 case AVX2:
2794 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002795 case SSE42:
2796 case SSE41:
2797 case SSSE3:
2798 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002799 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002800 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002801 break;
2802 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002803 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002804 break;
2805 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002806 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002807 }
2808 }
2809
Anders Carlssone437c682010-01-27 03:47:49 +00002810 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002811 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002812 case AMD3DNowAthlon:
2813 Builder.defineMacro("__3dNOW_A__");
2814 case AMD3DNow:
2815 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002816 case MMX:
2817 Builder.defineMacro("__MMX__");
2818 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002819 break;
2820 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002821
2822 if (CPU >= CK_i486) {
2823 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2824 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2825 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2826 }
2827 if (CPU >= CK_i586)
2828 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002829}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002830
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002831bool X86TargetInfo::hasFeature(StringRef Feature) const {
2832 return llvm::StringSwitch<bool>(Feature)
2833 .Case("aes", HasAES)
2834 .Case("avx", SSELevel >= AVX)
2835 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002836 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002837 .Case("avx512cd", HasAVX512CD)
2838 .Case("avx512er", HasAVX512ER)
2839 .Case("avx512pf", HasAVX512PF)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002840 .Case("bmi", HasBMI)
2841 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002842 .Case("cx16", HasCX16)
2843 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002844 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002845 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002846 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002847 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002848 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002849 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2850 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2851 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002852 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002853 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002854 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002855 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002856 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002857 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002858 .Case("sse", SSELevel >= SSE1)
2859 .Case("sse2", SSELevel >= SSE2)
2860 .Case("sse3", SSELevel >= SSE3)
2861 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002862 .Case("sse4.1", SSELevel >= SSE41)
2863 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002864 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002865 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002866 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2867 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002868 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002869 .Default(false);
2870}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002871
Eli Friedman3fd920a2008-08-20 02:34:37 +00002872bool
Anders Carlsson58436352009-02-28 17:11:49 +00002873X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002874 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002875 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002876 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002877 case 'Y': // first letter of a pair:
2878 switch (*(Name+1)) {
2879 default: return false;
2880 case '0': // First SSE register.
2881 case 't': // Any SSE register, when SSE2 is enabled.
2882 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2883 case 'm': // any MMX register, when inter-unit moves enabled.
2884 break; // falls through to setAllowsRegister.
2885 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002886 case 'a': // eax.
2887 case 'b': // ebx.
2888 case 'c': // ecx.
2889 case 'd': // edx.
2890 case 'S': // esi.
2891 case 'D': // edi.
2892 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00002893 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002894 case 't': // top of floating point stack.
2895 case 'u': // second from top of floating point stack.
2896 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002897 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002898 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002899 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002900 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2901 case 'l': // "Index" registers: any general register that can be used as an
2902 // index in a base+index memory access.
2903 Info.setAllowsRegister();
2904 return true;
2905 case 'C': // SSE floating point constant.
2906 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002907 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002908 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002909 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002910 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002911 return true;
2912 }
2913}
2914
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002915
Eli Friedman3fd920a2008-08-20 02:34:37 +00002916std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002917X86TargetInfo::convertConstraint(const char *&Constraint) const {
2918 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002919 case 'a': return std::string("{ax}");
2920 case 'b': return std::string("{bx}");
2921 case 'c': return std::string("{cx}");
2922 case 'd': return std::string("{dx}");
2923 case 'S': return std::string("{si}");
2924 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002925 case 'p': // address
2926 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002927 case 't': // top of floating point stack.
2928 return std::string("{st}");
2929 case 'u': // second from top of floating point stack.
2930 return std::string("{st(1)}"); // second from top of floating point stack.
2931 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002932 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002933 }
2934}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002935} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002936
2937namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002938// X86-32 generic target
2939class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002940public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002941 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002942 DoubleAlign = LongLongAlign = 32;
2943 LongDoubleWidth = 96;
2944 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002945 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00002946 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002947 SizeType = UnsignedInt;
2948 PtrDiffType = SignedInt;
2949 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002950 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002951
2952 // Use fpret for all types.
2953 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2954 (1 << TargetInfo::Double) |
2955 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002956
2957 // x86-32 has atomics up to 8 bytes
2958 // FIXME: Check that we actually have cmpxchg8b before setting
2959 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2960 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002961 }
Craig Topper3164f332014-03-11 03:39:26 +00002962 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00002963 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002964 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002965
Craig Topper3164f332014-03-11 03:39:26 +00002966 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00002967 if (RegNo == 0) return 0;
2968 if (RegNo == 1) return 2;
2969 return -1;
2970 }
Craig Topper3164f332014-03-11 03:39:26 +00002971 bool validateInputSize(StringRef Constraint,
2972 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00002973 switch (Constraint[0]) {
2974 default: break;
2975 case 'a':
2976 case 'b':
2977 case 'c':
2978 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00002979 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00002980 }
2981
2982 return true;
2983 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002984};
2985} // end anonymous namespace
2986
2987namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002988class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2989public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002990 NetBSDI386TargetInfo(const llvm::Triple &Triple)
2991 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002992
Craig Topper3164f332014-03-11 03:39:26 +00002993 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00002994 unsigned Major, Minor, Micro;
2995 getTriple().getOSVersion(Major, Minor, Micro);
2996 // New NetBSD uses the default rounding mode.
2997 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
2998 return X86_32TargetInfo::getFloatEvalMethod();
2999 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003000 return 1;
3001 }
3002};
3003} // end anonymous namespace
3004
3005namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003006class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3007public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003008 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3009 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003010 SizeType = UnsignedLong;
3011 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003012 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003013 }
3014};
3015} // end anonymous namespace
3016
3017namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003018class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3019public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003020 BitrigI386TargetInfo(const llvm::Triple &Triple)
3021 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003022 SizeType = UnsignedLong;
3023 IntPtrType = SignedLong;
3024 PtrDiffType = SignedLong;
3025 }
3026};
3027} // end anonymous namespace
3028
3029namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003030class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003031public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003032 DarwinI386TargetInfo(const llvm::Triple &Triple)
3033 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003034 LongDoubleWidth = 128;
3035 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003036 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003037 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003038 SizeType = UnsignedLong;
3039 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003040 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003041 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003042 }
3043
Eli Friedman3fd920a2008-08-20 02:34:37 +00003044};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003045} // end anonymous namespace
3046
3047namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003048// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003049class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003050public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003051 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3052 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003053 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003054 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003055 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003056 }
Craig Topper3164f332014-03-11 03:39:26 +00003057 void getTargetDefines(const LangOptions &Opts,
3058 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003059 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3060 }
3061};
3062} // end anonymous namespace
3063
3064namespace {
3065
3066// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003067class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003068public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003069 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003070 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003071 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003072 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3073 }
Craig Topper3164f332014-03-11 03:39:26 +00003074 void getTargetDefines(const LangOptions &Opts,
3075 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003076 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3077 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3078 // The value of the following reflects processor type.
3079 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3080 // We lost the original triple, so we use the default.
3081 Builder.defineMacro("_M_IX86", "600");
3082 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003083};
3084} // end anonymous namespace
3085
Reid Kleckner47606832014-04-21 20:58:00 +00003086static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3087 Builder.defineMacro("__MSVCRT__");
3088 Builder.defineMacro("__MINGW32__");
3089
3090 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3091 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3092 // macro anyway for pre-processor compatibility.
3093 if (Opts.MicrosoftExt)
3094 Builder.defineMacro("__declspec", "__declspec");
3095 else
3096 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3097
3098 if (!Opts.MicrosoftExt) {
3099 // Provide macros for all the calling convention keywords. Provide both
3100 // single and double underscore prefixed variants. These are available on
3101 // x64 as well as x86, even though they have no effect.
3102 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3103 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003104 std::string GCCSpelling = "__attribute__((__";
3105 GCCSpelling += CC;
3106 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003107 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3108 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3109 }
3110 }
3111}
3112
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003113namespace {
3114// x86-32 MinGW target
3115class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3116public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003117 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3118 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003119 void getTargetDefines(const LangOptions &Opts,
3120 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003121 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003122 DefineStd(Builder, "WIN32", Opts);
3123 DefineStd(Builder, "WINNT", Opts);
3124 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003125 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003126 }
3127};
3128} // end anonymous namespace
3129
3130namespace {
3131// x86-32 Cygwin target
3132class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3133public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003134 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3135 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003136 TLSSupported = false;
3137 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003138 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003139 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003140 }
Craig Topper3164f332014-03-11 03:39:26 +00003141 void getTargetDefines(const LangOptions &Opts,
3142 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003143 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003144 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003145 Builder.defineMacro("__CYGWIN__");
3146 Builder.defineMacro("__CYGWIN32__");
3147 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003148 if (Opts.CPlusPlus)
3149 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003150 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003151};
3152} // end anonymous namespace
3153
3154namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003155// x86-32 Haiku target
3156class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3157public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003158 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003159 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003160 IntPtrType = SignedLong;
3161 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003162 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003163 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003164 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003165 }
Craig Topper3164f332014-03-11 03:39:26 +00003166 void getTargetDefines(const LangOptions &Opts,
3167 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003168 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3169 Builder.defineMacro("__INTEL__");
3170 Builder.defineMacro("__HAIKU__");
3171 }
3172};
3173} // end anonymous namespace
3174
Douglas Gregor9fabd852011-07-01 22:41:14 +00003175// RTEMS Target
3176template<typename Target>
3177class RTEMSTargetInfo : public OSTargetInfo<Target> {
3178protected:
Craig Topper3164f332014-03-11 03:39:26 +00003179 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3180 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003181 // RTEMS defines; list based off of gcc output
3182
Douglas Gregor9fabd852011-07-01 22:41:14 +00003183 Builder.defineMacro("__rtems__");
3184 Builder.defineMacro("__ELF__");
3185 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003186
Douglas Gregor9fabd852011-07-01 22:41:14 +00003187public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003188 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3189 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003190
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003191 switch (Triple.getArch()) {
3192 default:
3193 case llvm::Triple::x86:
3194 // this->MCountName = ".mcount";
3195 break;
3196 case llvm::Triple::mips:
3197 case llvm::Triple::mipsel:
3198 case llvm::Triple::ppc:
3199 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003200 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003201 // this->MCountName = "_mcount";
3202 break;
3203 case llvm::Triple::arm:
3204 // this->MCountName = "__mcount";
3205 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003206 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003207 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003208};
3209
3210namespace {
3211// x86-32 RTEMS target
3212class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3213public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003214 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003215 SizeType = UnsignedLong;
3216 IntPtrType = SignedLong;
3217 PtrDiffType = SignedLong;
3218 this->UserLabelPrefix = "";
3219 }
Craig Topper3164f332014-03-11 03:39:26 +00003220 void getTargetDefines(const LangOptions &Opts,
3221 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003222 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3223 Builder.defineMacro("__INTEL__");
3224 Builder.defineMacro("__rtems__");
3225 }
3226};
3227} // end anonymous namespace
3228
Chris Lattnerb986aba2010-04-11 19:29:39 +00003229namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003230// x86-64 generic target
3231class X86_64TargetInfo : public X86TargetInfo {
3232public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003233 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00003234 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003235 LongDoubleWidth = 128;
3236 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003237 LargeArrayMinWidth = 128;
3238 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003239 SuitableAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003240 IntMaxType = SignedLong;
3241 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003242 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003243 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003244
Rafael Espindolac418ae92014-01-03 19:22:05 +00003245 DescriptionString = "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003246
3247 // Use fpret only for long double.
3248 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003249
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003250 // Use fp2ret for _Complex long double.
3251 ComplexLongDoubleUsesFP2Ret = true;
3252
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003253 // x86-64 has atomics up to 16 bytes.
3254 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3255 // on CPUs with cmpxchg16b
3256 MaxAtomicPromoteWidth = 128;
3257 MaxAtomicInlineWidth = 64;
Chris Lattner10a5b382007-01-29 05:24:35 +00003258 }
Craig Topper3164f332014-03-11 03:39:26 +00003259 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003260 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003261 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003262
Craig Topper3164f332014-03-11 03:39:26 +00003263 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003264 if (RegNo == 0) return 0;
3265 if (RegNo == 1) return 1;
3266 return -1;
3267 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003268
Craig Topper3164f332014-03-11 03:39:26 +00003269 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003270 return (CC == CC_C ||
3271 CC == CC_IntelOclBicc ||
3272 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003273 }
3274
Craig Topper3164f332014-03-11 03:39:26 +00003275 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003276 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003277 }
3278
Eli Friedman3fd920a2008-08-20 02:34:37 +00003279};
3280} // end anonymous namespace
3281
3282namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003283// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003284class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003285public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003286 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3287 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003288 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003289 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003290 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003291 IntMaxType = SignedLongLong;
3292 UIntMaxType = UnsignedLongLong;
3293 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003294 SizeType = UnsignedLongLong;
3295 PtrDiffType = SignedLongLong;
3296 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003297 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003298 }
Craig Topper3164f332014-03-11 03:39:26 +00003299 void getTargetDefines(const LangOptions &Opts,
3300 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003301 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003302 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003303 }
Craig Topper3164f332014-03-11 03:39:26 +00003304 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003305 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003306 }
Craig Topper3164f332014-03-11 03:39:26 +00003307 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003308 return (CC == CC_C ||
3309 CC == CC_IntelOclBicc ||
3310 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3311 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003312};
3313} // end anonymous namespace
3314
3315namespace {
3316// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003317class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003318public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003319 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003320 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003321 LongDoubleWidth = LongDoubleAlign = 64;
3322 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003323 }
Craig Topper3164f332014-03-11 03:39:26 +00003324 void getTargetDefines(const LangOptions &Opts,
3325 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003326 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3327 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003328 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003329 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003330 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003331};
3332} // end anonymous namespace
3333
3334namespace {
3335// x86-64 MinGW target
3336class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3337public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003338 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3339 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003340 void getTargetDefines(const LangOptions &Opts,
3341 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003342 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003343 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003344 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003345 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003346 }
3347};
3348} // end anonymous namespace
3349
3350namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003351class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3352public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003353 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3354 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003355 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003356 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003357 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3358 llvm::Triple T = llvm::Triple(Triple);
3359 if (T.getOS() == llvm::Triple::IOS)
3360 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003361 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003362 }
3363};
3364} // end anonymous namespace
3365
3366namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003367class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3368public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003369 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3370 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003371 IntMaxType = SignedLongLong;
3372 UIntMaxType = UnsignedLongLong;
3373 Int64Type = SignedLongLong;
3374 }
3375};
3376} // end anonymous namespace
3377
3378namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003379class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3380public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003381 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3382 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3383 IntMaxType = SignedLongLong;
3384 UIntMaxType = UnsignedLongLong;
3385 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003386 }
3387};
Tim Northover9bb857a2013-01-31 12:13:10 +00003388}
3389
3390namespace {
3391class AArch64TargetInfo : public TargetInfo {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003392 virtual void setDescriptionString() = 0;
Tim Northover9bb857a2013-01-31 12:13:10 +00003393 static const char * const GCCRegNames[];
3394 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003395
Tim Northover2fe823a2013-08-01 09:23:19 +00003396 enum FPUModeEnum {
3397 FPUMode,
3398 NeonMode
3399 };
3400
3401 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00003402 unsigned CRC;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003403 unsigned Crypto;
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003404 static const Builtin::Info BuiltinInfo[];
Tim Northover2fe823a2013-08-01 09:23:19 +00003405
Tim Northover9bb857a2013-01-31 12:13:10 +00003406public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003407 AArch64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Tim Northover9bb857a2013-01-31 12:13:10 +00003408 LongWidth = LongAlign = 64;
3409 LongDoubleWidth = LongDoubleAlign = 128;
3410 PointerWidth = PointerAlign = 64;
3411 SuitableAlign = 128;
Tim Northover9bb857a2013-01-31 12:13:10 +00003412
3413 WCharType = UnsignedInt;
Joerg Sonnenberger1f5984c2014-03-26 11:48:29 +00003414 if (getTriple().getOS() == llvm::Triple::NetBSD) {
Joerg Sonnenberger9864bd52014-02-02 21:55:10 +00003415 WCharType = SignedInt;
Joerg Sonnenberger1f5984c2014-03-26 11:48:29 +00003416 Int64Type = SignedLongLong;
3417 IntMaxType = SignedLongLong;
3418 UIntMaxType = UnsignedLongLong;
3419 } else {
Joerg Sonnenberger9864bd52014-02-02 21:55:10 +00003420 WCharType = UnsignedInt;
Joerg Sonnenberger1f5984c2014-03-26 11:48:29 +00003421 Int64Type = SignedLong;
3422 IntMaxType = SignedLong;
3423 UIntMaxType = UnsignedLong;
3424 }
Tim Northover9bb857a2013-01-31 12:13:10 +00003425 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3426
Tim Northover847d2d42013-02-18 12:11:32 +00003427 // AArch64 backend supports 64-bit operations at the moment. In principle
3428 // 128-bit is possible if register-pairs are used.
3429 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3430
Tim Northover9bb857a2013-01-31 12:13:10 +00003431 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3432 }
Craig Topper3164f332014-03-11 03:39:26 +00003433 void getTargetDefines(const LangOptions &Opts,
3434 MacroBuilder &Builder) const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003435 // GCC defines theses currently
3436 Builder.defineMacro("__aarch64__");
Tim Northover9bb857a2013-01-31 12:13:10 +00003437
3438 // ACLE predefines. Many can only have one possible value on v8 AArch64.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003439 Builder.defineMacro("__ARM_ACLE", "200");
Tim Northoverb85654d2013-04-05 14:08:55 +00003440 Builder.defineMacro("__ARM_ARCH", "8");
3441 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
Tim Northover9bb857a2013-01-31 12:13:10 +00003442
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003443 Builder.defineMacro("__ARM_64BIT_STATE");
3444 Builder.defineMacro("__ARM_PCS_AAPCS64");
3445 Builder.defineMacro("__ARM_ARCH_ISA_A64");
3446
Tim Northoverb85654d2013-04-05 14:08:55 +00003447 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
3448 Builder.defineMacro("__ARM_FEATURE_CLZ");
3449 Builder.defineMacro("__ARM_FEATURE_FMA");
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003450 Builder.defineMacro("__ARM_FEATURE_DIV");
Tim Northover9bb857a2013-01-31 12:13:10 +00003451
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003452 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
Tim Northover9bb857a2013-01-31 12:13:10 +00003453
3454 // 0xe implies support for half, single and double precision operations.
Tim Northoverb85654d2013-04-05 14:08:55 +00003455 Builder.defineMacro("__ARM_FP", "0xe");
Tim Northover9bb857a2013-01-31 12:13:10 +00003456
3457 // PCS specifies this for SysV variants, which is all we support. Other ABIs
Tim Northoverb85654d2013-04-05 14:08:55 +00003458 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
3459 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
Tim Northover9bb857a2013-01-31 12:13:10 +00003460
3461 if (Opts.FastMath || Opts.FiniteMathOnly)
Tim Northoverb85654d2013-04-05 14:08:55 +00003462 Builder.defineMacro("__ARM_FP_FAST");
Tim Northover9bb857a2013-01-31 12:13:10 +00003463
3464 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
Tim Northoverb85654d2013-04-05 14:08:55 +00003465 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
Tim Northover9bb857a2013-01-31 12:13:10 +00003466
Tim Northoverb85654d2013-04-05 14:08:55 +00003467 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
Tim Northover9bb857a2013-01-31 12:13:10 +00003468 Opts.ShortWChar ? "2" : "4");
3469
Tim Northoverb85654d2013-04-05 14:08:55 +00003470 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
Tim Northover9bb857a2013-01-31 12:13:10 +00003471 Opts.ShortEnums ? "1" : "4");
3472
Tim Northover2fe823a2013-08-01 09:23:19 +00003473 if (FPU == NeonMode) {
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003474 Builder.defineMacro("__ARM_NEON");
Tim Northover2fe823a2013-08-01 09:23:19 +00003475 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00003476 Builder.defineMacro("__ARM_NEON_FP", "0xe");
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003477 }
3478
Bradley Smith418c5932014-05-02 15:17:51 +00003479 if (CRC)
3480 Builder.defineMacro("__ARM_FEATURE_CRC32");
3481
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003482 if (Crypto) {
3483 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northover2fe823a2013-08-01 09:23:19 +00003484 }
Tim Northover9bb857a2013-01-31 12:13:10 +00003485 }
Craig Topper3164f332014-03-11 03:39:26 +00003486 void getTargetBuiltins(const Builtin::Info *&Records,
3487 unsigned &NumRecords) const override {
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003488 Records = BuiltinInfo;
3489 NumRecords = clang::AArch64::LastTSBuiltin-Builtin::FirstTSBuiltin;
Tim Northover9bb857a2013-01-31 12:13:10 +00003490 }
Craig Topper3164f332014-03-11 03:39:26 +00003491 bool hasFeature(StringRef Feature) const override {
Tim Northover2fe823a2013-08-01 09:23:19 +00003492 return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode);
Tim Northover9bb857a2013-01-31 12:13:10 +00003493 }
Tim Northover2fe823a2013-08-01 09:23:19 +00003494
Craig Topper3164f332014-03-11 03:39:26 +00003495 bool setCPU(const std::string &Name) override {
Amara Emerson703da2e2013-10-31 09:32:33 +00003496 return llvm::StringSwitch<bool>(Name)
3497 .Case("generic", true)
3498 .Cases("cortex-a53", "cortex-a57", true)
3499 .Default(false);
3500 }
3501
Craig Topper3164f332014-03-11 03:39:26 +00003502 bool handleTargetFeatures(std::vector<std::string> &Features,
3503 DiagnosticsEngine &Diags) override {
Tim Northover2fe823a2013-08-01 09:23:19 +00003504 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00003505 CRC = 0;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003506 Crypto = 0;
Tim Northover2fe823a2013-08-01 09:23:19 +00003507 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3508 if (Features[i] == "+neon")
3509 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00003510 if (Features[i] == "+crc")
3511 CRC = 1;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003512 if (Features[i] == "+crypto")
3513 Crypto = 1;
Tim Northover2fe823a2013-08-01 09:23:19 +00003514 }
Christian Pirker9b019ae2014-02-25 13:51:00 +00003515
3516 setDescriptionString();
3517
Rafael Espindolaeb265472013-08-21 21:59:03 +00003518 return true;
Tim Northover2fe823a2013-08-01 09:23:19 +00003519 }
3520
Craig Topper3164f332014-03-11 03:39:26 +00003521 void getGCCRegNames(const char *const *&Names,
3522 unsigned &NumNames) const override;
3523 void getGCCRegAliases(const GCCRegAlias *&Aliases,
3524 unsigned &NumAliases) const override;
Tim Northover9bb857a2013-01-31 12:13:10 +00003525
Craig Topper3164f332014-03-11 03:39:26 +00003526 bool isCLZForZeroUndef() const override { return false; }
Tim Northover9bb857a2013-01-31 12:13:10 +00003527
Craig Topper3164f332014-03-11 03:39:26 +00003528 bool validateAsmConstraint(const char *&Name,
3529 TargetInfo::ConstraintInfo &Info) const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003530 switch (*Name) {
3531 default: return false;
3532 case 'w': // An FP/SIMD vector register
3533 Info.setAllowsRegister();
3534 return true;
3535 case 'I': // Constant that can be used with an ADD instruction
3536 case 'J': // Constant that can be used with a SUB instruction
3537 case 'K': // Constant that can be used with a 32-bit logical instruction
3538 case 'L': // Constant that can be used with a 64-bit logical instruction
3539 case 'M': // Constant that can be used as a 32-bit MOV immediate
3540 case 'N': // Constant that can be used as a 64-bit MOV immediate
3541 case 'Y': // Floating point constant zero
3542 case 'Z': // Integer constant zero
3543 return true;
3544 case 'Q': // A memory reference with base register and no offset
3545 Info.setAllowsMemory();
3546 return true;
3547 case 'S': // A symbolic address
3548 Info.setAllowsRegister();
3549 return true;
3550 case 'U':
3551 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3552 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3553 // Usa: An absolute symbolic address
3554 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3555 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3556 }
3557 }
3558
Craig Topper3164f332014-03-11 03:39:26 +00003559 const char *getClobbers() const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003560 // There are no AArch64 clobbers shared by all asm statements.
3561 return "";
3562 }
3563
Craig Topper3164f332014-03-11 03:39:26 +00003564 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003565 return TargetInfo::AArch64ABIBuiltinVaList;
3566 }
3567};
3568
3569const char * const AArch64TargetInfo::GCCRegNames[] = {
3570 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3571 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3572 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3573 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3574
3575 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3576 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3577 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3578 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3579
3580 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3581 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3582 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3583 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3584
3585 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3586 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3587 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3588 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3589
3590 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3591 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3592 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3593 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3594
3595 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3596 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3597 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3598 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3599
3600 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3601 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3602 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3603 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3604};
3605
3606void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3607 unsigned &NumNames) const {
3608 Names = GCCRegNames;
3609 NumNames = llvm::array_lengthof(GCCRegNames);
3610}
3611
3612const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3613 { { "x16" }, "ip0"},
3614 { { "x17" }, "ip1"},
3615 { { "x29" }, "fp" },
3616 { { "x30" }, "lr" }
3617};
3618
3619void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3620 unsigned &NumAliases) const {
3621 Aliases = GCCRegAliases;
3622 NumAliases = llvm::array_lengthof(GCCRegAliases);
3623
3624}
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003625
3626const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
3627#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3628#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3629 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00003630#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00003631
3632#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3633#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3634 ALL_LANGUAGES },
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003635#include "clang/Basic/BuiltinsAArch64.def"
3636};
3637
Christian Pirker9b019ae2014-02-25 13:51:00 +00003638class AArch64leTargetInfo : public AArch64TargetInfo {
Craig Topper3164f332014-03-11 03:39:26 +00003639 void setDescriptionString() override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003640 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
3641 }
3642
3643public:
3644 AArch64leTargetInfo(const llvm::Triple &Triple)
3645 : AArch64TargetInfo(Triple) {
3646 BigEndian = false;
3647 }
Craig Topper3164f332014-03-11 03:39:26 +00003648 void getTargetDefines(const LangOptions &Opts,
3649 MacroBuilder &Builder) const override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003650 Builder.defineMacro("__AARCH64EL__");
3651 AArch64TargetInfo::getTargetDefines(Opts, Builder);
3652 }
3653};
3654
3655class AArch64beTargetInfo : public AArch64TargetInfo {
Craig Topper3164f332014-03-11 03:39:26 +00003656 void setDescriptionString() override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003657 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
3658 }
3659
3660public:
3661 AArch64beTargetInfo(const llvm::Triple &Triple)
3662 : AArch64TargetInfo(Triple) { }
Craig Topper3164f332014-03-11 03:39:26 +00003663 void getTargetDefines(const LangOptions &Opts,
3664 MacroBuilder &Builder) const override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003665 Builder.defineMacro("__AARCH64EB__");
Christian Pirker227f5ed2014-03-24 13:57:21 +00003666 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3667 Builder.defineMacro("__ARM_BIG_ENDIAN");
Christian Pirker9b019ae2014-02-25 13:51:00 +00003668 AArch64TargetInfo::getTargetDefines(Opts, Builder);
3669 }
3670};
3671
Eli Friedman9fa28852012-08-08 23:57:20 +00003672} // end anonymous namespace
3673
3674namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003675class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003676 // Possible FPU choices.
3677 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003678 VFP2FPU = (1 << 0),
3679 VFP3FPU = (1 << 1),
3680 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003681 NeonFPU = (1 << 3),
3682 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003683 };
3684
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003685 // Possible HWDiv features.
3686 enum HWDivMode {
3687 HWDivThumb = (1 << 0),
3688 HWDivARM = (1 << 1)
3689 };
3690
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003691 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003692 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003693 }
3694
3695 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3696 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003697
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003698 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003699
Rafael Espindolaeb265472013-08-21 21:59:03 +00003700 enum {
3701 FP_Default,
3702 FP_VFP,
3703 FP_Neon
3704 } FPMath;
3705
Bernard Ogdenda13af32013-10-24 18:32:51 +00003706 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003707
Logan Chien57086ce2012-10-10 06:56:20 +00003708 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003709 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003710 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003711
3712 // Initialized via features.
3713 unsigned SoftFloat : 1;
3714 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003715
Bernard Ogden18b57012013-10-29 09:47:51 +00003716 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003717 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003718
Chris Lattner5cc15e02010-03-03 19:03:45 +00003719 static const Builtin::Info BuiltinInfo[];
3720
Rafael Espindola101d5b92013-05-13 20:09:47 +00003721 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003722 if (T.isOSWindows())
3723 return true;
3724
Rafael Espindola101d5b92013-05-13 20:09:47 +00003725 // On linux, binaries targeting old cpus call functions in libgcc to
3726 // perform atomic operations. The implementation in libgcc then calls into
3727 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3728 // is that if we assume the kernel is at least as recent as the hardware,
3729 // it is safe to use atomic instructions on armv6 and newer.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003730 if (!T.isOSLinux() &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003731 T.getOS() != llvm::Triple::FreeBSD &&
Joerg Sonnenbergerfbd51be2013-12-02 16:12:05 +00003732 T.getOS() != llvm::Triple::NetBSD &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003733 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten60afa2d2013-06-15 09:40:14 +00003734 return false;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003735 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003736 if (T.getArch() == llvm::Triple::arm ||
3737 T.getArch() == llvm::Triple::armeb) {
3738 StringRef VersionStr;
3739 if (ArchName.startswith("armv"))
3740 VersionStr = ArchName.substr(4);
3741 else if (ArchName.startswith("armebv"))
3742 VersionStr = ArchName.substr(6);
3743 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003744 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003745 unsigned Version;
3746 if (VersionStr.getAsInteger(10, Version))
3747 return false;
3748 return Version >= 6;
3749 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003750 assert(T.getArch() == llvm::Triple::thumb ||
3751 T.getArch() == llvm::Triple::thumbeb);
3752 StringRef VersionStr;
3753 if (ArchName.startswith("thumbv"))
3754 VersionStr = ArchName.substr(6);
3755 else if (ArchName.startswith("thumbebv"))
3756 VersionStr = ArchName.substr(8);
3757 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003758 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003759 unsigned Version;
3760 if (VersionStr.getAsInteger(10, Version))
3761 return false;
3762 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003763 }
3764
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003765 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003766 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003767
3768 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003769 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003770
Joerg Sonnenbergerf19dc302014-01-26 20:02:03 +00003771 // size_t is unsigned long on Darwin and NetBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003772 if (T.isOSDarwin() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003773 SizeType = UnsignedLong;
3774 else
3775 SizeType = UnsignedInt;
3776
Rafael Espindolac418ae92014-01-03 19:22:05 +00003777 if (T.getOS() == llvm::Triple::NetBSD) {
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003778 WCharType = SignedInt;
3779 } else {
3780 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3781 WCharType = UnsignedInt;
3782 }
3783
3784 UseBitFieldTypeAlignment = true;
3785
3786 ZeroLengthBitfieldBoundary = 0;
3787
3788 if (IsThumb) {
3789 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3790 // so set preferred for small types to 32.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003791 if (T.isOSBinFormatMachO()) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003792 DescriptionString = BigEndian ?
3793 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3794 "v128:64:128-a:0:32-n32-S64" :
3795 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3796 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003797 } else if (T.isOSWindows()) {
3798 // FIXME: this is invalid for WindowsCE
3799 assert(!BigEndian && "Windows on ARM does not support big endian");
3800 DescriptionString = "e"
3801 "-m:e"
3802 "-p:32:32"
3803 "-i1:8:32-i8:8:32-i16:16:32-i64:64"
3804 "-v128:64:128"
3805 "-a:0:32"
3806 "-n32"
3807 "-S64";
3808 } else {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003809 DescriptionString = BigEndian ?
3810 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3811 "v128:64:128-a:0:32-n32-S64" :
3812 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3813 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003814 }
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003815 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003816 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003817 DescriptionString = BigEndian ?
3818 "E-m:o-p:32:32-i64:64-v128:64:128-n32-S64" :
3819 "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003820 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003821 DescriptionString = BigEndian ?
3822 "E-m:e-p:32:32-i64:64-v128:64:128-n32-S64" :
3823 "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003824 }
3825
3826 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003827 }
3828
3829 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003830 const llvm::Triple &T = getTriple();
3831
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003832 IsAAPCS = false;
3833
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003834 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003835
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003836 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003837 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003838 SizeType = UnsignedInt;
3839 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003840 SizeType = UnsignedLong;
3841
3842 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3843 WCharType = SignedInt;
3844
3845 // Do not respect the alignment of bit-field types when laying out
3846 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3847 UseBitFieldTypeAlignment = false;
3848
3849 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3850 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3851 /// gcc.
3852 ZeroLengthBitfieldBoundary = 32;
3853
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003854 if (IsThumb) {
3855 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3856 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003857 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003858 DescriptionString = BigEndian ?
3859 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3860 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3861 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3862 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003863 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003864 DescriptionString = BigEndian ?
3865 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3866 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3867 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3868 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003869 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003870 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003871 DescriptionString = BigEndian ?
3872 "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 +00003873 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3874 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003875 DescriptionString = BigEndian ?
3876 "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 +00003877 "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 +00003878 }
3879
3880 // FIXME: Override "preferred align" for double and long long.
3881 }
3882
Chris Lattner17df24e2008-04-21 18:56:49 +00003883public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003884 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003885 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3886 IsAAPCS(true) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003887 BigEndian = IsBigEndian;
3888
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003889 switch (getTriple().getOS()) {
3890 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003891 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003892 break;
3893 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003894 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003895 break;
3896 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003897
Chris Lattner1a8f3942010-04-23 16:29:58 +00003898 // {} in inline assembly are neon specifiers, not assembly variant
3899 // specifiers.
3900 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003901
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003902 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003903 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003904
3905 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003906
3907 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003908 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003909
3910 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003911 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003912 if (shouldUseInlineAtomic(getTriple()))
3913 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003914
3915 // Do force alignment of members that follow zero length bitfields. If
3916 // the alignment of the zero-length bitfield is greater than the member
3917 // that follows it, `bar', `bar' will be aligned as the type of the
3918 // zero length bitfield.
3919 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003920 }
Craig Topper3164f332014-03-11 03:39:26 +00003921 const char *getABI() const override { return ABI.c_str(); }
3922 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003923 ABI = Name;
3924
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003925 // The defaults (above) are for AAPCS, check if we need to change them.
3926 //
3927 // FIXME: We need support for -meabi... we could just mangle it into the
3928 // name.
3929 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003930 setABIAPCS();
3931 return true;
3932 }
3933 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3934 setABIAAPCS();
3935 return true;
3936 }
3937 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003938 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003939
Craig Topper3164f332014-03-11 03:39:26 +00003940 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003941 if (IsAAPCS)
3942 Features["aapcs"] = true;
3943 else
3944 Features["apcs"] = true;
3945
Silviu Barangae5690462013-10-21 10:59:33 +00003946 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003947 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3948 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003949 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3950 CPU == "cortex-a9-mp") {
3951 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003952 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003953 }
3954 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003955 Features["vfp4"] = true;
3956 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003957 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3958 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3959 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003960 Features["vfp4"] = true;
3961 Features["neon"] = true;
3962 Features["hwdiv"] = true;
3963 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003964 } else if (CPU == "cyclone") {
3965 Features["v8fp"] = true;
3966 Features["neon"] = true;
3967 Features["hwdiv"] = true;
3968 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003969 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3970 Features["fp-armv8"] = true;
3971 Features["neon"] = true;
3972 Features["hwdiv"] = true;
3973 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003974 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003975 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003976 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003977 // Enable the hwdiv extension for all v8a AArch32 cores by
3978 // default.
3979 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003980 ArchName == "armebv8a" || ArchName == "armebv8" ||
3981 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3982 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00003983 Features["hwdiv"] = true;
3984 Features["hwdiv-arm"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003985 } else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
3986 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003987 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003988 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003989
Craig Topper3164f332014-03-11 03:39:26 +00003990 bool handleTargetFeatures(std::vector<std::string> &Features,
3991 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003992 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003993 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003994 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003995 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003996 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003997 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3998 if (Features[i] == "+soft-float")
3999 SoftFloat = true;
4000 else if (Features[i] == "+soft-float-abi")
4001 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004002 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004003 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004004 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004005 FPU |= VFP3FPU;
4006 else if (Features[i] == "+vfp4")
4007 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00004008 else if (Features[i] == "+fp-armv8")
4009 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004010 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004011 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004012 else if (Features[i] == "+hwdiv")
4013 HWDiv |= HWDivThumb;
4014 else if (Features[i] == "+hwdiv-arm")
4015 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00004016 else if (Features[i] == "+crc")
4017 CRC = 1;
Tim Northover02e38602014-02-03 17:28:04 +00004018 else if (Features[i] == "+crypto")
4019 Crypto = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004020 }
4021
Rafael Espindolaeb265472013-08-21 21:59:03 +00004022 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4023 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4024 return false;
4025 }
4026
4027 if (FPMath == FP_Neon)
4028 Features.push_back("+neonfp");
4029 else if (FPMath == FP_VFP)
4030 Features.push_back("-neonfp");
4031
Daniel Dunbar893d4752009-12-19 04:15:38 +00004032 // Remove front-end specific options which the backend handles differently.
4033 std::vector<std::string>::iterator it;
4034 it = std::find(Features.begin(), Features.end(), "+soft-float");
4035 if (it != Features.end())
4036 Features.erase(it);
4037 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
4038 if (it != Features.end())
4039 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00004040 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004041 }
4042
Craig Topper3164f332014-03-11 03:39:26 +00004043 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004044 return llvm::StringSwitch<bool>(Feature)
4045 .Case("arm", true)
4046 .Case("softfloat", SoftFloat)
4047 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004048 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004049 .Case("hwdiv", HWDiv & HWDivThumb)
4050 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004051 .Default(false);
4052 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004053 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004054 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004055 return llvm::StringSwitch<const char*>(Name)
4056 .Cases("arm8", "arm810", "4")
4057 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
4058 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4059 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4060 .Case("ep9312", "4T")
4061 .Cases("arm10tdmi", "arm1020t", "5T")
4062 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4063 .Case("arm926ej-s", "5TEJ")
4064 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4065 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004066 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004067 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004068 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004069 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00004070 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00004071 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00004072 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00004073 .Case("swift", "7S")
Tim Northovera2ee4332014-03-29 15:09:45 +00004074 .Case("cyclone", "8A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004075 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00004076 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00004077 .Cases("cortex-a53", "cortex-a57", "8A")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004078 .Default(0);
4079 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004080 static const char *getCPUProfile(StringRef Name) {
4081 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00004082 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00004083 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00004084 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004085 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00004086 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00004087 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004088 }
Craig Topper3164f332014-03-11 03:39:26 +00004089 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004090 if (!getCPUDefineSuffix(Name))
4091 return false;
4092
4093 CPU = Name;
4094 return true;
4095 }
Craig Topper3164f332014-03-11 03:39:26 +00004096 bool setFPMath(StringRef Name) override;
4097 void getTargetDefines(const LangOptions &Opts,
4098 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004099 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004100 Builder.defineMacro("__arm");
4101 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004102
Chris Lattnerecd49032009-03-02 22:27:17 +00004103 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004104 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004105
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004106 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004107 unsigned int CPUArchVer;
4108 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
4109 llvm_unreachable("Invalid char for architecture version number");
4110 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004111 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004112 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
4113 StringRef CPUProfile = getCPUProfile(CPU);
4114 if (!CPUProfile.empty())
4115 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004116
Mike Stump9d54bd72009-04-08 02:07:04 +00004117 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004118
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004119 // FIXME: It's more complicated than this and we don't really support
4120 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004121 // Windows on ARM does not "support" interworking
4122 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004123 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004124
David Tweed8f676532012-10-25 13:33:01 +00004125 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004126 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004127 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4128 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004129 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004130 Builder.defineMacro("__ARM_PCS", "1");
4131
David Tweed8f676532012-10-25 13:33:01 +00004132 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004133 Builder.defineMacro("__ARM_PCS_VFP", "1");
4134 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004135
Daniel Dunbar893d4752009-12-19 04:15:38 +00004136 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004137 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004138
4139 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004140 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004141
4142 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004143 Builder.defineMacro("__THUMBEL__");
4144 Builder.defineMacro("__thumb__");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004145 // We check both CPUArchVer and ArchName because when only triple is
4146 // specified, the default CPU is arm1136j-s.
4147 StringRef ArchName = getTriple().getArchName();
4148 if (CPUArch == "6T2" || CPUArchVer >= 7 || ArchName.endswith("v6t2") ||
4149 ArchName.endswith("v7") || ArchName.endswith("v8"))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004150 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004151 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004152 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4153 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004154
4155 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004156 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004157
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004158 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004159 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004160 if (FPU & VFP2FPU)
4161 Builder.defineMacro("__ARM_VFPV2__");
4162 if (FPU & VFP3FPU)
4163 Builder.defineMacro("__ARM_VFPV3__");
4164 if (FPU & VFP4FPU)
4165 Builder.defineMacro("__ARM_VFPV4__");
4166 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004167
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004168 // This only gets set when Neon instructions are actually available, unlike
4169 // the VFP define, hence the soft float and arch check. This is subtly
4170 // different from gcc, we follow the intent which was that it should be set
4171 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004172 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4173 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004174 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004175 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004176
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004177 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4178 Opts.ShortWChar ? "2" : "4");
4179
4180 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4181 Opts.ShortEnums ? "1" : "4");
4182
Bernard Ogden18b57012013-10-29 09:47:51 +00004183 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004184 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004185
Tim Northover02e38602014-02-03 17:28:04 +00004186 if (Crypto)
4187 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4188
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004189 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004190 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4191 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4192 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4193 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4194 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004195 }
Craig Topper3164f332014-03-11 03:39:26 +00004196 void getTargetBuiltins(const Builtin::Info *&Records,
4197 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004198 Records = BuiltinInfo;
4199 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004200 }
Craig Topper3164f332014-03-11 03:39:26 +00004201 bool isCLZForZeroUndef() const override { return false; }
4202 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004203 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004204 }
Craig Topper3164f332014-03-11 03:39:26 +00004205 void getGCCRegNames(const char * const *&Names,
4206 unsigned &NumNames) const override;
4207 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4208 unsigned &NumAliases) const override;
4209 bool validateAsmConstraint(const char *&Name,
4210 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004211 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004212 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004213 case 'l': // r0-r7
4214 case 'h': // r8-r15
4215 case 'w': // VFP Floating point register single precision
4216 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004217 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004218 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004219 case 'Q': // A memory address that is a single base register.
4220 Info.setAllowsMemory();
4221 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004222 case 'U': // a memory reference...
4223 switch (Name[1]) {
4224 case 'q': // ...ARMV4 ldrsb
4225 case 'v': // ...VFP load/store (reg+constant offset)
4226 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004227 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004228 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004229 case 'n': // valid address for Neon doubleword vector load/store
4230 case 'm': // valid address for Neon element and structure load/store
4231 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004232 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004233 Info.setAllowsMemory();
4234 Name++;
4235 return true;
4236 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004237 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004238 return false;
4239 }
Craig Topper3164f332014-03-11 03:39:26 +00004240 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004241 std::string R;
4242 switch (*Constraint) {
4243 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004244 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004245 Constraint++;
4246 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004247 case 'p': // 'p' should be translated to 'r' by default.
4248 R = std::string("r");
4249 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004250 default:
4251 return std::string(1, *Constraint);
4252 }
4253 return R;
4254 }
Craig Topper3164f332014-03-11 03:39:26 +00004255 bool validateConstraintModifier(StringRef Constraint, const char Modifier,
4256 unsigned Size) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004257 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004258 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004259
Bill Wendling9d1ee112012-10-25 23:28:48 +00004260 // Strip off constraint modifiers.
4261 while (Constraint[0] == '=' ||
4262 Constraint[0] == '+' ||
4263 Constraint[0] == '&')
4264 Constraint = Constraint.substr(1);
4265
4266 switch (Constraint[0]) {
4267 default: break;
4268 case 'r': {
4269 switch (Modifier) {
4270 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004271 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004272 case 'q':
4273 // A register of size 32 cannot fit a vector type.
4274 return false;
4275 }
4276 }
4277 }
4278
4279 return true;
4280 }
Craig Topper3164f332014-03-11 03:39:26 +00004281 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004282 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004283 return "";
4284 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004285
Craig Topper3164f332014-03-11 03:39:26 +00004286 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004287 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4288 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004289
Craig Topper3164f332014-03-11 03:39:26 +00004290 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004291 if (RegNo == 0) return 0;
4292 if (RegNo == 1) return 1;
4293 return -1;
4294 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004295};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004296
Rafael Espindolaeb265472013-08-21 21:59:03 +00004297bool ARMTargetInfo::setFPMath(StringRef Name) {
4298 if (Name == "neon") {
4299 FPMath = FP_Neon;
4300 return true;
4301 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4302 Name == "vfp4") {
4303 FPMath = FP_VFP;
4304 return true;
4305 }
4306 return false;
4307}
4308
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004309const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004310 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004311 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004312 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4313
4314 // Float registers
4315 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4316 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4317 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004318 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004319
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004320 // Double registers
4321 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4322 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004323 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4324 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004325
4326 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004327 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4328 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004329};
4330
4331void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004332 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004333 Names = GCCRegNames;
4334 NumNames = llvm::array_lengthof(GCCRegNames);
4335}
4336
4337const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004338 { { "a1" }, "r0" },
4339 { { "a2" }, "r1" },
4340 { { "a3" }, "r2" },
4341 { { "a4" }, "r3" },
4342 { { "v1" }, "r4" },
4343 { { "v2" }, "r5" },
4344 { { "v3" }, "r6" },
4345 { { "v4" }, "r7" },
4346 { { "v5" }, "r8" },
4347 { { "v6", "rfp" }, "r9" },
4348 { { "sl" }, "r10" },
4349 { { "fp" }, "r11" },
4350 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004351 { { "r13" }, "sp" },
4352 { { "r14" }, "lr" },
4353 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004354 // The S, D and Q registers overlap, but aren't really aliases; we
4355 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004356};
4357
4358void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4359 unsigned &NumAliases) const {
4360 Aliases = GCCRegAliases;
4361 NumAliases = llvm::array_lengthof(GCCRegAliases);
4362}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004363
4364const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004365#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004366#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004367 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004368#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004369
4370#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4371#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4372 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004373#include "clang/Basic/BuiltinsARM.def"
4374};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004375
4376class ARMleTargetInfo : public ARMTargetInfo {
4377public:
4378 ARMleTargetInfo(const llvm::Triple &Triple)
4379 : ARMTargetInfo(Triple, false) { }
4380 virtual void getTargetDefines(const LangOptions &Opts,
4381 MacroBuilder &Builder) const {
4382 Builder.defineMacro("__ARMEL__");
4383 ARMTargetInfo::getTargetDefines(Opts, Builder);
4384 }
4385};
4386
4387class ARMbeTargetInfo : public ARMTargetInfo {
4388public:
4389 ARMbeTargetInfo(const llvm::Triple &Triple)
4390 : ARMTargetInfo(Triple, true) { }
4391 virtual void getTargetDefines(const LangOptions &Opts,
4392 MacroBuilder &Builder) const {
4393 Builder.defineMacro("__ARMEB__");
4394 Builder.defineMacro("__ARM_BIG_ENDIAN");
4395 ARMTargetInfo::getTargetDefines(Opts, Builder);
4396 }
4397};
Chris Lattner17df24e2008-04-21 18:56:49 +00004398} // end anonymous namespace.
4399
Eli Friedmanf05b7722008-08-20 07:44:10 +00004400namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004401class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4402 const llvm::Triple Triple;
4403public:
4404 WindowsARMTargetInfo(const llvm::Triple &Triple)
4405 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4406 TLSSupported = false;
4407 WCharType = UnsignedShort;
4408 SizeType = UnsignedInt;
4409 UserLabelPrefix = "";
4410 }
4411 void getVisualStudioDefines(const LangOptions &Opts,
4412 MacroBuilder &Builder) const {
4413 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4414
4415 // FIXME: this is invalid for WindowsCE
4416 Builder.defineMacro("_M_ARM_NT", "1");
4417 Builder.defineMacro("_M_ARMT", "_M_ARM");
4418 Builder.defineMacro("_M_THUMB", "_M_ARM");
4419
4420 assert((Triple.getArch() == llvm::Triple::arm ||
4421 Triple.getArch() == llvm::Triple::thumb) &&
4422 "invalid architecture for Windows ARM target info");
4423 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4424 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4425
4426 // TODO map the complete set of values
4427 // 31: VFPv3 40: VFPv4
4428 Builder.defineMacro("_M_ARM_FP", "31");
4429 }
4430};
4431
4432// Windows ARM + Itanium C++ ABI Target
4433class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4434public:
4435 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4436 : WindowsARMTargetInfo(Triple) {
4437 TheCXXABI.set(TargetCXXABI::GenericARM);
4438 }
4439
4440 void getTargetDefines(const LangOptions &Opts,
4441 MacroBuilder &Builder) const override {
4442 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4443
4444 if (Opts.MSVCCompat)
4445 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4446 }
4447};
4448
4449// Windows ARM, MS (C++) ABI
4450class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4451public:
4452 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4453 : WindowsARMTargetInfo(Triple) {
4454 TheCXXABI.set(TargetCXXABI::Microsoft);
4455 }
4456
4457 void getTargetDefines(const LangOptions &Opts,
4458 MacroBuilder &Builder) const override {
4459 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4460 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4461 }
4462};
4463}
4464
4465
4466namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004467class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004468 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004469protected:
Craig Topper3164f332014-03-11 03:39:26 +00004470 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4471 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004472 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004473 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004474
Torok Edwinb2b37c62009-06-30 17:10:35 +00004475public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004476 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004477 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004478 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004479 // iOS always has 64-bit atomic instructions.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004480 // FIXME: This should be based off of the target features in ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004481 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004482
4483 // Darwin on iOS uses a variant of the ARM C++ ABI.
4484 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004485 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004486};
4487} // end anonymous namespace.
4488
Tony Linthicum76329bf2011-12-12 21:14:55 +00004489
4490namespace {
Tim Northovera2ee4332014-03-29 15:09:45 +00004491class ARM64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004492 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004493 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4494 static const char *const GCCRegNames[];
4495
James Molloy75f5f9e2014-04-16 15:33:48 +00004496 enum FPUModeEnum {
4497 FPUMode,
4498 NeonMode
4499 };
4500
4501 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004502 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004503 unsigned Crypto;
4504
Tim Northovera2ee4332014-03-29 15:09:45 +00004505 static const Builtin::Info BuiltinInfo[];
4506
4507 std::string ABI;
4508
4509public:
4510 ARM64TargetInfo(const llvm::Triple &Triple)
4511 : TargetInfo(Triple), ABI("aapcs") {
Tim Northovera2ee4332014-03-29 15:09:45 +00004512 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
4513 IntMaxType = SignedLong;
4514 UIntMaxType = UnsignedLong;
4515 Int64Type = SignedLong;
4516 WCharType = UnsignedInt;
4517 MaxVectorAlign = 128;
4518 RegParmMax = 8;
4519 MaxAtomicInlineWidth = 128;
4520 MaxAtomicPromoteWidth = 128;
4521
4522 LongDoubleWidth = LongDoubleAlign = 128;
4523 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4524
Tim Northovera2ee4332014-03-29 15:09:45 +00004525 // {} in inline assembly are neon specifiers, not assembly variant
4526 // specifiers.
4527 NoAsmVariants = true;
4528
4529 // ARM64 targets default to using the ARM C++ ABI.
4530 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4531 }
4532
4533 virtual const char *getABI() const { return ABI.c_str(); }
4534 virtual bool setABI(const std::string &Name) {
4535 if (Name != "aapcs" && Name != "darwinpcs")
4536 return false;
4537
4538 ABI = Name;
4539 return true;
4540 }
4541
4542 virtual bool setCPU(const std::string &Name) {
4543 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004544 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004545 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004546 .Case("cyclone", true)
4547 .Default(false);
4548 return CPUKnown;
4549 }
4550
4551 virtual void getTargetDefines(const LangOptions &Opts,
4552 MacroBuilder &Builder) const {
4553 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004554 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004555
4556 // Target properties.
4557 Builder.defineMacro("_LP64");
4558 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004559
4560 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4561 Builder.defineMacro("__ARM_ACLE", "200");
4562 Builder.defineMacro("__ARM_ARCH", "8");
4563 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4564
4565 Builder.defineMacro("__ARM_64BIT_STATE");
4566 Builder.defineMacro("__ARM_PCS_AAPCS64");
4567 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4568
4569 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4570 Builder.defineMacro("__ARM_FEATURE_CLZ");
4571 Builder.defineMacro("__ARM_FEATURE_FMA");
4572 Builder.defineMacro("__ARM_FEATURE_DIV");
4573
4574 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4575
4576 // 0xe implies support for half, single and double precision operations.
4577 Builder.defineMacro("__ARM_FP", "0xe");
4578
4579 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4580 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4581 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4582
4583 if (Opts.FastMath || Opts.FiniteMathOnly)
4584 Builder.defineMacro("__ARM_FP_FAST");
4585
4586 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
4587 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4588
4589 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4590
4591 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4592 Opts.ShortEnums ? "1" : "4");
4593
James Molloy75f5f9e2014-04-16 15:33:48 +00004594 if (FPU == NeonMode) {
4595 Builder.defineMacro("__ARM_NEON");
4596 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004597 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004598 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004599
Bradley Smith418c5932014-05-02 15:17:51 +00004600 if (CRC)
4601 Builder.defineMacro("__ARM_FEATURE_CRC32");
4602
James Molloy75f5f9e2014-04-16 15:33:48 +00004603 if (Crypto)
4604 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004605 }
4606
4607 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4608 unsigned &NumRecords) const {
4609 Records = BuiltinInfo;
4610 NumRecords = clang::ARM64::LastTSBuiltin - Builtin::FirstTSBuiltin;
4611 }
4612
4613 virtual bool hasFeature(StringRef Feature) const {
James Molloy75f5f9e2014-04-16 15:33:48 +00004614 return Feature == "aarch64" ||
4615 Feature == "arm64" ||
4616 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004617 }
4618
James Molloy5e73df52014-04-16 15:06:20 +00004619 bool handleTargetFeatures(std::vector<std::string> &Features,
4620 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004621 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004622 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004623 Crypto = 0;
4624 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4625 if (Features[i] == "+neon")
4626 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004627 if (Features[i] == "+crc")
4628 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004629 if (Features[i] == "+crypto")
4630 Crypto = 1;
4631 }
4632
James Molloy5e73df52014-04-16 15:06:20 +00004633 setDescriptionString();
4634
4635 return true;
4636 }
4637
Tim Northovera2ee4332014-03-29 15:09:45 +00004638 virtual bool isCLZForZeroUndef() const { return false; }
4639
4640 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4641 return TargetInfo::AArch64ABIBuiltinVaList;
4642 }
4643
4644 virtual void getGCCRegNames(const char *const *&Names,
4645 unsigned &NumNames) const;
4646 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4647 unsigned &NumAliases) const;
4648
4649 virtual bool validateAsmConstraint(const char *&Name,
4650 TargetInfo::ConstraintInfo &Info) const {
4651 switch (*Name) {
4652 default:
4653 return false;
4654 case 'w': // Floating point and SIMD registers (V0-V31)
4655 Info.setAllowsRegister();
4656 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004657 case 'I': // Constant that can be used with an ADD instruction
4658 case 'J': // Constant that can be used with a SUB instruction
4659 case 'K': // Constant that can be used with a 32-bit logical instruction
4660 case 'L': // Constant that can be used with a 64-bit logical instruction
4661 case 'M': // Constant that can be used as a 32-bit MOV immediate
4662 case 'N': // Constant that can be used as a 64-bit MOV immediate
4663 case 'Y': // Floating point constant zero
4664 case 'Z': // Integer constant zero
4665 return true;
4666 case 'Q': // A memory reference with base register and no offset
4667 Info.setAllowsMemory();
4668 return true;
4669 case 'S': // A symbolic address
4670 Info.setAllowsRegister();
4671 return true;
4672 case 'U':
4673 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
4674 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
4675 // Usa: An absolute symbolic address
4676 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
4677 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
Tim Northovera2ee4332014-03-29 15:09:45 +00004678 case 'z': // Zero register, wzr or xzr
4679 Info.setAllowsRegister();
4680 return true;
4681 case 'x': // Floating point and SIMD registers (V0-V15)
4682 Info.setAllowsRegister();
4683 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004684 }
4685 return false;
4686 }
4687
Tim Northovera2ee4332014-03-29 15:09:45 +00004688 virtual const char *getClobbers() const { return ""; }
4689
4690 int getEHDataRegisterNumber(unsigned RegNo) const {
4691 if (RegNo == 0)
4692 return 0;
4693 if (RegNo == 1)
4694 return 1;
4695 return -1;
4696 }
4697};
4698
4699const char *const ARM64TargetInfo::GCCRegNames[] = {
4700 // 32-bit Integer registers
4701 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4702 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4703 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4704
4705 // 64-bit Integer registers
4706 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4707 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4708 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4709
4710 // 32-bit floating point regsisters
4711 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4712 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4713 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4714
4715 // 64-bit floating point regsisters
4716 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4717 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4718 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4719
4720 // Vector registers
4721 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4722 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4723 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4724};
4725
4726void ARM64TargetInfo::getGCCRegNames(const char *const *&Names,
4727 unsigned &NumNames) const {
4728 Names = GCCRegNames;
4729 NumNames = llvm::array_lengthof(GCCRegNames);
4730}
4731
4732const TargetInfo::GCCRegAlias ARM64TargetInfo::GCCRegAliases[] = {
4733 { { "w31" }, "wsp" },
4734 { { "x29" }, "fp" },
4735 { { "x30" }, "lr" },
4736 { { "x31" }, "sp" },
4737 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4738 // don't want to substitute one of these for a different-sized one.
4739};
4740
4741void ARM64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4742 unsigned &NumAliases) const {
4743 Aliases = GCCRegAliases;
4744 NumAliases = llvm::array_lengthof(GCCRegAliases);
4745}
4746
4747const Builtin::Info ARM64TargetInfo::BuiltinInfo[] = {
4748#define BUILTIN(ID, TYPE, ATTRS) \
4749 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4750#include "clang/Basic/BuiltinsNEON.def"
4751
4752#define BUILTIN(ID, TYPE, ATTRS) \
4753 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4754#include "clang/Basic/BuiltinsARM64.def"
4755};
James Molloy5e73df52014-04-16 15:06:20 +00004756
4757class ARM64leTargetInfo : public ARM64TargetInfo {
4758 void setDescriptionString() override {
4759 if (getTriple().isOSBinFormatMachO())
4760 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4761 else
4762 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4763 }
4764
4765public:
4766 ARM64leTargetInfo(const llvm::Triple &Triple)
4767 : ARM64TargetInfo(Triple) {
4768 BigEndian = false;
4769 }
4770 void getTargetDefines(const LangOptions &Opts,
4771 MacroBuilder &Builder) const override {
4772 Builder.defineMacro("__AARCH64EL__");
4773 ARM64TargetInfo::getTargetDefines(Opts, Builder);
4774 }
4775};
4776
4777class ARM64beTargetInfo : public ARM64TargetInfo {
4778 void setDescriptionString() override {
4779 assert(!getTriple().isOSBinFormatMachO());
4780 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4781 }
4782
4783public:
4784 ARM64beTargetInfo(const llvm::Triple &Triple)
4785 : ARM64TargetInfo(Triple) { }
4786 void getTargetDefines(const LangOptions &Opts,
4787 MacroBuilder &Builder) const override {
4788 Builder.defineMacro("__AARCH64EB__");
4789 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4790 Builder.defineMacro("__ARM_BIG_ENDIAN");
4791 ARM64TargetInfo::getTargetDefines(Opts, Builder);
4792 }
4793};
Tim Northovera2ee4332014-03-29 15:09:45 +00004794} // end anonymous namespace.
4795
4796namespace {
James Molloy5e73df52014-04-16 15:06:20 +00004797class DarwinARM64TargetInfo : public DarwinTargetInfo<ARM64leTargetInfo> {
4798protected:
4799 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4800 MacroBuilder &Builder) const override {
4801 Builder.defineMacro("__AARCH64_SIMD__");
4802 Builder.defineMacro("__ARM64_ARCH_8__");
4803 Builder.defineMacro("__ARM_NEON__");
4804 Builder.defineMacro("__LITTLE_ENDIAN__");
4805 Builder.defineMacro("__REGISTER_PREFIX__", "");
4806 Builder.defineMacro("__arm64", "1");
4807 Builder.defineMacro("__arm64__", "1");
4808
4809 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4810 }
4811
Tim Northovera2ee4332014-03-29 15:09:45 +00004812public:
4813 DarwinARM64TargetInfo(const llvm::Triple &Triple)
James Molloy5e73df52014-04-16 15:06:20 +00004814 : DarwinTargetInfo<ARM64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004815 Int64Type = SignedLongLong;
4816 WCharType = SignedInt;
4817 UseSignedCharForObjCBool = false;
4818
4819 LongDoubleWidth = LongDoubleAlign = 64;
4820 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4821
4822 TheCXXABI.set(TargetCXXABI::iOS64);
4823 }
4824
4825 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4826 return TargetInfo::CharPtrBuiltinVaList;
4827 }
4828};
4829} // end anonymous namespace
4830
4831namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004832// Hexagon abstract base class
4833class HexagonTargetInfo : public TargetInfo {
4834 static const Builtin::Info BuiltinInfo[];
4835 static const char * const GCCRegNames[];
4836 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4837 std::string CPU;
4838public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004839 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004840 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004841 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004842
4843 // {} in inline assembly are packet specifiers, not assembly variant
4844 // specifiers.
4845 NoAsmVariants = true;
4846 }
4847
Craig Topper3164f332014-03-11 03:39:26 +00004848 void getTargetBuiltins(const Builtin::Info *&Records,
4849 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004850 Records = BuiltinInfo;
4851 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4852 }
4853
Craig Topper3164f332014-03-11 03:39:26 +00004854 bool validateAsmConstraint(const char *&Name,
4855 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004856 return true;
4857 }
4858
Craig Topper3164f332014-03-11 03:39:26 +00004859 void getTargetDefines(const LangOptions &Opts,
4860 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004861
Craig Topper3164f332014-03-11 03:39:26 +00004862 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004863 return Feature == "hexagon";
4864 }
Craig Topper3164f332014-03-11 03:39:26 +00004865
4866 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004867 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004868 }
Craig Topper3164f332014-03-11 03:39:26 +00004869 void getGCCRegNames(const char * const *&Names,
4870 unsigned &NumNames) const override;
4871 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4872 unsigned &NumAliases) const override;
4873 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004874 return "";
4875 }
Sebastian Pop86500282012-01-13 20:37:10 +00004876
4877 static const char *getHexagonCPUSuffix(StringRef Name) {
4878 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004879 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004880 .Case("hexagonv5", "5")
Sebastian Pop86500282012-01-13 20:37:10 +00004881 .Default(0);
4882 }
4883
Craig Topper3164f332014-03-11 03:39:26 +00004884 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004885 if (!getHexagonCPUSuffix(Name))
4886 return false;
4887
Tony Linthicum76329bf2011-12-12 21:14:55 +00004888 CPU = Name;
4889 return true;
4890 }
4891};
4892
4893void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4894 MacroBuilder &Builder) const {
4895 Builder.defineMacro("qdsp6");
4896 Builder.defineMacro("__qdsp6", "1");
4897 Builder.defineMacro("__qdsp6__", "1");
4898
4899 Builder.defineMacro("hexagon");
4900 Builder.defineMacro("__hexagon", "1");
4901 Builder.defineMacro("__hexagon__", "1");
4902
4903 if(CPU == "hexagonv1") {
4904 Builder.defineMacro("__HEXAGON_V1__");
4905 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4906 if(Opts.HexagonQdsp6Compat) {
4907 Builder.defineMacro("__QDSP6_V1__");
4908 Builder.defineMacro("__QDSP6_ARCH__", "1");
4909 }
4910 }
4911 else if(CPU == "hexagonv2") {
4912 Builder.defineMacro("__HEXAGON_V2__");
4913 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4914 if(Opts.HexagonQdsp6Compat) {
4915 Builder.defineMacro("__QDSP6_V2__");
4916 Builder.defineMacro("__QDSP6_ARCH__", "2");
4917 }
4918 }
4919 else if(CPU == "hexagonv3") {
4920 Builder.defineMacro("__HEXAGON_V3__");
4921 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4922 if(Opts.HexagonQdsp6Compat) {
4923 Builder.defineMacro("__QDSP6_V3__");
4924 Builder.defineMacro("__QDSP6_ARCH__", "3");
4925 }
4926 }
4927 else if(CPU == "hexagonv4") {
4928 Builder.defineMacro("__HEXAGON_V4__");
4929 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4930 if(Opts.HexagonQdsp6Compat) {
4931 Builder.defineMacro("__QDSP6_V4__");
4932 Builder.defineMacro("__QDSP6_ARCH__", "4");
4933 }
4934 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004935 else if(CPU == "hexagonv5") {
4936 Builder.defineMacro("__HEXAGON_V5__");
4937 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4938 if(Opts.HexagonQdsp6Compat) {
4939 Builder.defineMacro("__QDSP6_V5__");
4940 Builder.defineMacro("__QDSP6_ARCH__", "5");
4941 }
4942 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004943}
4944
4945const char * const HexagonTargetInfo::GCCRegNames[] = {
4946 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4947 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4948 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4949 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4950 "p0", "p1", "p2", "p3",
4951 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4952};
4953
4954void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4955 unsigned &NumNames) const {
4956 Names = GCCRegNames;
4957 NumNames = llvm::array_lengthof(GCCRegNames);
4958}
4959
4960
4961const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4962 { { "sp" }, "r29" },
4963 { { "fp" }, "r30" },
4964 { { "lr" }, "r31" },
4965 };
4966
4967void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4968 unsigned &NumAliases) const {
4969 Aliases = GCCRegAliases;
4970 NumAliases = llvm::array_lengthof(GCCRegAliases);
4971}
4972
4973
4974const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4975#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4976#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4977 ALL_LANGUAGES },
4978#include "clang/Basic/BuiltinsHexagon.def"
4979};
4980}
4981
4982
Chris Lattner5ba61f02006-10-14 07:39:34 +00004983namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004984// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4985class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004986 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4987 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004988 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004989public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004990 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004991
Craig Topper3164f332014-03-11 03:39:26 +00004992 bool handleTargetFeatures(std::vector<std::string> &Features,
4993 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004994 SoftFloat = false;
4995 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4996 if (Features[i] == "+soft-float")
4997 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004998 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004999 }
Craig Topper3164f332014-03-11 03:39:26 +00005000 void getTargetDefines(const LangOptions &Opts,
5001 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005002 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005003 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005004
5005 if (SoftFloat)
5006 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005007 }
Craig Topper3164f332014-03-11 03:39:26 +00005008
5009 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005010 return llvm::StringSwitch<bool>(Feature)
5011 .Case("softfloat", SoftFloat)
5012 .Case("sparc", true)
5013 .Default(false);
5014 }
Craig Topper3164f332014-03-11 03:39:26 +00005015
5016 void getTargetBuiltins(const Builtin::Info *&Records,
5017 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005018 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005019 }
Craig Topper3164f332014-03-11 03:39:26 +00005020 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005021 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005022 }
Craig Topper3164f332014-03-11 03:39:26 +00005023 void getGCCRegNames(const char * const *&Names,
5024 unsigned &NumNames) const override;
5025 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5026 unsigned &NumAliases) const override;
5027 bool validateAsmConstraint(const char *&Name,
5028 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005029 // FIXME: Implement!
5030 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005031 }
Craig Topper3164f332014-03-11 03:39:26 +00005032 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005033 // FIXME: Implement!
5034 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005035 }
5036};
5037
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005038const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005039 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5040 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5041 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5042 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5043};
5044
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005045void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5046 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005047 Names = GCCRegNames;
5048 NumNames = llvm::array_lengthof(GCCRegNames);
5049}
5050
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005051const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005052 { { "g0" }, "r0" },
5053 { { "g1" }, "r1" },
5054 { { "g2" }, "r2" },
5055 { { "g3" }, "r3" },
5056 { { "g4" }, "r4" },
5057 { { "g5" }, "r5" },
5058 { { "g6" }, "r6" },
5059 { { "g7" }, "r7" },
5060 { { "o0" }, "r8" },
5061 { { "o1" }, "r9" },
5062 { { "o2" }, "r10" },
5063 { { "o3" }, "r11" },
5064 { { "o4" }, "r12" },
5065 { { "o5" }, "r13" },
5066 { { "o6", "sp" }, "r14" },
5067 { { "o7" }, "r15" },
5068 { { "l0" }, "r16" },
5069 { { "l1" }, "r17" },
5070 { { "l2" }, "r18" },
5071 { { "l3" }, "r19" },
5072 { { "l4" }, "r20" },
5073 { { "l5" }, "r21" },
5074 { { "l6" }, "r22" },
5075 { { "l7" }, "r23" },
5076 { { "i0" }, "r24" },
5077 { { "i1" }, "r25" },
5078 { { "i2" }, "r26" },
5079 { { "i3" }, "r27" },
5080 { { "i4" }, "r28" },
5081 { { "i5" }, "r29" },
5082 { { "i6", "fp" }, "r30" },
5083 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005084};
5085
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005086void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5087 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005088 Aliases = GCCRegAliases;
5089 NumAliases = llvm::array_lengthof(GCCRegAliases);
5090}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005091
5092// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5093class SparcV8TargetInfo : public SparcTargetInfo {
5094public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005095 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005096 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005097 }
5098
Craig Topper3164f332014-03-11 03:39:26 +00005099 void getTargetDefines(const LangOptions &Opts,
5100 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005101 SparcTargetInfo::getTargetDefines(Opts, Builder);
5102 Builder.defineMacro("__sparcv8");
5103 }
5104};
5105
5106// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5107class SparcV9TargetInfo : public SparcTargetInfo {
5108public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005109 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005110 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005111 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005112 // This is an LP64 platform.
5113 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005114
5115 // OpenBSD uses long long for int64_t and intmax_t.
5116 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
5117 IntMaxType = SignedLongLong;
5118 UIntMaxType = UnsignedLongLong;
5119 } else {
5120 IntMaxType = SignedLong;
5121 UIntMaxType = UnsignedLong;
5122 }
5123 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005124
5125 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5126 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5127 LongDoubleWidth = 128;
5128 LongDoubleAlign = 128;
5129 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005130 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005131 }
5132
Craig Topper3164f332014-03-11 03:39:26 +00005133 void getTargetDefines(const LangOptions &Opts,
5134 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005135 SparcTargetInfo::getTargetDefines(Opts, Builder);
5136 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005137 Builder.defineMacro("__arch64__");
5138 // Solaris and its derivative AuroraUX don't need these variants, but the
5139 // BSDs do.
5140 if (getTriple().getOS() != llvm::Triple::Solaris &&
5141 getTriple().getOS() != llvm::Triple::AuroraUX) {
5142 Builder.defineMacro("__sparc64__");
5143 Builder.defineMacro("__sparc_v9__");
5144 Builder.defineMacro("__sparcv9__");
5145 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005146 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005147
Craig Topper3164f332014-03-11 03:39:26 +00005148 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005149 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5150 .Case("v9", true)
5151 .Case("ultrasparc", true)
5152 .Case("ultrasparc3", true)
5153 .Case("niagara", true)
5154 .Case("niagara2", true)
5155 .Case("niagara3", true)
5156 .Case("niagara4", true)
5157 .Default(false);
5158
5159 // No need to store the CPU yet. There aren't any CPU-specific
5160 // macros to define.
5161 return CPUKnown;
5162 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005163};
5164
Gabor Greif49991682008-02-21 16:29:08 +00005165} // end anonymous namespace.
5166
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005167namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005168class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
5169public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005170 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
5171 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005172 SizeType = UnsignedInt;
5173 PtrDiffType = SignedInt;
5174 }
5175};
Torok Edwinb2b37c62009-06-30 17:10:35 +00005176class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005177public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005178 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5179 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005180 SizeType = UnsignedInt;
5181 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005182 }
5183};
5184} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005185
Chris Lattnerb781dc792008-05-08 05:58:21 +00005186namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005187class SystemZTargetInfo : public TargetInfo {
5188 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005189
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005190public:
5191 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5192 TLSSupported = true;
5193 IntWidth = IntAlign = 32;
5194 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5195 PointerWidth = PointerAlign = 64;
5196 LongDoubleWidth = 128;
5197 LongDoubleAlign = 64;
5198 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5199 MinGlobalAlign = 16;
5200 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5201 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5202 }
5203 void getTargetDefines(const LangOptions &Opts,
5204 MacroBuilder &Builder) const override {
5205 Builder.defineMacro("__s390__");
5206 Builder.defineMacro("__s390x__");
5207 Builder.defineMacro("__zarch__");
5208 Builder.defineMacro("__LONG_DOUBLE_128__");
5209 }
5210 void getTargetBuiltins(const Builtin::Info *&Records,
5211 unsigned &NumRecords) const override {
5212 // FIXME: Implement.
5213 Records = 0;
5214 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005215 }
5216
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005217 void getGCCRegNames(const char *const *&Names,
5218 unsigned &NumNames) const override;
5219 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5220 unsigned &NumAliases) const override {
5221 // No aliases.
5222 Aliases = 0;
5223 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005224 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005225 bool validateAsmConstraint(const char *&Name,
5226 TargetInfo::ConstraintInfo &info) const override;
5227 const char *getClobbers() const override {
5228 // FIXME: Is this really right?
5229 return "";
5230 }
5231 BuiltinVaListKind getBuiltinVaListKind() const override {
5232 return TargetInfo::SystemZBuiltinVaList;
5233 }
5234 bool setCPU(const std::string &Name) override {
5235 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5236 .Case("z10", true)
5237 .Case("z196", true)
5238 .Case("zEC12", true)
5239 .Default(false);
5240
5241 // No need to store the CPU yet. There aren't any CPU-specific
5242 // macros to define.
5243 return CPUKnown;
5244 }
5245};
5246
5247const char *const SystemZTargetInfo::GCCRegNames[] = {
5248 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5249 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5250 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5251 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5252};
5253
5254void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5255 unsigned &NumNames) const {
5256 Names = GCCRegNames;
5257 NumNames = llvm::array_lengthof(GCCRegNames);
5258}
5259
5260bool SystemZTargetInfo::
5261validateAsmConstraint(const char *&Name,
5262 TargetInfo::ConstraintInfo &Info) const {
5263 switch (*Name) {
5264 default:
5265 return false;
5266
5267 case 'a': // Address register
5268 case 'd': // Data register (equivalent to 'r')
5269 case 'f': // Floating-point register
5270 Info.setAllowsRegister();
5271 return true;
5272
5273 case 'I': // Unsigned 8-bit constant
5274 case 'J': // Unsigned 12-bit constant
5275 case 'K': // Signed 16-bit constant
5276 case 'L': // Signed 20-bit displacement (on all targets we support)
5277 case 'M': // 0x7fffffff
5278 return true;
5279
5280 case 'Q': // Memory with base and unsigned 12-bit displacement
5281 case 'R': // Likewise, plus an index
5282 case 'S': // Memory with base and signed 20-bit displacement
5283 case 'T': // Likewise, plus an index
5284 Info.setAllowsMemory();
5285 return true;
5286 }
5287}
Ulrich Weigand47445072013-05-06 16:26:41 +00005288}
5289
5290namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005291 class MSP430TargetInfo : public TargetInfo {
5292 static const char * const GCCRegNames[];
5293 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005294 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005295 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005296 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005297 IntWidth = 16; IntAlign = 16;
5298 LongWidth = 32; LongLongWidth = 64;
5299 LongAlign = LongLongAlign = 16;
5300 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005301 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005302 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005303 IntMaxType = SignedLongLong;
5304 UIntMaxType = UnsignedLongLong;
5305 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005306 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005307 SigAtomicType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005308 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005309 }
5310 void getTargetDefines(const LangOptions &Opts,
5311 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005312 Builder.defineMacro("MSP430");
5313 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005314 // FIXME: defines for different 'flavours' of MCU
5315 }
Craig Topper3164f332014-03-11 03:39:26 +00005316 void getTargetBuiltins(const Builtin::Info *&Records,
5317 unsigned &NumRecords) const override {
5318 // FIXME: Implement.
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005319 Records = 0;
5320 NumRecords = 0;
5321 }
Craig Topper3164f332014-03-11 03:39:26 +00005322 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005323 return Feature == "msp430";
5324 }
Craig Topper3164f332014-03-11 03:39:26 +00005325 void getGCCRegNames(const char * const *&Names,
5326 unsigned &NumNames) const override;
5327 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5328 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005329 // No aliases.
5330 Aliases = 0;
5331 NumAliases = 0;
5332 }
Craig Topper3164f332014-03-11 03:39:26 +00005333 bool validateAsmConstraint(const char *&Name,
5334 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005335 // No target constraints for now.
5336 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005337 }
Craig Topper3164f332014-03-11 03:39:26 +00005338 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005339 // FIXME: Is this really right?
5340 return "";
5341 }
Craig Topper3164f332014-03-11 03:39:26 +00005342 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005343 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005344 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005345 }
5346 };
5347
5348 const char * const MSP430TargetInfo::GCCRegNames[] = {
5349 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5350 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5351 };
5352
5353 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5354 unsigned &NumNames) const {
5355 Names = GCCRegNames;
5356 NumNames = llvm::array_lengthof(GCCRegNames);
5357 }
5358}
5359
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005360namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005361
Mike Stump11289f42009-09-09 15:08:12 +00005362 // LLVM and Clang cannot be used directly to output native binaries for
5363 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005364 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005365 //
5366 // TCE uses the llvm bitcode as input and uses it for generating customized
5367 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005368 // publicly available in http://tce.cs.tut.fi
5369
Eli Friedman1f191002011-10-07 19:51:42 +00005370 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5371 3, // opencl_global
5372 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005373 5, // opencl_constant
5374 0, // cuda_device
5375 0, // cuda_constant
5376 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005377 };
5378
Eli Friedmana9c3d712009-08-19 20:47:07 +00005379 class TCETargetInfo : public TargetInfo{
5380 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005381 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005382 TLSSupported = false;
5383 IntWidth = 32;
5384 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005385 PointerWidth = 32;
5386 IntAlign = 32;
5387 LongAlign = LongLongAlign = 32;
5388 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005389 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005390 SizeType = UnsignedInt;
5391 IntMaxType = SignedLong;
5392 UIntMaxType = UnsignedLong;
5393 IntPtrType = SignedInt;
5394 PtrDiffType = SignedInt;
5395 FloatWidth = 32;
5396 FloatAlign = 32;
5397 DoubleWidth = 32;
5398 DoubleAlign = 32;
5399 LongDoubleWidth = 32;
5400 LongDoubleAlign = 32;
5401 FloatFormat = &llvm::APFloat::IEEEsingle;
5402 DoubleFormat = &llvm::APFloat::IEEEsingle;
5403 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005404 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5405 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005406 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005407 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005408 }
5409
Craig Topper3164f332014-03-11 03:39:26 +00005410 void getTargetDefines(const LangOptions &Opts,
5411 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005412 DefineStd(Builder, "tce", Opts);
5413 Builder.defineMacro("__TCE__");
5414 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005415 }
Craig Topper3164f332014-03-11 03:39:26 +00005416 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005417 return Feature == "tce";
5418 }
Craig Topper3164f332014-03-11 03:39:26 +00005419
5420 void getTargetBuiltins(const Builtin::Info *&Records,
5421 unsigned &NumRecords) const override {}
5422 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005423 return "";
5424 }
Craig Topper3164f332014-03-11 03:39:26 +00005425 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005426 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005427 }
Craig Topper3164f332014-03-11 03:39:26 +00005428 void getGCCRegNames(const char * const *&Names,
5429 unsigned &NumNames) const override {}
5430 bool validateAsmConstraint(const char *&Name,
5431 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005432 return true;
5433 }
Craig Topper3164f332014-03-11 03:39:26 +00005434 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5435 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005436 };
5437}
5438
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005439namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005440class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005441 virtual void setDescriptionString() = 0;
5442
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005443 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005444 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005445 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005446 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005447 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005448 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005449 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005450 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005451 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005452 enum DspRevEnum {
5453 NoDSP, DSP1, DSP2
5454 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005455 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005456
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005457protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005458 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005459 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005460
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005461public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005462 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5463 const std::string &CPUStr)
5464 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005465 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005466 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005467
Craig Topper3164f332014-03-11 03:39:26 +00005468 const char *getABI() const override { return ABI.c_str(); }
5469 bool setABI(const std::string &Name) override = 0;
5470 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00005471 CPU = Name;
5472 return true;
5473 }
Craig Topper3164f332014-03-11 03:39:26 +00005474 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005475 // The backend enables certain ABI's by default according to the
5476 // architecture.
5477 // Disable both possible defaults so that we don't end up with multiple
5478 // ABI's selected and trigger an assertion.
5479 Features["o32"] = false;
5480 Features["n64"] = false;
5481
Eric Christopher0b26a612010-03-02 02:41:08 +00005482 Features[ABI] = true;
5483 Features[CPU] = true;
5484 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005485
Craig Topper3164f332014-03-11 03:39:26 +00005486 void getTargetDefines(const LangOptions &Opts,
5487 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005488 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005489 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005490 if (Opts.GNUMode)
5491 Builder.defineMacro("mips");
5492
Simon Atanasyan683535b2012-08-29 19:14:58 +00005493 Builder.defineMacro("__REGISTER_PREFIX__", "");
5494
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005495 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005496 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005497 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005498 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005499 case SoftFloat:
5500 Builder.defineMacro("__mips_soft_float", Twine(1));
5501 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005502 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005503
Simon Atanasyan16071912013-04-14 14:07:30 +00005504 if (IsSingleFloat)
5505 Builder.defineMacro("__mips_single_float", Twine(1));
5506
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005507 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5508 Builder.defineMacro("_MIPS_FPSET",
5509 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5510
Simon Atanasyan72244b62012-07-05 16:06:06 +00005511 if (IsMips16)
5512 Builder.defineMacro("__mips16", Twine(1));
5513
Simon Atanasyan60777612013-04-14 14:07:51 +00005514 if (IsMicromips)
5515 Builder.defineMacro("__mips_micromips", Twine(1));
5516
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005517 if (IsNan2008)
5518 Builder.defineMacro("__mips_nan2008", Twine(1));
5519
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005520 switch (DspRev) {
5521 default:
5522 break;
5523 case DSP1:
5524 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5525 Builder.defineMacro("__mips_dsp", Twine(1));
5526 break;
5527 case DSP2:
5528 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5529 Builder.defineMacro("__mips_dspr2", Twine(1));
5530 Builder.defineMacro("__mips_dsp", Twine(1));
5531 break;
5532 }
5533
Jack Carter44ff1e52013-08-12 17:20:29 +00005534 if (HasMSA)
5535 Builder.defineMacro("__mips_msa", Twine(1));
5536
Simon Atanasyan26f19672012-04-05 19:28:31 +00005537 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5538 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5539 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005540
5541 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5542 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005543 }
5544
Craig Topper3164f332014-03-11 03:39:26 +00005545 void getTargetBuiltins(const Builtin::Info *&Records,
5546 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005547 Records = BuiltinInfo;
5548 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005549 }
Craig Topper3164f332014-03-11 03:39:26 +00005550 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005551 return llvm::StringSwitch<bool>(Feature)
5552 .Case("mips", true)
5553 .Case("fp64", HasFP64)
5554 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005555 }
Craig Topper3164f332014-03-11 03:39:26 +00005556 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005557 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005558 }
Craig Topper3164f332014-03-11 03:39:26 +00005559 void getGCCRegNames(const char * const *&Names,
5560 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005561 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005562 // CPU register names
5563 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005564 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5565 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5566 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005567 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5568 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005569 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5570 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5571 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5572 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005573 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005574 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005575 "$fcc5","$fcc6","$fcc7",
5576 // MSA register names
5577 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5578 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5579 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5580 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5581 // MSA control register names
5582 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5583 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005584 };
5585 Names = GCCRegNames;
5586 NumNames = llvm::array_lengthof(GCCRegNames);
5587 }
Craig Topper3164f332014-03-11 03:39:26 +00005588 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5589 unsigned &NumAliases) const override = 0;
5590 bool validateAsmConstraint(const char *&Name,
5591 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005592 switch (*Name) {
5593 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005594 return false;
5595
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005596 case 'r': // CPU registers.
5597 case 'd': // Equivalent to "r" unless generating MIPS16 code.
5598 case 'y': // Equivalent to "r", backwards compatibility only.
5599 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005600 case 'c': // $25 for indirect jumps
5601 case 'l': // lo register
5602 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005603 Info.setAllowsRegister();
5604 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005605 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005606 Info.setAllowsMemory();
5607 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005608 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005609 }
5610
Craig Topper3164f332014-03-11 03:39:26 +00005611 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005612 // FIXME: Implement!
5613 return "";
5614 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005615
Craig Topper3164f332014-03-11 03:39:26 +00005616 bool handleTargetFeatures(std::vector<std::string> &Features,
5617 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005618 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005619 IsMicromips = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005620 IsNan2008 = false;
Simon Atanasyan16071912013-04-14 14:07:30 +00005621 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005622 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005623 DspRev = NoDSP;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005624 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005625
5626 for (std::vector<std::string>::iterator it = Features.begin(),
5627 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005628 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005629 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005630 else if (*it == "+soft-float")
5631 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005632 else if (*it == "+mips16")
5633 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005634 else if (*it == "+micromips")
5635 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005636 else if (*it == "+dsp")
5637 DspRev = std::max(DspRev, DSP1);
5638 else if (*it == "+dspr2")
5639 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005640 else if (*it == "+msa")
5641 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005642 else if (*it == "+fp64")
5643 HasFP64 = true;
5644 else if (*it == "-fp64")
5645 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005646 else if (*it == "+nan2008")
5647 IsNan2008 = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005648 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005649
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005650 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005651 std::vector<std::string>::iterator it =
5652 std::find(Features.begin(), Features.end(), "+soft-float");
5653 if (it != Features.end())
5654 Features.erase(it);
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005655 it = std::find(Features.begin(), Features.end(), "+nan2008");
5656 if (it != Features.end())
5657 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005658
Akira Hatanaka9064e362013-10-29 18:30:33 +00005659 setDescriptionString();
5660
Rafael Espindolaeb265472013-08-21 21:59:03 +00005661 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005662 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005663
Craig Topper3164f332014-03-11 03:39:26 +00005664 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005665 if (RegNo == 0) return 4;
5666 if (RegNo == 1) return 5;
5667 return -1;
5668 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005669};
5670
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005671const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5672#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5673#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5674 ALL_LANGUAGES },
5675#include "clang/Basic/BuiltinsMips.def"
5676};
5677
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005678class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005679public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005680 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005681 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005682 SizeType = UnsignedInt;
5683 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005684 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005685 }
Craig Topper3164f332014-03-11 03:39:26 +00005686 bool setABI(const std::string &Name) override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005687 if ((Name == "o32") || (Name == "eabi")) {
5688 ABI = Name;
5689 return true;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005690 } else if (Name == "32") {
5691 ABI = "o32";
5692 return true;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005693 } else
5694 return false;
5695 }
Craig Topper3164f332014-03-11 03:39:26 +00005696 void getTargetDefines(const LangOptions &Opts,
5697 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005698 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005699
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005700 Builder.defineMacro("__mips", "32");
5701
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005702 if (ABI == "o32") {
5703 Builder.defineMacro("__mips_o32");
5704 Builder.defineMacro("_ABIO32", "1");
5705 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5706 }
5707 else if (ABI == "eabi")
5708 Builder.defineMacro("__mips_eabi");
5709 else
David Blaikie83d382b2011-09-23 05:06:16 +00005710 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005711 }
Craig Topper3164f332014-03-11 03:39:26 +00005712 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5713 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005714 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5715 { { "at" }, "$1" },
5716 { { "v0" }, "$2" },
5717 { { "v1" }, "$3" },
5718 { { "a0" }, "$4" },
5719 { { "a1" }, "$5" },
5720 { { "a2" }, "$6" },
5721 { { "a3" }, "$7" },
5722 { { "t0" }, "$8" },
5723 { { "t1" }, "$9" },
5724 { { "t2" }, "$10" },
5725 { { "t3" }, "$11" },
5726 { { "t4" }, "$12" },
5727 { { "t5" }, "$13" },
5728 { { "t6" }, "$14" },
5729 { { "t7" }, "$15" },
5730 { { "s0" }, "$16" },
5731 { { "s1" }, "$17" },
5732 { { "s2" }, "$18" },
5733 { { "s3" }, "$19" },
5734 { { "s4" }, "$20" },
5735 { { "s5" }, "$21" },
5736 { { "s6" }, "$22" },
5737 { { "s7" }, "$23" },
5738 { { "t8" }, "$24" },
5739 { { "t9" }, "$25" },
5740 { { "k0" }, "$26" },
5741 { { "k1" }, "$27" },
5742 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005743 { { "sp","$sp" }, "$29" },
5744 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005745 { { "ra" }, "$31" }
5746 };
5747 Aliases = GCCRegAliases;
5748 NumAliases = llvm::array_lengthof(GCCRegAliases);
5749 }
5750};
5751
5752class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005753 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005754 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005755 }
5756
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005757public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005758 Mips32EBTargetInfo(const llvm::Triple &Triple)
5759 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005760 }
Craig Topper3164f332014-03-11 03:39:26 +00005761 void getTargetDefines(const LangOptions &Opts,
5762 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005763 DefineStd(Builder, "MIPSEB", Opts);
5764 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005765 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005766 }
5767};
5768
5769class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005770 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005771 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005772 }
5773
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005774public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005775 Mips32ELTargetInfo(const llvm::Triple &Triple)
5776 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005777 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005778 }
Craig Topper3164f332014-03-11 03:39:26 +00005779 void getTargetDefines(const LangOptions &Opts,
5780 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005781 DefineStd(Builder, "MIPSEL", Opts);
5782 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005783 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005784 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005785};
Akira Hatanakabef17452011-09-20 19:21:49 +00005786
5787class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005788public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005789 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005790 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005791 LongDoubleWidth = LongDoubleAlign = 128;
5792 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005793 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5794 LongDoubleWidth = LongDoubleAlign = 64;
5795 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5796 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005797 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005798 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005799 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005800 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005801
5802 void setN64ABITypes() {
5803 LongWidth = LongAlign = 64;
5804 PointerWidth = PointerAlign = 64;
5805 SizeType = UnsignedLong;
5806 PtrDiffType = SignedLong;
5807 }
5808
5809 void setN32ABITypes() {
5810 LongWidth = LongAlign = 32;
5811 PointerWidth = PointerAlign = 32;
5812 SizeType = UnsignedInt;
5813 PtrDiffType = SignedInt;
5814 }
5815
Craig Topper3164f332014-03-11 03:39:26 +00005816 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005817 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005818 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005819 ABI = Name;
5820 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005821 } else if (Name == "n64" || Name == "64") {
5822 setN64ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005823 ABI = "n64";
5824 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005825 }
5826 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005827 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005828
Craig Topper3164f332014-03-11 03:39:26 +00005829 void getTargetDefines(const LangOptions &Opts,
5830 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005831 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005832
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005833 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005834 Builder.defineMacro("__mips64");
5835 Builder.defineMacro("__mips64__");
5836
Akira Hatanakabef17452011-09-20 19:21:49 +00005837 if (ABI == "n32") {
5838 Builder.defineMacro("__mips_n32");
5839 Builder.defineMacro("_ABIN32", "2");
5840 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5841 }
5842 else if (ABI == "n64") {
5843 Builder.defineMacro("__mips_n64");
5844 Builder.defineMacro("_ABI64", "3");
5845 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5846 }
5847 else
David Blaikie83d382b2011-09-23 05:06:16 +00005848 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005849 }
Craig Topper3164f332014-03-11 03:39:26 +00005850 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5851 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005852 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5853 { { "at" }, "$1" },
5854 { { "v0" }, "$2" },
5855 { { "v1" }, "$3" },
5856 { { "a0" }, "$4" },
5857 { { "a1" }, "$5" },
5858 { { "a2" }, "$6" },
5859 { { "a3" }, "$7" },
5860 { { "a4" }, "$8" },
5861 { { "a5" }, "$9" },
5862 { { "a6" }, "$10" },
5863 { { "a7" }, "$11" },
5864 { { "t0" }, "$12" },
5865 { { "t1" }, "$13" },
5866 { { "t2" }, "$14" },
5867 { { "t3" }, "$15" },
5868 { { "s0" }, "$16" },
5869 { { "s1" }, "$17" },
5870 { { "s2" }, "$18" },
5871 { { "s3" }, "$19" },
5872 { { "s4" }, "$20" },
5873 { { "s5" }, "$21" },
5874 { { "s6" }, "$22" },
5875 { { "s7" }, "$23" },
5876 { { "t8" }, "$24" },
5877 { { "t9" }, "$25" },
5878 { { "k0" }, "$26" },
5879 { { "k1" }, "$27" },
5880 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005881 { { "sp","$sp" }, "$29" },
5882 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005883 { { "ra" }, "$31" }
5884 };
5885 Aliases = GCCRegAliases;
5886 NumAliases = llvm::array_lengthof(GCCRegAliases);
5887 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00005888
5889 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00005890};
5891
5892class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005893 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005894 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005895 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 +00005896 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005897 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005898
Akira Hatanakabef17452011-09-20 19:21:49 +00005899 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005900
Akira Hatanakabef17452011-09-20 19:21:49 +00005901public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005902 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005903 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005904 void getTargetDefines(const LangOptions &Opts,
5905 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005906 DefineStd(Builder, "MIPSEB", Opts);
5907 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005908 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005909 }
5910};
5911
5912class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005913 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005914 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005915 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 +00005916 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005917 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005918 }
5919public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005920 Mips64ELTargetInfo(const llvm::Triple &Triple)
5921 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005922 // Default ABI is n64.
5923 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005924 }
Craig Topper3164f332014-03-11 03:39:26 +00005925 void getTargetDefines(const LangOptions &Opts,
5926 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005927 DefineStd(Builder, "MIPSEL", Opts);
5928 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005929 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005930 }
5931};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005932} // end anonymous namespace.
5933
Ivan Krasindd7403e2011-08-24 20:22:22 +00005934namespace {
5935class PNaClTargetInfo : public TargetInfo {
5936public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005937 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005938 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005939 this->UserLabelPrefix = "";
5940 this->LongAlign = 32;
5941 this->LongWidth = 32;
5942 this->PointerAlign = 32;
5943 this->PointerWidth = 32;
5944 this->IntMaxType = TargetInfo::SignedLongLong;
5945 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5946 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005947 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005948 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005949 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005950 this->SizeType = TargetInfo::UnsignedInt;
5951 this->PtrDiffType = TargetInfo::SignedInt;
5952 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005953 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005954 }
5955
Craig Topper3164f332014-03-11 03:39:26 +00005956 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005957 }
Craig Toppere6f17d02014-03-11 04:07:52 +00005958 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005959 Builder.defineMacro("__le32__");
5960 Builder.defineMacro("__pnacl__");
5961 }
Craig Topper3164f332014-03-11 03:39:26 +00005962 void getTargetDefines(const LangOptions &Opts,
5963 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005964 getArchDefines(Opts, Builder);
5965 }
Craig Topper3164f332014-03-11 03:39:26 +00005966 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005967 return Feature == "pnacl";
5968 }
Craig Topper3164f332014-03-11 03:39:26 +00005969 void getTargetBuiltins(const Builtin::Info *&Records,
5970 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005971 }
Craig Topper3164f332014-03-11 03:39:26 +00005972 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005973 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005974 }
Craig Topper3164f332014-03-11 03:39:26 +00005975 void getGCCRegNames(const char * const *&Names,
5976 unsigned &NumNames) const override;
5977 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5978 unsigned &NumAliases) const override;
5979 bool validateAsmConstraint(const char *&Name,
5980 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005981 return false;
5982 }
5983
Craig Topper3164f332014-03-11 03:39:26 +00005984 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005985 return "";
5986 }
5987};
5988
5989void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5990 unsigned &NumNames) const {
5991 Names = NULL;
5992 NumNames = 0;
5993}
5994
5995void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5996 unsigned &NumAliases) const {
5997 Aliases = NULL;
5998 NumAliases = 0;
5999}
6000} // end anonymous namespace.
6001
Guy Benyeib798fc92012-12-11 21:38:14 +00006002namespace {
6003 static const unsigned SPIRAddrSpaceMap[] = {
6004 1, // opencl_global
6005 3, // opencl_local
6006 2, // opencl_constant
6007 0, // cuda_device
6008 0, // cuda_constant
6009 0 // cuda_shared
6010 };
6011 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006012 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006013 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006014 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6015 "SPIR target must use unknown OS");
6016 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6017 "SPIR target must use unknown environment type");
6018 BigEndian = false;
6019 TLSSupported = false;
6020 LongWidth = LongAlign = 64;
6021 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006022 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006023 // Define available target features
6024 // These must be defined in sorted order!
6025 NoAsmVariants = true;
6026 }
Craig Topper3164f332014-03-11 03:39:26 +00006027 void getTargetDefines(const LangOptions &Opts,
6028 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006029 DefineStd(Builder, "SPIR", Opts);
6030 }
Craig Topper3164f332014-03-11 03:39:26 +00006031 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006032 return Feature == "spir";
6033 }
Craig Topper3164f332014-03-11 03:39:26 +00006034
6035 void getTargetBuiltins(const Builtin::Info *&Records,
6036 unsigned &NumRecords) const override {}
6037 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006038 return "";
6039 }
Craig Topper3164f332014-03-11 03:39:26 +00006040 void getGCCRegNames(const char * const *&Names,
6041 unsigned &NumNames) const override {}
6042 bool validateAsmConstraint(const char *&Name,
6043 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006044 return true;
6045 }
Craig Topper3164f332014-03-11 03:39:26 +00006046 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6047 unsigned &NumAliases) const override {}
6048 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006049 return TargetInfo::VoidPtrBuiltinVaList;
6050 }
6051 };
6052
6053
6054 class SPIR32TargetInfo : public SPIRTargetInfo {
6055 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006056 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006057 PointerWidth = PointerAlign = 32;
6058 SizeType = TargetInfo::UnsignedInt;
6059 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6060 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006061 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6062 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006063 }
Craig Topper3164f332014-03-11 03:39:26 +00006064 void getTargetDefines(const LangOptions &Opts,
6065 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006066 DefineStd(Builder, "SPIR32", Opts);
6067 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006068 };
6069
6070 class SPIR64TargetInfo : public SPIRTargetInfo {
6071 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006072 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006073 PointerWidth = PointerAlign = 64;
6074 SizeType = TargetInfo::UnsignedLong;
6075 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006076 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6077 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006078 }
Craig Topper3164f332014-03-11 03:39:26 +00006079 void getTargetDefines(const LangOptions &Opts,
6080 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006081 DefineStd(Builder, "SPIR64", Opts);
6082 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006083 };
6084}
6085
Robert Lytton0e076492013-08-13 09:43:10 +00006086namespace {
6087class XCoreTargetInfo : public TargetInfo {
6088 static const Builtin::Info BuiltinInfo[];
6089public:
6090 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6091 BigEndian = false;
6092 NoAsmVariants = true;
6093 LongLongAlign = 32;
6094 SuitableAlign = 32;
6095 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006096 SizeType = UnsignedInt;
6097 PtrDiffType = SignedInt;
6098 IntPtrType = SignedInt;
6099 WCharType = UnsignedChar;
6100 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006101 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006102 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 +00006103 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006104 }
Craig Topper3164f332014-03-11 03:39:26 +00006105 void getTargetDefines(const LangOptions &Opts,
6106 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006107 Builder.defineMacro("__XS1B__");
6108 }
Craig Topper3164f332014-03-11 03:39:26 +00006109 void getTargetBuiltins(const Builtin::Info *&Records,
6110 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006111 Records = BuiltinInfo;
6112 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6113 }
Craig Topper3164f332014-03-11 03:39:26 +00006114 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006115 return TargetInfo::VoidPtrBuiltinVaList;
6116 }
Craig Topper3164f332014-03-11 03:39:26 +00006117 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006118 return "";
6119 }
Craig Topper3164f332014-03-11 03:39:26 +00006120 void getGCCRegNames(const char * const *&Names,
6121 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006122 static const char * const GCCRegNames[] = {
6123 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6124 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6125 };
6126 Names = GCCRegNames;
6127 NumNames = llvm::array_lengthof(GCCRegNames);
6128 }
Craig Topper3164f332014-03-11 03:39:26 +00006129 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6130 unsigned &NumAliases) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006131 Aliases = NULL;
6132 NumAliases = 0;
6133 }
Craig Topper3164f332014-03-11 03:39:26 +00006134 bool validateAsmConstraint(const char *&Name,
6135 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006136 return false;
6137 }
Craig Topper3164f332014-03-11 03:39:26 +00006138 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006139 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6140 return (RegNo < 2)? RegNo : -1;
6141 }
Robert Lytton0e076492013-08-13 09:43:10 +00006142};
6143
6144const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6145#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6146#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6147 ALL_LANGUAGES },
6148#include "clang/Basic/BuiltinsXCore.def"
6149};
6150} // end anonymous namespace.
6151
Ivan Krasindd7403e2011-08-24 20:22:22 +00006152
Chris Lattner5ba61f02006-10-14 07:39:34 +00006153//===----------------------------------------------------------------------===//
6154// Driver code
6155//===----------------------------------------------------------------------===//
6156
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006157static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006158 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006159
Daniel Dunbar52322032009-08-18 05:47:58 +00006160 switch (Triple.getArch()) {
6161 default:
6162 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00006163
Tim Northovera2ee4332014-03-29 15:09:45 +00006164 case llvm::Triple::arm64:
6165 if (Triple.isOSDarwin())
6166 return new DarwinARM64TargetInfo(Triple);
6167
6168 switch (os) {
6169 case llvm::Triple::Linux:
James Molloy5e73df52014-04-16 15:06:20 +00006170 return new LinuxTargetInfo<ARM64leTargetInfo>(Triple);
6171 case llvm::Triple::NetBSD:
6172 return new NetBSDTargetInfo<ARM64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006173 default:
James Molloy5e73df52014-04-16 15:06:20 +00006174 return new ARM64leTargetInfo(Triple);
6175 }
6176
6177 case llvm::Triple::arm64_be:
6178 switch (os) {
6179 case llvm::Triple::Linux:
6180 return new LinuxTargetInfo<ARM64beTargetInfo>(Triple);
6181 case llvm::Triple::NetBSD:
6182 return new NetBSDTargetInfo<ARM64beTargetInfo>(Triple);
6183 default:
6184 return new ARM64beTargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006185 }
6186
Robert Lytton0e076492013-08-13 09:43:10 +00006187 case llvm::Triple::xcore:
6188 return new XCoreTargetInfo(Triple);
6189
Tony Linthicum76329bf2011-12-12 21:14:55 +00006190 case llvm::Triple::hexagon:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006191 return new HexagonTargetInfo(Triple);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006192
Tim Northover9bb857a2013-01-31 12:13:10 +00006193 case llvm::Triple::aarch64:
6194 switch (os) {
6195 case llvm::Triple::Linux:
Christian Pirker9b019ae2014-02-25 13:51:00 +00006196 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
Joerg Sonnenberger98534392014-01-13 18:25:15 +00006197 case llvm::Triple::NetBSD:
Christian Pirker9b019ae2014-02-25 13:51:00 +00006198 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006199 default:
Christian Pirker9b019ae2014-02-25 13:51:00 +00006200 return new AArch64leTargetInfo(Triple);
6201 }
6202
6203 case llvm::Triple::aarch64_be:
6204 switch (os) {
6205 case llvm::Triple::Linux:
6206 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
6207 case llvm::Triple::NetBSD:
6208 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
6209 default:
6210 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006211 }
6212
Daniel Dunbar52322032009-08-18 05:47:58 +00006213 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006214 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006215 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006216 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006217
Daniel Dunbar52322032009-08-18 05:47:58 +00006218 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006219 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006220 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006221 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006222 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006223 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006224 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006225 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006226 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006227 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006228 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006229 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006230 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006231 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006232 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006233 case llvm::Triple::Win32:
6234 switch (Triple.getEnvironment()) {
6235 default:
6236 return new ARMleTargetInfo(Triple);
6237 case llvm::Triple::Itanium:
6238 return new ItaniumWindowsARMleTargetInfo(Triple);
6239 case llvm::Triple::MSVC:
6240 return new MicrosoftARMleTargetInfo(Triple);
6241 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006242 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006243 return new ARMleTargetInfo(Triple);
6244 }
6245
6246 case llvm::Triple::armeb:
6247 case llvm::Triple::thumbeb:
6248 if (Triple.isOSDarwin())
6249 return new DarwinARMTargetInfo(Triple);
6250
6251 switch (os) {
6252 case llvm::Triple::Linux:
6253 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6254 case llvm::Triple::FreeBSD:
6255 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6256 case llvm::Triple::NetBSD:
6257 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6258 case llvm::Triple::OpenBSD:
6259 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6260 case llvm::Triple::Bitrig:
6261 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6262 case llvm::Triple::RTEMS:
6263 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6264 case llvm::Triple::NaCl:
6265 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6266 default:
6267 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006268 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006269
Daniel Dunbar52322032009-08-18 05:47:58 +00006270 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006271 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006272
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006273 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006274 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006275 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006276 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006277 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006278 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006279 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006280 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006281 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006282 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006283 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006284 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006285 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006286
6287 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006288 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006289 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006290 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006291 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006292 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006293 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006294 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006295 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006296 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006297 case llvm::Triple::NaCl:
6298 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006299 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006300 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006301 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006302
Akira Hatanakabef17452011-09-20 19:21:49 +00006303 case llvm::Triple::mips64:
6304 switch (os) {
6305 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006306 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006307 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006308 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006309 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006310 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006311 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006312 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006313 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006314 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006315 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006316 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006317 }
6318
6319 case llvm::Triple::mips64el:
6320 switch (os) {
6321 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006322 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006323 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006324 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006325 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006326 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006327 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006328 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006329 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006330 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006331 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006332 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006333 }
6334
Ivan Krasindd7403e2011-08-24 20:22:22 +00006335 case llvm::Triple::le32:
6336 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006337 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006338 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006339 default:
6340 return NULL;
6341 }
6342
Daniel Dunbar52322032009-08-18 05:47:58 +00006343 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006344 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006345 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006346 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006347 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006348 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006349 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006350 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006351 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006352 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006353 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006354 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006355 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006356 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006357 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006358 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006359 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006360
6361 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006362 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006363 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006364 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006365 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006366 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006367 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006368 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006369 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006370 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006371 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006372 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006373 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006374 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006375 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006376
Bill Schmidt778d3872013-07-26 01:36:11 +00006377 case llvm::Triple::ppc64le:
6378 switch (os) {
6379 case llvm::Triple::Linux:
6380 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6381 default:
6382 return new PPC64TargetInfo(Triple);
6383 }
6384
Peter Collingbournec947aae2012-05-20 23:28:41 +00006385 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006386 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006387 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006388 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006389
Eli Friedmand13b41e2012-10-12 23:32:00 +00006390 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006391 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006392
Daniel Dunbar52322032009-08-18 05:47:58 +00006393 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006394 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006395 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006396 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006397 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006398 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006399 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006400 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006401 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006402 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006403 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006404 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006405 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006406 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006407 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006408 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006409 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006410
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006411 case llvm::Triple::sparcv9:
6412 switch (os) {
6413 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006414 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006415 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006416 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006417 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006418 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006419 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006420 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006421 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006422 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006423 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006424 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006425 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006426 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006427 }
6428
Ulrich Weigand47445072013-05-06 16:26:41 +00006429 case llvm::Triple::systemz:
6430 switch (os) {
6431 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006432 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006433 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006434 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006435 }
6436
Eli Friedmana9c3d712009-08-19 20:47:07 +00006437 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006438 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006439
Daniel Dunbar52322032009-08-18 05:47:58 +00006440 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006441 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006442 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006443
Daniel Dunbar52322032009-08-18 05:47:58 +00006444 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00006445 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006446 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006447 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006448 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006449 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006450 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006451 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006452 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006453 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006454 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006455 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006456 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006457 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006458 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006459 case llvm::Triple::KFreeBSD:
6460 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006461 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006462 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006463 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006464 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006465 case llvm::Triple::Win32: {
6466 switch (Triple.getEnvironment()) {
6467 default:
6468 return new X86_32TargetInfo(Triple);
6469 case llvm::Triple::Cygnus:
6470 return new CygwinX86_32TargetInfo(Triple);
6471 case llvm::Triple::GNU:
6472 return new MinGWX86_32TargetInfo(Triple);
6473 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006474 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006475 }
6476 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006477 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006478 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006479 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006480 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006481 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006482 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006483 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006484 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006485 }
6486
6487 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006488 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006489 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006490
Daniel Dunbar52322032009-08-18 05:47:58 +00006491 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00006492 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006493 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006494 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006495 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006496 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006497 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006498 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006499 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006500 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006501 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006502 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006503 return new BitrigX86_64TargetInfo(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_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006506 case llvm::Triple::KFreeBSD:
6507 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006508 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006509 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006510 case llvm::Triple::Win32: {
6511 switch (Triple.getEnvironment()) {
6512 default:
6513 return new X86_64TargetInfo(Triple);
6514 case llvm::Triple::GNU:
6515 return new MinGWX86_64TargetInfo(Triple);
6516 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006517 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006518 }
6519 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006520 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006521 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006522 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006523 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006524 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006525
6526 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006527 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006528 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00006529 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006530 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006531 }
6532 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006533 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006534 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00006535 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006536 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006537 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006538 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006539}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006540
6541/// CreateTargetInfo - Return the target info object for the specified target
6542/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00006543TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregorf8715de2012-11-16 04:24:59 +00006544 TargetOptions *Opts) {
6545 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006546
6547 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006548 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006549 if (!Target) {
6550 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
6551 return 0;
6552 }
Douglas Gregorbc10b9f2012-10-15 16:45:32 +00006553 Target->setTargetOpts(Opts);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006554
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006555 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006556 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6557 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006558 return 0;
6559 }
6560
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006561 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006562 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6563 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006564 return 0;
6565 }
6566
Rafael Espindolaeb265472013-08-21 21:59:03 +00006567 // Set the fp math unit.
6568 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6569 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
6570 return 0;
6571 }
6572
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006573 // Compute the default target features, we need the target to handle this
6574 // because features may have dependencies on one another.
6575 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006576 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006577
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006578 // Apply the user specified deltas.
6579 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6580 I < N; ++I) {
6581 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006582 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006583 bool Enabled = Name[0] == '+';
6584 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006585 }
6586
6587 // Add the features to the compile options.
6588 //
6589 // FIXME: If we are completely confident that we have the right set, we only
6590 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006591 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006592 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6593 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006594 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006595 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Rafael Espindolaeb265472013-08-21 21:59:03 +00006596 return 0;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006597
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006598 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006599}