blob: 6df7b95b29e346b8b82197943bc6a9bad14076bd [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 Dunbarb9bbd542009-11-15 06:48:46 +000023#include "llvm/ADT/OwningPtr.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000028#include "llvm/IR/Type.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
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) {}
Torok Edwinb2b37c62009-06-30 17:10:35 +000077 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000078 MacroBuilder &Builder) const {
79 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:
Daniel Dunbar40165182009-08-24 09:10:05 +0000178 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000179 MacroBuilder &Builder) const {
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
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000190 virtual std::string isValidSectionSpecifier(StringRef SR) const {
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
Anders Carlsson851318a2010-06-08 22:47:50 +0000199 virtual const char *getStaticInitSectionSpecifier() const {
200 // 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.
207 virtual bool hasProtectedVisibility() const {
208 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:
Daniel Dunbar40165182009-08-24 09:10:05 +0000217 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000218 MacroBuilder &Builder) const {
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:
Daniel Dunbar40165182009-08-24 09:10:05 +0000246 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000247 MacroBuilder &Builder) const {
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:
293 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
294 MacroBuilder &Builder) const {
295 // 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:
316 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
317 MacroBuilder &Builder) const {
318 // 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:
Daniel Dunbar40165182009-08-24 09:10:05 +0000340 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000341 MacroBuilder &Builder) const {
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;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000358 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000359
360 virtual const char *getStaticInitSectionSpecifier() const {
361 return ".text.startup";
362 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000363};
364
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000365// NetBSD Target
366template<typename Target>
367class NetBSDTargetInfo : public OSTargetInfo<Target> {
368protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000369 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000370 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000371 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000372 Builder.defineMacro("__NetBSD__");
373 Builder.defineMacro("__unix__");
374 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000375 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000376 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000377 }
378public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000379 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
380 this->UserLabelPrefix = "";
381 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000382};
383
Torok Edwinb2b37c62009-06-30 17:10:35 +0000384// OpenBSD Target
385template<typename Target>
386class OpenBSDTargetInfo : public OSTargetInfo<Target> {
387protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000388 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000389 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000390 // OpenBSD defines; list based off of gcc output
391
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000392 Builder.defineMacro("__OpenBSD__");
393 DefineStd(Builder, "unix", Opts);
394 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000395 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000396 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000397 }
398public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000399 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
400 this->UserLabelPrefix = "";
401 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000402
Eli Friedman3715d1f2011-12-15 02:15:56 +0000403 switch (Triple.getArch()) {
404 default:
405 case llvm::Triple::x86:
406 case llvm::Triple::x86_64:
407 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000408 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000409 this->MCountName = "__mcount";
410 break;
411 case llvm::Triple::mips64:
412 case llvm::Triple::mips64el:
413 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000414 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000415 this->MCountName = "_mcount";
416 break;
417 }
418 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000419};
420
Eli Friedman9fa28852012-08-08 23:57:20 +0000421// Bitrig Target
422template<typename Target>
423class BitrigTargetInfo : public OSTargetInfo<Target> {
424protected:
425 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
426 MacroBuilder &Builder) const {
427 // Bitrig defines; list based off of gcc output
428
429 Builder.defineMacro("__Bitrig__");
430 DefineStd(Builder, "unix", Opts);
431 Builder.defineMacro("__ELF__");
432 if (Opts.POSIXThreads)
433 Builder.defineMacro("_REENTRANT");
434 }
435public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000436 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
437 this->UserLabelPrefix = "";
438 this->TLSSupported = false;
439 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000440 }
441};
442
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000443// PSP Target
444template<typename Target>
445class PSPTargetInfo : public OSTargetInfo<Target> {
446protected:
447 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000448 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000449 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000450 Builder.defineMacro("PSP");
451 Builder.defineMacro("_PSP");
452 Builder.defineMacro("__psp__");
453 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000454 }
455public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000456 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000457 this->UserLabelPrefix = "";
458 }
459};
460
John Thompsone467e192009-11-19 17:18:50 +0000461// PS3 PPU Target
462template<typename Target>
463class PS3PPUTargetInfo : public OSTargetInfo<Target> {
464protected:
465 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000466 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000467 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000468 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000469 Builder.defineMacro("__PPU__");
470 Builder.defineMacro("__CELLOS_LV2__");
471 Builder.defineMacro("__ELF__");
472 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000473 Builder.defineMacro("_ARCH_PPC64");
474 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000475 }
476public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000477 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000478 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000479 this->LongWidth = this->LongAlign = 32;
480 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000481 this->IntMaxType = TargetInfo::SignedLongLong;
482 this->UIntMaxType = TargetInfo::UnsignedLongLong;
483 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000484 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000485 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000486 }
487};
488
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000489// AuroraUX target
490template<typename Target>
491class AuroraUXTargetInfo : public OSTargetInfo<Target> {
492protected:
493 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000494 MacroBuilder &Builder) const {
495 DefineStd(Builder, "sun", Opts);
496 DefineStd(Builder, "unix", Opts);
497 Builder.defineMacro("__ELF__");
498 Builder.defineMacro("__svr4__");
499 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000500 }
501public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000502 AuroraUXTargetInfo(const llvm::Triple &Triple)
503 : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000504 this->UserLabelPrefix = "";
505 this->WCharType = this->SignedLong;
506 // FIXME: WIntType should be SignedLong
507 }
508};
509
Torok Edwinb2b37c62009-06-30 17:10:35 +0000510// Solaris target
511template<typename Target>
512class SolarisTargetInfo : public OSTargetInfo<Target> {
513protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000514 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000515 MacroBuilder &Builder) const {
516 DefineStd(Builder, "sun", Opts);
517 DefineStd(Builder, "unix", Opts);
518 Builder.defineMacro("__ELF__");
519 Builder.defineMacro("__svr4__");
520 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000521 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
522 // newer, but to 500 for everything else. feature_test.h has a check to
523 // ensure that you are not using C99 with an old version of X/Open or C89
524 // with a new version.
525 if (Opts.C99 || Opts.C11)
526 Builder.defineMacro("_XOPEN_SOURCE", "600");
527 else
528 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000529 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000530 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000531 Builder.defineMacro("_LARGEFILE_SOURCE");
532 Builder.defineMacro("_LARGEFILE64_SOURCE");
533 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000534 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000535 }
536public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000537 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000538 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000539 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000540 // FIXME: WIntType should be SignedLong
541 }
542};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000543
544// Windows target
545template<typename Target>
546class WindowsTargetInfo : public OSTargetInfo<Target> {
547protected:
548 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
549 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000550 Builder.defineMacro("_WIN32");
551 }
552 void getVisualStudioDefines(const LangOptions &Opts,
553 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000554 if (Opts.CPlusPlus) {
555 if (Opts.RTTI)
556 Builder.defineMacro("_CPPRTTI");
557
558 if (Opts.Exceptions)
559 Builder.defineMacro("_CPPUNWIND");
560 }
561
562 if (!Opts.CharIsSigned)
563 Builder.defineMacro("_CHAR_UNSIGNED");
564
565 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
566 // but it works for now.
567 if (Opts.POSIXThreads)
568 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000569
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000570 if (Opts.MSCVersion != 0)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000571 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000572
Francois Pichet0706d202011-09-17 17:15:52 +0000573 if (Opts.MicrosoftExt) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000574 Builder.defineMacro("_MSC_EXTENSIONS");
575
Richard Smith2bf7fdb2013-01-02 11:42:31 +0000576 if (Opts.CPlusPlus11) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000577 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
578 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
579 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
580 }
581 }
582
583 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000584 }
585
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000586public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000587 WindowsTargetInfo(const llvm::Triple &Triple)
588 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000589};
590
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000591template <typename Target>
592class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000593protected:
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000594 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
595 MacroBuilder &Builder) const {
596 if (Opts.POSIXThreads)
597 Builder.defineMacro("_REENTRANT");
598 if (Opts.CPlusPlus)
599 Builder.defineMacro("_GNU_SOURCE");
600
601 DefineStd(Builder, "unix", Opts);
602 Builder.defineMacro("__ELF__");
603 Builder.defineMacro("__native_client__");
604 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000605
606public:
607 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000608 this->UserLabelPrefix = "";
609 this->LongAlign = 32;
610 this->LongWidth = 32;
611 this->PointerAlign = 32;
612 this->PointerWidth = 32;
613 this->IntMaxType = TargetInfo::SignedLongLong;
614 this->UIntMaxType = TargetInfo::UnsignedLongLong;
615 this->Int64Type = TargetInfo::SignedLongLong;
616 this->DoubleAlign = 64;
617 this->LongDoubleWidth = 64;
618 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000619 this->LongLongWidth = 64;
620 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000621 this->SizeType = TargetInfo::UnsignedInt;
622 this->PtrDiffType = TargetInfo::SignedInt;
623 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000624 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000625 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000626 if (Triple.getArch() == llvm::Triple::arm) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000627 this->DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000628 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000629 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000630 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000631 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000632 } else if (Triple.getArch() == llvm::Triple::mipsel) {
633 // Handled on mips' setDescriptionString.
634 } else {
635 assert(Triple.getArch() == llvm::Triple::le32);
636 this->DescriptionString = "e-p:32:32-i64:64";
637 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000638 }
Derek Schuffa2020962012-10-16 22:30:41 +0000639 virtual typename Target::CallingConvCheckResult checkCallingConvention(
640 CallingConv CC) const {
641 return CC == CC_PnaclCall ? Target::CCCR_OK :
642 Target::checkCallingConvention(CC);
643 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000644};
Mike Stump11289f42009-09-09 15:08:12 +0000645} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000646
Chris Lattner09d98f52008-10-05 21:50:58 +0000647//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000648// Specific target implementations.
649//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000650
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000651namespace {
652// PPC abstract base class
653class PPCTargetInfo : public TargetInfo {
654 static const Builtin::Info BuiltinInfo[];
655 static const char * const GCCRegNames[];
656 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000657 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000658
659 // Target cpu features.
660 bool HasVSX;
661
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000662public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000663 PPCTargetInfo(const llvm::Triple &Triple)
664 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000665 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000666 LongDoubleWidth = LongDoubleAlign = 128;
667 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
668 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000669
Hal Finkel6b984f02012-07-03 16:51:04 +0000670 /// \brief Flags for architecture specific defines.
671 typedef enum {
672 ArchDefineNone = 0,
673 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
674 ArchDefinePpcgr = 1 << 1,
675 ArchDefinePpcsq = 1 << 2,
676 ArchDefine440 = 1 << 3,
677 ArchDefine603 = 1 << 4,
678 ArchDefine604 = 1 << 5,
679 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000680 ArchDefinePwr5 = 1 << 7,
681 ArchDefinePwr5x = 1 << 8,
682 ArchDefinePwr6 = 1 << 9,
683 ArchDefinePwr6x = 1 << 10,
684 ArchDefinePwr7 = 1 << 11,
685 ArchDefineA2 = 1 << 12,
686 ArchDefineA2q = 1 << 13
Hal Finkel6b984f02012-07-03 16:51:04 +0000687 } ArchDefineTypes;
688
Bill Schmidt38378a02013-02-01 20:23:10 +0000689 // Note: GCC recognizes the following additional cpus:
690 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
691 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
692 // titan, rs64.
Hal Finkel8eb59282012-06-11 22:35:19 +0000693 virtual bool setCPU(const std::string &Name) {
694 bool CPUKnown = llvm::StringSwitch<bool>(Name)
695 .Case("generic", true)
696 .Case("440", true)
697 .Case("450", true)
698 .Case("601", true)
699 .Case("602", true)
700 .Case("603", true)
701 .Case("603e", true)
702 .Case("603ev", true)
703 .Case("604", true)
704 .Case("604e", true)
705 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000706 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000707 .Case("g3", true)
708 .Case("7400", true)
709 .Case("g4", true)
710 .Case("7450", true)
711 .Case("g4+", true)
712 .Case("750", true)
713 .Case("970", true)
714 .Case("g5", true)
715 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000716 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000717 .Case("e500mc", true)
718 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000719 .Case("power3", true)
720 .Case("pwr3", true)
721 .Case("power4", true)
722 .Case("pwr4", true)
723 .Case("power5", true)
724 .Case("pwr5", true)
725 .Case("power5x", true)
726 .Case("pwr5x", true)
727 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000728 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000729 .Case("power6x", true)
730 .Case("pwr6x", true)
731 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000732 .Case("pwr7", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000733 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000734 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000735 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000736 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000737 .Case("powerpc64le", true)
738 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000739 .Default(false);
740
741 if (CPUKnown)
742 CPU = Name;
743
744 return CPUKnown;
745 }
746
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000747 virtual void getTargetBuiltins(const Builtin::Info *&Records,
748 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000749 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000750 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000751 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000752
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000753 virtual bool isCLZForZeroUndef() const { return false; }
754
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000755 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000756 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000757
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000758 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
759
Eric Christopher3ff21b32013-10-16 21:26:26 +0000760 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000761 DiagnosticsEngine &Diags);
Douglas Gregor0070c0b2012-01-30 06:38:25 +0000762 virtual bool hasFeature(StringRef Feature) const;
763
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000764 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000765 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000766 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000767 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000768 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000769 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000770 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000771 default: return false;
772 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000773 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000774 case 'b': // Base register
775 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000776 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000777 break;
778 // FIXME: The following are added to allow parsing.
779 // I just took a guess at what the actions should be.
780 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000781 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000782 case 'v': // Altivec vector register
783 Info.setAllowsRegister();
784 break;
785 case 'w':
786 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000787 case 'd':// VSX vector register to hold vector double data
788 case 'f':// VSX vector register to hold vector float data
789 case 's':// VSX vector register to hold scalar float data
790 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000791 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000792 break;
793 default:
794 return false;
795 }
796 Info.setAllowsRegister();
797 Name++; // Skip over 'w'.
798 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000799 case 'h': // `MQ', `CTR', or `LINK' register
800 case 'q': // `MQ' register
801 case 'c': // `CTR' register
802 case 'l': // `LINK' register
803 case 'x': // `CR' register (condition register) number 0
804 case 'y': // `CR' register (condition register)
805 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000806 Info.setAllowsRegister();
807 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000808 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000809 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000810 // (use `L' instead for SImode constants)
811 case 'K': // Unsigned 16-bit constant
812 case 'L': // Signed 16-bit constant shifted left 16 bits
813 case 'M': // Constant larger than 31
814 case 'N': // Exact power of 2
815 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000816 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000817 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000818 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000819 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000820 break;
821 case 'm': // Memory operand. Note that on PowerPC targets, m can
822 // include addresses that update the base register. It
823 // is therefore only safe to use `m' in an asm statement
824 // if that asm statement accesses the operand exactly once.
825 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000826 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000827 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000828 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000829 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000830 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
831 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000832 // register to be updated.
833 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000834 if (Name[1] != 's')
835 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000836 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000837 // include any automodification of the base register. Unlike
838 // `m', this constraint can be used in asm statements that
839 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000840 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000841 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000842 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000843 break;
844 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000845 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000846 case 'Z': // Memory operand that is an indexed or indirect from a
847 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000848 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000849 Info.setAllowsMemory();
850 Info.setAllowsRegister();
851 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000852 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000853 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000854 // register (`p' is preferable for asm statements)
855 case 'S': // Constant suitable as a 64-bit mask operand
856 case 'T': // Constant suitable as a 32-bit mask operand
857 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000858 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000859 // instructions
860 case 'W': // Vector constant that does not require memory
861 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000862 break;
863 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000864 }
John Thompson07a61a42010-06-24 22:44:13 +0000865 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000866 }
Hal Finkelf7a07a52014-03-02 18:24:18 +0000867 virtual std::string convertConstraint(const char *&Constraint) const {
868 std::string R;
869 switch (*Constraint) {
870 case 'e':
871 case 'w':
872 // Two-character constraint; add "^" hint for later parsing.
873 R = std::string("^") + std::string(Constraint, 2);
874 Constraint++;
875 break;
876 default:
877 return TargetInfo::convertConstraint(Constraint);
878 }
879 return R;
880 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000881 virtual const char *getClobbers() const {
882 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000883 }
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000884 int getEHDataRegisterNumber(unsigned RegNo) const {
885 if (RegNo == 0) return 3;
886 if (RegNo == 1) return 4;
887 return -1;
888 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000889};
Anders Carlssonf511f642007-11-27 04:11:28 +0000890
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000891const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000892#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000893#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000894 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000895#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000896};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000897
Eric Christopher3ff21b32013-10-16 21:26:26 +0000898 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000899/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000900bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000901 DiagnosticsEngine &Diags) {
902 // Remember the maximum enabled sselevel.
903 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
904 // Ignore disabled features.
905 if (Features[i][0] == '-')
906 continue;
907
908 StringRef Feature = StringRef(Features[i]).substr(1);
909
910 if (Feature == "vsx") {
911 HasVSX = true;
912 continue;
913 }
914
915 // TODO: Finish this list and add an assert that we've handled them
916 // all.
917 }
918
919 return true;
920}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000921
Chris Lattnerecd49032009-03-02 22:27:17 +0000922/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
923/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000924void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000925 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000926 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000927 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000928 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000929 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000930 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000931 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000932 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000933 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000934 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000935 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000936 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000937 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000938
Chris Lattnerecd49032009-03-02 22:27:17 +0000939 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000940 if (getTriple().getArch() == llvm::Triple::ppc64le) {
941 Builder.defineMacro("_LITTLE_ENDIAN");
942 Builder.defineMacro("__LITTLE_ENDIAN__");
943 } else {
944 if (getTriple().getOS() != llvm::Triple::NetBSD &&
945 getTriple().getOS() != llvm::Triple::OpenBSD)
946 Builder.defineMacro("_BIG_ENDIAN");
947 Builder.defineMacro("__BIG_ENDIAN__");
948 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000949
Chris Lattnerecd49032009-03-02 22:27:17 +0000950 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000951 Builder.defineMacro("__NATURAL_ALIGNMENT__");
952 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000953
Chris Lattnerecd49032009-03-02 22:27:17 +0000954 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000955 if (LongDoubleWidth == 128)
956 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000957
John Thompsone467e192009-11-19 17:18:50 +0000958 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000959 Builder.defineMacro("__VEC__", "10206");
960 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000961 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000962
963 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000964 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
965 .Case("440", ArchDefineName)
966 .Case("450", ArchDefineName | ArchDefine440)
967 .Case("601", ArchDefineName)
968 .Case("602", ArchDefineName | ArchDefinePpcgr)
969 .Case("603", ArchDefineName | ArchDefinePpcgr)
970 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
971 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
972 .Case("604", ArchDefineName | ArchDefinePpcgr)
973 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
974 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +0000975 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +0000976 .Case("7400", ArchDefineName | ArchDefinePpcgr)
977 .Case("7450", ArchDefineName | ArchDefinePpcgr)
978 .Case("750", ArchDefineName | ArchDefinePpcgr)
979 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
980 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000981 .Case("a2", ArchDefineA2)
982 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +0000983 .Case("pwr3", ArchDefinePpcgr)
984 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
985 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
986 | ArchDefinePpcsq)
987 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
988 | ArchDefinePpcgr | ArchDefinePpcsq)
989 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
990 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
991 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
992 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
993 | ArchDefinePpcsq)
994 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
995 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
996 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
997 .Case("power3", ArchDefinePpcgr)
998 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
999 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1000 | ArchDefinePpcsq)
1001 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1002 | ArchDefinePpcgr | ArchDefinePpcsq)
1003 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1004 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1005 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1006 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1007 | ArchDefinePpcsq)
1008 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1009 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1010 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001011 .Default(ArchDefineNone);
1012
1013 if (defs & ArchDefineName)
1014 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1015 if (defs & ArchDefinePpcgr)
1016 Builder.defineMacro("_ARCH_PPCGR");
1017 if (defs & ArchDefinePpcsq)
1018 Builder.defineMacro("_ARCH_PPCSQ");
1019 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001020 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001021 if (defs & ArchDefine603)
1022 Builder.defineMacro("_ARCH_603");
1023 if (defs & ArchDefine604)
1024 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001025 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001026 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001027 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001028 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001029 if (defs & ArchDefinePwr5x)
1030 Builder.defineMacro("_ARCH_PWR5X");
1031 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001032 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001033 if (defs & ArchDefinePwr6x)
1034 Builder.defineMacro("_ARCH_PWR6X");
1035 if (defs & ArchDefinePwr7)
1036 Builder.defineMacro("_ARCH_PWR7");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001037 if (defs & ArchDefineA2)
1038 Builder.defineMacro("_ARCH_A2");
1039 if (defs & ArchDefineA2q) {
1040 Builder.defineMacro("_ARCH_A2Q");
1041 Builder.defineMacro("_ARCH_QP");
1042 }
1043
1044 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1045 Builder.defineMacro("__bg__");
1046 Builder.defineMacro("__THW_BLUEGENE__");
1047 Builder.defineMacro("__bgq__");
1048 Builder.defineMacro("__TOS_BGQ__");
1049 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001050
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001051 if (HasVSX)
1052 Builder.defineMacro("__VSX__");
1053
Bill Schmidt38378a02013-02-01 20:23:10 +00001054 // FIXME: The following are not yet generated here by Clang, but are
1055 // generated by GCC:
1056 //
1057 // _SOFT_FLOAT_
1058 // __RECIP_PRECISION__
1059 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001060 // __RECIP__
1061 // __RECIPF__
1062 // __RSQRTE__
1063 // __RSQRTEF__
1064 // _SOFT_DOUBLE_
1065 // __NO_LWSYNC__
1066 // __HAVE_BSWAP__
1067 // __LONGDOUBLE128
1068 // __CMODEL_MEDIUM__
1069 // __CMODEL_LARGE__
1070 // _CALL_SYSV
1071 // _CALL_DARWIN
1072 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001073}
1074
1075void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1076 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1077 .Case("7400", true)
1078 .Case("g4", true)
1079 .Case("7450", true)
1080 .Case("g4+", true)
1081 .Case("970", true)
1082 .Case("g5", true)
1083 .Case("pwr6", true)
1084 .Case("pwr7", true)
1085 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001086 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001087 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001088
1089 Features["qpx"] = (CPU == "a2q");
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001090}
1091
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001092bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1093 return Feature == "powerpc";
1094}
Chris Lattner17df24e2008-04-21 18:56:49 +00001095
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001096
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001097const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001098 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1099 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1100 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1101 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1102 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1103 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1104 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1105 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001106 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001107 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001108 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001109 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1110 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1111 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1112 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001113 "vrsave", "vscr",
1114 "spe_acc", "spefscr",
1115 "sfp"
1116};
Chris Lattner10a5b382007-01-29 05:24:35 +00001117
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001118void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001119 unsigned &NumNames) const {
1120 Names = GCCRegNames;
1121 NumNames = llvm::array_lengthof(GCCRegNames);
1122}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001123
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001124const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1125 // While some of these aliases do map to different registers
1126 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001127 { { "0" }, "r0" },
1128 { { "1"}, "r1" },
1129 { { "2" }, "r2" },
1130 { { "3" }, "r3" },
1131 { { "4" }, "r4" },
1132 { { "5" }, "r5" },
1133 { { "6" }, "r6" },
1134 { { "7" }, "r7" },
1135 { { "8" }, "r8" },
1136 { { "9" }, "r9" },
1137 { { "10" }, "r10" },
1138 { { "11" }, "r11" },
1139 { { "12" }, "r12" },
1140 { { "13" }, "r13" },
1141 { { "14" }, "r14" },
1142 { { "15" }, "r15" },
1143 { { "16" }, "r16" },
1144 { { "17" }, "r17" },
1145 { { "18" }, "r18" },
1146 { { "19" }, "r19" },
1147 { { "20" }, "r20" },
1148 { { "21" }, "r21" },
1149 { { "22" }, "r22" },
1150 { { "23" }, "r23" },
1151 { { "24" }, "r24" },
1152 { { "25" }, "r25" },
1153 { { "26" }, "r26" },
1154 { { "27" }, "r27" },
1155 { { "28" }, "r28" },
1156 { { "29" }, "r29" },
1157 { { "30" }, "r30" },
1158 { { "31" }, "r31" },
1159 { { "fr0" }, "f0" },
1160 { { "fr1" }, "f1" },
1161 { { "fr2" }, "f2" },
1162 { { "fr3" }, "f3" },
1163 { { "fr4" }, "f4" },
1164 { { "fr5" }, "f5" },
1165 { { "fr6" }, "f6" },
1166 { { "fr7" }, "f7" },
1167 { { "fr8" }, "f8" },
1168 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001169 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001170 { { "fr11" }, "f11" },
1171 { { "fr12" }, "f12" },
1172 { { "fr13" }, "f13" },
1173 { { "fr14" }, "f14" },
1174 { { "fr15" }, "f15" },
1175 { { "fr16" }, "f16" },
1176 { { "fr17" }, "f17" },
1177 { { "fr18" }, "f18" },
1178 { { "fr19" }, "f19" },
1179 { { "fr20" }, "f20" },
1180 { { "fr21" }, "f21" },
1181 { { "fr22" }, "f22" },
1182 { { "fr23" }, "f23" },
1183 { { "fr24" }, "f24" },
1184 { { "fr25" }, "f25" },
1185 { { "fr26" }, "f26" },
1186 { { "fr27" }, "f27" },
1187 { { "fr28" }, "f28" },
1188 { { "fr29" }, "f29" },
1189 { { "fr30" }, "f30" },
1190 { { "fr31" }, "f31" },
1191 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001192};
1193
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001194void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001195 unsigned &NumAliases) const {
1196 Aliases = GCCRegAliases;
1197 NumAliases = llvm::array_lengthof(GCCRegAliases);
1198}
1199} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001200
Chris Lattner5ba61f02006-10-14 07:39:34 +00001201namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001202class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001203public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001204 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001205 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001206
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001207 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001208 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001209 case llvm::Triple::FreeBSD:
1210 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001211 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001212 PtrDiffType = SignedInt;
1213 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001214 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001215 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001216 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001217 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001218
Roman Divacky3ffe7462012-03-13 19:20:17 +00001219 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1220 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001221 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001222 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001223
1224 // PPC32 supports atomics up to 4 bytes.
1225 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001226 }
1227
Meador Inge5d3fb222012-06-16 03:34:49 +00001228 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Roman Divacky965b0b72011-01-06 08:27:10 +00001229 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001230 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001231 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001232};
1233} // end anonymous namespace.
1234
Bill Schmidt778d3872013-07-26 01:36:11 +00001235// Note: ABI differences may eventually require us to have a separate
1236// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001237namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001238class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001239public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001240 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001241 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001242 IntMaxType = SignedLong;
1243 UIntMaxType = UnsignedLong;
1244 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001245
Roman Divacky3ffe7462012-03-13 19:20:17 +00001246 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1247 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001248 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001249 DescriptionString = "E-m:e-i64:64-n32:64";
Bill Schmidtcec4cb12012-10-29 14:59:24 +00001250 } else
Rafael Espindolac418ae92014-01-03 19:22:05 +00001251 DescriptionString = "E-m:e-i64:64-n32:64";
Benjamin Kramer37196de2012-11-17 17:30:55 +00001252
1253 // PPC64 supports atomics up to 8 bytes.
1254 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001255 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001256 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1257 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001258 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001259};
1260} // end anonymous namespace.
1261
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001262
1263namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001264class DarwinPPC32TargetInfo :
1265 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001266public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001267 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1268 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001269 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001270 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherc04fe092013-10-16 21:19:19 +00001271 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001272 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001273 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001274 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001275 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001276 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1277 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001278 }
1279};
1280
1281class DarwinPPC64TargetInfo :
1282 public DarwinTargetInfo<PPC64TargetInfo> {
1283public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001284 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1285 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001286 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001287 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001288 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001289 }
1290};
1291} // end anonymous namespace.
1292
Chris Lattner5ba61f02006-10-14 07:39:34 +00001293namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001294 static const unsigned NVPTXAddrSpaceMap[] = {
1295 1, // opencl_global
1296 3, // opencl_local
1297 4, // opencl_constant
1298 1, // cuda_device
1299 4, // cuda_constant
1300 3, // cuda_shared
1301 };
1302 class NVPTXTargetInfo : public TargetInfo {
1303 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001304 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001305 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001306 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001307 BigEndian = false;
1308 TLSSupported = false;
1309 LongWidth = LongAlign = 64;
1310 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001311 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001312 // Define available target features
1313 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001314 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001315 }
1316 virtual void getTargetDefines(const LangOptions &Opts,
1317 MacroBuilder &Builder) const {
1318 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001319 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001320 }
1321 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1322 unsigned &NumRecords) const {
Justin Holewinski83e96682012-05-24 17:43:12 +00001323 Records = BuiltinInfo;
1324 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001325 }
1326 virtual bool hasFeature(StringRef Feature) const {
Justin Holewinski83e96682012-05-24 17:43:12 +00001327 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001328 }
1329
1330 virtual void getGCCRegNames(const char * const *&Names,
1331 unsigned &NumNames) const;
1332 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1333 unsigned &NumAliases) const {
1334 // No aliases.
1335 Aliases = 0;
1336 NumAliases = 0;
1337 }
1338 virtual bool validateAsmConstraint(const char *&Name,
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001339 TargetInfo::ConstraintInfo &Info) const {
1340 switch (*Name) {
1341 default: return false;
1342 case 'c':
1343 case 'h':
1344 case 'r':
1345 case 'l':
1346 case 'f':
1347 case 'd':
1348 Info.setAllowsRegister();
1349 return true;
1350 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001351 }
1352 virtual const char *getClobbers() const {
1353 // FIXME: Is this really right?
1354 return "";
1355 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001356 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001357 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001358 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001359 }
1360 virtual bool setCPU(const std::string &Name) {
Justin Holewinski91203e82013-03-30 14:38:26 +00001361 bool Valid = llvm::StringSwitch<bool>(Name)
1362 .Case("sm_20", true)
1363 .Case("sm_21", true)
1364 .Case("sm_30", true)
1365 .Case("sm_35", true)
1366 .Default(false);
1367
1368 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001369 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001370 };
1371
1372 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1373#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1374#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1375 ALL_LANGUAGES },
1376#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001377 };
1378
1379 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1380 "r0"
1381 };
1382
1383 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1384 unsigned &NumNames) const {
1385 Names = GCCRegNames;
1386 NumNames = llvm::array_lengthof(GCCRegNames);
1387 }
1388
1389 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1390 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001391 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001392 PointerWidth = PointerAlign = 32;
Justin Holewinski83e96682012-05-24 17:43:12 +00001393 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001394 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001395 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001396 };
1397
1398 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1399 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001400 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001401 PointerWidth = PointerAlign = 64;
Justin Holewinski83e96682012-05-24 17:43:12 +00001402 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001403 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001404 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001405 };
1406}
1407
1408namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001409
1410static const unsigned R600AddrSpaceMap[] = {
1411 1, // opencl_global
1412 3, // opencl_local
1413 2, // opencl_constant
1414 1, // cuda_device
1415 2, // cuda_constant
1416 3 // cuda_shared
1417};
1418
Tom Stellardc74b1e02013-03-04 17:40:53 +00001419static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001420 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1421 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001422
1423static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001424 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1425 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001426
1427static const char *DescriptionStringSI =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001428 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:32:32-p5:64:64"
1429 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1430 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001431
Eli Friedmand13b41e2012-10-12 23:32:00 +00001432class R600TargetInfo : public TargetInfo {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001433 /// \brief The GPU profiles supported by the R600 target.
1434 enum GPUKind {
1435 GK_NONE,
1436 GK_R600,
1437 GK_R600_DOUBLE_OPS,
1438 GK_R700,
1439 GK_R700_DOUBLE_OPS,
1440 GK_EVERGREEN,
1441 GK_EVERGREEN_DOUBLE_OPS,
1442 GK_NORTHERN_ISLANDS,
1443 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001444 GK_SOUTHERN_ISLANDS,
1445 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001446 } GPU;
1447
Eli Friedmand13b41e2012-10-12 23:32:00 +00001448public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001449 R600TargetInfo(const llvm::Triple &Triple)
1450 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001451 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001452 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001453 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001454 }
1455
1456 virtual const char * getClobbers() const {
1457 return "";
1458 }
1459
1460 virtual void getGCCRegNames(const char * const *&Names,
1461 unsigned &numNames) const {
1462 Names = NULL;
1463 numNames = 0;
1464 }
1465
1466 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1467 unsigned &NumAliases) const {
1468 Aliases = NULL;
1469 NumAliases = 0;
1470 }
1471
1472 virtual bool validateAsmConstraint(const char *&Name,
1473 TargetInfo::ConstraintInfo &info) const {
1474 return true;
1475 }
1476
1477 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1478 unsigned &NumRecords) const {
1479 Records = NULL;
1480 NumRecords = 0;
1481 }
1482
1483
1484 virtual void getTargetDefines(const LangOptions &Opts,
1485 MacroBuilder &Builder) const {
1486 Builder.defineMacro("__R600__");
1487 }
1488
1489 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1490 return TargetInfo::CharPtrBuiltinVaList;
1491 }
1492
Tom Stellardc74b1e02013-03-04 17:40:53 +00001493 virtual bool setCPU(const std::string &Name) {
1494 GPU = llvm::StringSwitch<GPUKind>(Name)
1495 .Case("r600" , GK_R600)
1496 .Case("rv610", GK_R600)
1497 .Case("rv620", GK_R600)
1498 .Case("rv630", GK_R600)
1499 .Case("rv635", GK_R600)
1500 .Case("rs780", GK_R600)
1501 .Case("rs880", GK_R600)
1502 .Case("rv670", GK_R600_DOUBLE_OPS)
1503 .Case("rv710", GK_R700)
1504 .Case("rv730", GK_R700)
1505 .Case("rv740", GK_R700_DOUBLE_OPS)
1506 .Case("rv770", GK_R700_DOUBLE_OPS)
1507 .Case("palm", GK_EVERGREEN)
1508 .Case("cedar", GK_EVERGREEN)
1509 .Case("sumo", GK_EVERGREEN)
1510 .Case("sumo2", GK_EVERGREEN)
1511 .Case("redwood", GK_EVERGREEN)
1512 .Case("juniper", GK_EVERGREEN)
1513 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1514 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1515 .Case("barts", GK_NORTHERN_ISLANDS)
1516 .Case("turks", GK_NORTHERN_ISLANDS)
1517 .Case("caicos", GK_NORTHERN_ISLANDS)
1518 .Case("cayman", GK_CAYMAN)
1519 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001520 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001521 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1522 .Case("verde", GK_SOUTHERN_ISLANDS)
1523 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001524 .Case("bonaire", GK_SEA_ISLANDS)
1525 .Case("kabini", GK_SEA_ISLANDS)
1526 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001527 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001528 .Default(GK_NONE);
1529
1530 if (GPU == GK_NONE) {
1531 return false;
1532 }
1533
1534 // Set the correct data layout
1535 switch (GPU) {
1536 case GK_NONE:
1537 case GK_R600:
1538 case GK_R700:
1539 case GK_EVERGREEN:
1540 case GK_NORTHERN_ISLANDS:
1541 DescriptionString = DescriptionStringR600;
1542 break;
1543 case GK_R600_DOUBLE_OPS:
1544 case GK_R700_DOUBLE_OPS:
1545 case GK_EVERGREEN_DOUBLE_OPS:
1546 case GK_CAYMAN:
1547 DescriptionString = DescriptionStringR600DoubleOps;
1548 break;
1549 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001550 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001551 DescriptionString = DescriptionStringSI;
1552 break;
1553 }
1554
1555 return true;
1556 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001557};
1558
1559} // end anonymous namespace
1560
1561namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001562// Namespace for x86 abstract base class
1563const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001564#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001565#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001566 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001567#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001568};
Eli Friedmanb5366062008-05-20 14:21:01 +00001569
Nuno Lopescfca1f02009-12-23 17:49:57 +00001570static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001571 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1572 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001573 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001574 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1575 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1576 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001577 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001578 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1579 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001580};
1581
Eric Christophercdd36352011-06-21 00:05:20 +00001582const TargetInfo::AddlRegName AddlRegNames[] = {
1583 { { "al", "ah", "eax", "rax" }, 0 },
1584 { { "bl", "bh", "ebx", "rbx" }, 3 },
1585 { { "cl", "ch", "ecx", "rcx" }, 2 },
1586 { { "dl", "dh", "edx", "rdx" }, 1 },
1587 { { "esi", "rsi" }, 4 },
1588 { { "edi", "rdi" }, 5 },
1589 { { "esp", "rsp" }, 7 },
1590 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001591};
1592
1593// X86 target abstract base class; x86-32 and x86-64 are very close, so
1594// most of the implementation can be shared.
1595class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001596 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001597 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001598 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001599 enum MMX3DNowEnum {
1600 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1601 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001602 enum XOPEnum {
1603 NoXOP,
1604 SSE4A,
1605 FMA4,
1606 XOP
1607 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001608
Eric Christophere1ddaf92010-04-02 23:50:19 +00001609 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001610 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001611 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001612 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001613 bool HasBMI;
1614 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001615 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001616 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001617 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001618 bool HasRDSEED;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001619 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001620 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001621 bool HasF16C;
Craig Topper679b53a2013-08-21 05:29:10 +00001622 bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
Ben Langmuir58078d02013-09-19 13:22:04 +00001623 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001624 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001625
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001626 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1627 ///
1628 /// Each enumeration represents a particular CPU supported by Clang. These
1629 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1630 enum CPUKind {
1631 CK_Generic,
1632
1633 /// \name i386
1634 /// i386-generation processors.
1635 //@{
1636 CK_i386,
1637 //@}
1638
1639 /// \name i486
1640 /// i486-generation processors.
1641 //@{
1642 CK_i486,
1643 CK_WinChipC6,
1644 CK_WinChip2,
1645 CK_C3,
1646 //@}
1647
1648 /// \name i586
1649 /// i586-generation processors, P5 microarchitecture based.
1650 //@{
1651 CK_i586,
1652 CK_Pentium,
1653 CK_PentiumMMX,
1654 //@}
1655
1656 /// \name i686
1657 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1658 //@{
1659 CK_i686,
1660 CK_PentiumPro,
1661 CK_Pentium2,
1662 CK_Pentium3,
1663 CK_Pentium3M,
1664 CK_PentiumM,
1665 CK_C3_2,
1666
1667 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1668 /// Clang however has some logic to suport this.
1669 // FIXME: Warn, deprecate, and potentially remove this.
1670 CK_Yonah,
1671 //@}
1672
1673 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001674 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001675 //@{
1676 CK_Pentium4,
1677 CK_Pentium4M,
1678 CK_Prescott,
1679 CK_Nocona,
1680 //@}
1681
1682 /// \name Core
1683 /// Core microarchitecture based processors.
1684 //@{
1685 CK_Core2,
1686
1687 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1688 /// codename which GCC no longer accepts as an option to -march, but Clang
1689 /// has some logic for recognizing it.
1690 // FIXME: Warn, deprecate, and potentially remove this.
1691 CK_Penryn,
1692 //@}
1693
1694 /// \name Atom
1695 /// Atom processors
1696 //@{
1697 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001698 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001699 //@}
1700
1701 /// \name Nehalem
1702 /// Nehalem microarchitecture based processors.
1703 //@{
1704 CK_Corei7,
1705 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001706 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001707 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001708 //@}
1709
Craig Topper449314e2013-08-20 07:09:39 +00001710 /// \name Knights Landing
1711 /// Knights Landing processor.
1712 CK_KNL,
1713
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001714 /// \name K6
1715 /// K6 architecture processors.
1716 //@{
1717 CK_K6,
1718 CK_K6_2,
1719 CK_K6_3,
1720 //@}
1721
1722 /// \name K7
1723 /// K7 architecture processors.
1724 //@{
1725 CK_Athlon,
1726 CK_AthlonThunderbird,
1727 CK_Athlon4,
1728 CK_AthlonXP,
1729 CK_AthlonMP,
1730 //@}
1731
1732 /// \name K8
1733 /// K8 architecture processors.
1734 //@{
1735 CK_Athlon64,
1736 CK_Athlon64SSE3,
1737 CK_AthlonFX,
1738 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001739 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001740 CK_Opteron,
1741 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001742 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001743 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001744
Benjamin Kramer569f2152012-01-10 11:50:18 +00001745 /// \name Bobcat
1746 /// Bobcat architecture processors.
1747 //@{
1748 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001749 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001750 //@}
1751
1752 /// \name Bulldozer
1753 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001754 //@{
1755 CK_BDVER1,
1756 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001757 CK_BDVER3,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001758 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001759
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001760 /// This specification is deprecated and will be removed in the future.
1761 /// Users should prefer \see CK_K8.
1762 // FIXME: Warn on this when the CPU is set to it.
1763 CK_x86_64,
1764 //@}
1765
1766 /// \name Geode
1767 /// Geode processors.
1768 //@{
1769 CK_Geode
1770 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001771 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001772
Rafael Espindolaeb265472013-08-21 21:59:03 +00001773 enum FPMathKind {
1774 FP_Default,
1775 FP_SSE,
1776 FP_387
1777 } FPMath;
1778
Eli Friedman3fd920a2008-08-20 02:34:37 +00001779public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001780 X86TargetInfo(const llvm::Triple &Triple)
1781 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001782 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1783 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001784 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1785 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001786 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1787 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001788 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001789 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001790 }
Benjamin Kramercf501472011-12-28 15:47:06 +00001791 virtual unsigned getFloatEvalMethod() const {
1792 // X87 evaluates with 80 bits "long double" precision.
1793 return SSELevel == NoSSE ? 2 : 0;
1794 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001795 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1796 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001797 Records = BuiltinInfo;
1798 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001799 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001800 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001801 unsigned &NumNames) const {
1802 Names = GCCRegNames;
1803 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001804 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001805 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001806 unsigned &NumAliases) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001807 Aliases = 0;
1808 NumAliases = 0;
1809 }
1810 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
Eric Christopherfd081ca2012-11-14 22:08:59 +00001811 unsigned &NumNames) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001812 Names = AddlRegNames;
1813 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001814 }
Anders Carlsson58436352009-02-28 17:11:49 +00001815 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001816 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001817 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001818 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001819 return "~{dirflag},~{fpsr},~{flags}";
1820 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001821 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001822 MacroBuilder &Builder) const;
Craig Topper13f61a62013-09-17 04:12:55 +00001823 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1824 bool Enabled);
1825 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1826 bool Enabled);
1827 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1828 bool Enabled);
Rafael Espindolaa38ce292013-08-20 15:30:32 +00001829 virtual void setFeatureEnabled(llvm::StringMap<bool> &Features,
Craig Topper86d79ef2013-09-17 04:51:29 +00001830 StringRef Name, bool Enabled) const {
1831 setFeatureEnabledImpl(Features, Name, Enabled);
1832 }
1833 // This exists purely to cut down on the number of virtual calls in
1834 // getDefaultFeatures which calls this repeatedly.
1835 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1836 StringRef Name, bool Enabled);
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00001837 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001838 virtual bool hasFeature(StringRef Feature) const;
Eric Christopher3ff21b32013-10-16 21:26:26 +00001839 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00001840 DiagnosticsEngine &Diags);
Eli Friedman33465822011-07-08 23:31:17 +00001841 virtual const char* getABI() const {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001842 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001843 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001844 else if (getTriple().getArch() == llvm::Triple::x86 &&
1845 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001846 return "no-mmx";
1847 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001848 }
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001849 virtual bool setCPU(const std::string &Name) {
Chandler Carruth212334f2011-09-28 08:55:37 +00001850 CPU = llvm::StringSwitch<CPUKind>(Name)
1851 .Case("i386", CK_i386)
1852 .Case("i486", CK_i486)
1853 .Case("winchip-c6", CK_WinChipC6)
1854 .Case("winchip2", CK_WinChip2)
1855 .Case("c3", CK_C3)
1856 .Case("i586", CK_i586)
1857 .Case("pentium", CK_Pentium)
1858 .Case("pentium-mmx", CK_PentiumMMX)
1859 .Case("i686", CK_i686)
1860 .Case("pentiumpro", CK_PentiumPro)
1861 .Case("pentium2", CK_Pentium2)
1862 .Case("pentium3", CK_Pentium3)
1863 .Case("pentium3m", CK_Pentium3M)
1864 .Case("pentium-m", CK_PentiumM)
1865 .Case("c3-2", CK_C3_2)
1866 .Case("yonah", CK_Yonah)
1867 .Case("pentium4", CK_Pentium4)
1868 .Case("pentium4m", CK_Pentium4M)
1869 .Case("prescott", CK_Prescott)
1870 .Case("nocona", CK_Nocona)
1871 .Case("core2", CK_Core2)
1872 .Case("penryn", CK_Penryn)
1873 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001874 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001875 .Case("corei7", CK_Corei7)
1876 .Case("corei7-avx", CK_Corei7AVX)
1877 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001878 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001879 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00001880 .Case("k6", CK_K6)
1881 .Case("k6-2", CK_K6_2)
1882 .Case("k6-3", CK_K6_3)
1883 .Case("athlon", CK_Athlon)
1884 .Case("athlon-tbird", CK_AthlonThunderbird)
1885 .Case("athlon-4", CK_Athlon4)
1886 .Case("athlon-xp", CK_AthlonXP)
1887 .Case("athlon-mp", CK_AthlonMP)
1888 .Case("athlon64", CK_Athlon64)
1889 .Case("athlon64-sse3", CK_Athlon64SSE3)
1890 .Case("athlon-fx", CK_AthlonFX)
1891 .Case("k8", CK_K8)
1892 .Case("k8-sse3", CK_K8SSE3)
1893 .Case("opteron", CK_Opteron)
1894 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001895 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001896 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001897 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001898 .Case("bdver1", CK_BDVER1)
1899 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001900 .Case("bdver3", CK_BDVER3)
Chandler Carruth212334f2011-09-28 08:55:37 +00001901 .Case("x86-64", CK_x86_64)
1902 .Case("geode", CK_Geode)
1903 .Default(CK_Generic);
1904
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001905 // Perform any per-CPU checks necessary to determine if this CPU is
1906 // acceptable.
1907 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1908 // invalid without explaining *why*.
1909 switch (CPU) {
1910 case CK_Generic:
1911 // No processor selected!
1912 return false;
1913
1914 case CK_i386:
1915 case CK_i486:
1916 case CK_WinChipC6:
1917 case CK_WinChip2:
1918 case CK_C3:
1919 case CK_i586:
1920 case CK_Pentium:
1921 case CK_PentiumMMX:
1922 case CK_i686:
1923 case CK_PentiumPro:
1924 case CK_Pentium2:
1925 case CK_Pentium3:
1926 case CK_Pentium3M:
1927 case CK_PentiumM:
1928 case CK_Yonah:
1929 case CK_C3_2:
1930 case CK_Pentium4:
1931 case CK_Pentium4M:
1932 case CK_Prescott:
1933 case CK_K6:
1934 case CK_K6_2:
1935 case CK_K6_3:
1936 case CK_Athlon:
1937 case CK_AthlonThunderbird:
1938 case CK_Athlon4:
1939 case CK_AthlonXP:
1940 case CK_AthlonMP:
1941 case CK_Geode:
1942 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00001943 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001944 return false;
1945
1946 // Fallthrough
1947 case CK_Nocona:
1948 case CK_Core2:
1949 case CK_Penryn:
1950 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00001951 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001952 case CK_Corei7:
1953 case CK_Corei7AVX:
1954 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00001955 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00001956 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001957 case CK_Athlon64:
1958 case CK_Athlon64SSE3:
1959 case CK_AthlonFX:
1960 case CK_K8:
1961 case CK_K8SSE3:
1962 case CK_Opteron:
1963 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00001964 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00001965 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001966 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001967 case CK_BDVER1:
1968 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001969 case CK_BDVER3:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001970 case CK_x86_64:
1971 return true;
1972 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00001973 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001974 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001975
Rafael Espindolaeb265472013-08-21 21:59:03 +00001976 virtual bool setFPMath(StringRef Name);
1977
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001978 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
1979 // We accept all non-ARM calling conventions
1980 return (CC == CC_X86ThisCall ||
1981 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00001982 CC == CC_X86StdCall ||
1983 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00001984 CC == CC_X86Pascal ||
1985 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001986 }
1987
Aaron Ballman02df2e02012-12-09 17:45:41 +00001988 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
1989 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001990 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001991};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001992
Rafael Espindolaeb265472013-08-21 21:59:03 +00001993bool X86TargetInfo::setFPMath(StringRef Name) {
1994 if (Name == "387") {
1995 FPMath = FP_387;
1996 return true;
1997 }
1998 if (Name == "sse") {
1999 FPMath = FP_SSE;
2000 return true;
2001 }
2002 return false;
2003}
2004
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002005void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002006 // FIXME: This *really* should not be here.
2007
2008 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002009 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002010 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002011
Chandler Carruth212334f2011-09-28 08:55:37 +00002012 switch (CPU) {
2013 case CK_Generic:
2014 case CK_i386:
2015 case CK_i486:
2016 case CK_i586:
2017 case CK_Pentium:
2018 case CK_i686:
2019 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002020 break;
2021 case CK_PentiumMMX:
2022 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002023 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002024 break;
2025 case CK_Pentium3:
2026 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002027 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002028 break;
2029 case CK_PentiumM:
2030 case CK_Pentium4:
2031 case CK_Pentium4M:
2032 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002033 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002034 break;
2035 case CK_Yonah:
2036 case CK_Prescott:
2037 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002038 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002039 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002040 break;
2041 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002042 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002043 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002044 break;
2045 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002046 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002047 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002048 break;
2049 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002050 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002051 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002052 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002053 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002054 setFeatureEnabledImpl(Features, "sse4.2", true);
2055 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002056 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002057 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002058 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002059 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002060 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002061 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002062 break;
2063 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002064 setFeatureEnabledImpl(Features, "avx", true);
2065 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002066 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002067 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002068 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002069 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002070 setFeatureEnabledImpl(Features, "avx", true);
2071 setFeatureEnabledImpl(Features, "aes", true);
2072 setFeatureEnabledImpl(Features, "pclmul", true);
2073 setFeatureEnabledImpl(Features, "rdrnd", true);
2074 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002075 break;
Craig Topper865fff52011-12-17 19:55:21 +00002076 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002077 setFeatureEnabledImpl(Features, "avx2", true);
2078 setFeatureEnabledImpl(Features, "aes", true);
2079 setFeatureEnabledImpl(Features, "pclmul", true);
2080 setFeatureEnabledImpl(Features, "lzcnt", true);
2081 setFeatureEnabledImpl(Features, "rdrnd", true);
2082 setFeatureEnabledImpl(Features, "f16c", true);
2083 setFeatureEnabledImpl(Features, "bmi", true);
2084 setFeatureEnabledImpl(Features, "bmi2", true);
2085 setFeatureEnabledImpl(Features, "rtm", true);
2086 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002087 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002088 break;
Craig Topper449314e2013-08-20 07:09:39 +00002089 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002090 setFeatureEnabledImpl(Features, "avx512f", true);
2091 setFeatureEnabledImpl(Features, "avx512cd", true);
2092 setFeatureEnabledImpl(Features, "avx512er", true);
2093 setFeatureEnabledImpl(Features, "avx512pf", true);
2094 setFeatureEnabledImpl(Features, "aes", true);
2095 setFeatureEnabledImpl(Features, "pclmul", true);
2096 setFeatureEnabledImpl(Features, "lzcnt", true);
2097 setFeatureEnabledImpl(Features, "rdrnd", true);
2098 setFeatureEnabledImpl(Features, "f16c", true);
2099 setFeatureEnabledImpl(Features, "bmi", true);
2100 setFeatureEnabledImpl(Features, "bmi2", true);
2101 setFeatureEnabledImpl(Features, "rtm", true);
2102 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002103 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002104 case CK_K6:
2105 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002106 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002107 break;
2108 case CK_K6_2:
2109 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002110 case CK_WinChip2:
2111 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002112 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002113 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002114 case CK_Athlon:
2115 case CK_AthlonThunderbird:
2116 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002117 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002118 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002119 case CK_Athlon4:
2120 case CK_AthlonXP:
2121 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002122 setFeatureEnabledImpl(Features, "sse", true);
2123 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002124 break;
2125 case CK_K8:
2126 case CK_Opteron:
2127 case CK_Athlon64:
2128 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002129 setFeatureEnabledImpl(Features, "sse2", true);
2130 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002131 break;
2132 case CK_K8SSE3:
2133 case CK_OpteronSSE3:
2134 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002135 setFeatureEnabledImpl(Features, "sse3", true);
2136 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002137 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002138 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002139 setFeatureEnabledImpl(Features, "sse3", true);
2140 setFeatureEnabledImpl(Features, "sse4a", true);
2141 setFeatureEnabledImpl(Features, "3dnowa", true);
2142 setFeatureEnabledImpl(Features, "lzcnt", true);
2143 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002144 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002145 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002146 setFeatureEnabledImpl(Features, "ssse3", true);
2147 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002148 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002149 setFeatureEnabledImpl(Features, "lzcnt", true);
2150 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002151 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002152 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002153 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002154 setFeatureEnabledImpl(Features, "avx", true);
2155 setFeatureEnabledImpl(Features, "sse4a", true);
2156 setFeatureEnabledImpl(Features, "lzcnt", true);
2157 setFeatureEnabledImpl(Features, "aes", true);
2158 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002159 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002160 setFeatureEnabledImpl(Features, "bmi", true);
2161 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002162 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002163 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002164 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002165 setFeatureEnabledImpl(Features, "xop", true);
2166 setFeatureEnabledImpl(Features, "lzcnt", true);
2167 setFeatureEnabledImpl(Features, "aes", true);
2168 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002169 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002170 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002171 break;
Eli Friedman3e94f572012-11-17 01:43:10 +00002172 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002173 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002174 setFeatureEnabledImpl(Features, "xop", true);
2175 setFeatureEnabledImpl(Features, "lzcnt", true);
2176 setFeatureEnabledImpl(Features, "aes", true);
2177 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002178 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002179 setFeatureEnabledImpl(Features, "bmi", true);
2180 setFeatureEnabledImpl(Features, "fma", true);
2181 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002182 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002183 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002184 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002185 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002186 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002187 break;
Eli Friedman33465822011-07-08 23:31:17 +00002188 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002189}
2190
Rafael Espindolae62e2792013-08-20 13:44:29 +00002191void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002192 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002193 if (Enabled) {
2194 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002195 case AVX512F:
2196 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002197 case AVX2:
2198 Features["avx2"] = true;
2199 case AVX:
2200 Features["avx"] = true;
2201 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002202 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002203 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002204 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002205 case SSSE3:
2206 Features["ssse3"] = true;
2207 case SSE3:
2208 Features["sse3"] = true;
2209 case SSE2:
2210 Features["sse2"] = true;
2211 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002212 Features["sse"] = true;
2213 case NoSSE:
2214 break;
2215 }
2216 return;
2217 }
2218
2219 switch (Level) {
2220 case NoSSE:
2221 case SSE1:
2222 Features["sse"] = false;
2223 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002224 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2225 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002226 case SSE3:
2227 Features["sse3"] = false;
2228 setXOPLevel(Features, NoXOP, false);
2229 case SSSE3:
2230 Features["ssse3"] = false;
2231 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002232 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002233 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002234 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002235 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002236 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002237 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002238 case AVX2:
2239 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002240 case AVX512F:
Craig Topper679b53a2013-08-21 05:29:10 +00002241 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2242 Features["avx512pf"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002243 }
2244}
2245
2246void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002247 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002248 if (Enabled) {
2249 switch (Level) {
2250 case AMD3DNowAthlon:
2251 Features["3dnowa"] = true;
2252 case AMD3DNow:
2253 Features["3dnow"] = true;
2254 case MMX:
2255 Features["mmx"] = true;
2256 case NoMMX3DNow:
2257 break;
2258 }
2259 return;
2260 }
2261
2262 switch (Level) {
2263 case NoMMX3DNow:
2264 case MMX:
2265 Features["mmx"] = false;
2266 case AMD3DNow:
2267 Features["3dnow"] = false;
2268 case AMD3DNowAthlon:
2269 Features["3dnowa"] = false;
2270 }
2271}
2272
2273void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002274 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002275 if (Enabled) {
2276 switch (Level) {
2277 case XOP:
2278 Features["xop"] = true;
2279 case FMA4:
2280 Features["fma4"] = true;
2281 setSSELevel(Features, AVX, true);
2282 case SSE4A:
2283 Features["sse4a"] = true;
2284 setSSELevel(Features, SSE3, true);
2285 case NoXOP:
2286 break;
2287 }
2288 return;
2289 }
2290
2291 switch (Level) {
2292 case NoXOP:
2293 case SSE4A:
2294 Features["sse4a"] = false;
2295 case FMA4:
2296 Features["fma4"] = false;
2297 case XOP:
2298 Features["xop"] = false;
2299 }
2300}
2301
Craig Topper86d79ef2013-09-17 04:51:29 +00002302void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2303 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002304 // FIXME: This *really* should not be here. We need some way of translating
2305 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002306 if (Name == "sse4")
2307 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002308
Rafael Espindolae62e2792013-08-20 13:44:29 +00002309 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002310
Craig Topper29561122013-09-19 01:13:07 +00002311 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002312 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002313 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002314 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002315 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002316 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002317 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002318 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002319 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002320 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002321 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002322 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002323 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002324 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002325 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002326 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002327 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002328 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002329 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002330 if (Enabled)
2331 setSSELevel(Features, SSE2, Enabled);
2332 } else if (Name == "pclmul") {
2333 if (Enabled)
2334 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002335 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002336 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002337 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002338 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002339 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002340 setSSELevel(Features, AVX512F, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002341 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002342 if (Enabled)
2343 setSSELevel(Features, AVX512F, Enabled);
2344 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002345 if (Enabled)
2346 setSSELevel(Features, AVX, Enabled);
2347 } else if (Name == "fma4") {
2348 setXOPLevel(Features, FMA4, Enabled);
2349 } else if (Name == "xop") {
2350 setXOPLevel(Features, XOP, Enabled);
2351 } else if (Name == "sse4a") {
2352 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002353 } else if (Name == "f16c") {
2354 if (Enabled)
2355 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002356 } else if (Name == "sha") {
2357 if (Enabled)
2358 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002359 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002360}
2361
Eric Christopher3ff21b32013-10-16 21:26:26 +00002362/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002363/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002364bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002365 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002366 // Remember the maximum enabled sselevel.
2367 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2368 // Ignore disabled features.
2369 if (Features[i][0] == '-')
2370 continue;
2371
Benjamin Kramer27402c62012-03-05 15:10:44 +00002372 StringRef Feature = StringRef(Features[i]).substr(1);
2373
2374 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002375 HasAES = true;
2376 continue;
2377 }
2378
Craig Topper3f122a72012-05-31 05:18:48 +00002379 if (Feature == "pclmul") {
2380 HasPCLMUL = true;
2381 continue;
2382 }
2383
Benjamin Kramer27402c62012-03-05 15:10:44 +00002384 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002385 HasLZCNT = true;
2386 continue;
2387 }
2388
Rafael Espindola89049822013-08-23 20:21:37 +00002389 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002390 HasRDRND = true;
2391 continue;
2392 }
2393
Benjamin Kramer27402c62012-03-05 15:10:44 +00002394 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002395 HasBMI = true;
2396 continue;
2397 }
2398
Benjamin Kramer27402c62012-03-05 15:10:44 +00002399 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002400 HasBMI2 = true;
2401 continue;
2402 }
2403
Benjamin Kramer27402c62012-03-05 15:10:44 +00002404 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002405 HasPOPCNT = true;
2406 continue;
2407 }
2408
Michael Liao625a8752012-11-10 05:17:46 +00002409 if (Feature == "rtm") {
2410 HasRTM = true;
2411 continue;
2412 }
2413
Michael Liao74f4eaf2013-03-26 17:52:08 +00002414 if (Feature == "prfchw") {
2415 HasPRFCHW = true;
2416 continue;
2417 }
2418
Michael Liaoffaae352013-03-29 05:17:55 +00002419 if (Feature == "rdseed") {
2420 HasRDSEED = true;
2421 continue;
2422 }
2423
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002424 if (Feature == "tbm") {
2425 HasTBM = true;
2426 continue;
2427 }
2428
Craig Topperbba778b2012-06-03 21:46:30 +00002429 if (Feature == "fma") {
2430 HasFMA = true;
2431 continue;
2432 }
2433
Manman Rena45358c2012-10-11 00:59:55 +00002434 if (Feature == "f16c") {
2435 HasF16C = true;
2436 continue;
2437 }
2438
Craig Topper679b53a2013-08-21 05:29:10 +00002439 if (Feature == "avx512cd") {
2440 HasAVX512CD = true;
2441 continue;
2442 }
2443
2444 if (Feature == "avx512er") {
2445 HasAVX512ER = true;
2446 continue;
2447 }
2448
2449 if (Feature == "avx512pf") {
2450 HasAVX512PF = true;
2451 continue;
2452 }
2453
Ben Langmuir58078d02013-09-19 13:22:04 +00002454 if (Feature == "sha") {
2455 HasSHA = true;
2456 continue;
2457 }
2458
Nick Lewycky50e8f482013-10-05 20:14:27 +00002459 if (Feature == "cx16") {
2460 HasCX16 = true;
2461 continue;
2462 }
2463
Daniel Dunbar979586e2009-11-11 09:38:56 +00002464 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002465 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002466 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002467 .Case("avx2", AVX2)
2468 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002469 .Case("sse4.2", SSE42)
2470 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002471 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002472 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002473 .Case("sse2", SSE2)
2474 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002475 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002476 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002477
Eli Friedman33465822011-07-08 23:31:17 +00002478 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002479 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002480 .Case("3dnowa", AMD3DNowAthlon)
2481 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002482 .Case("mmx", MMX)
2483 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002484 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002485
2486 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2487 .Case("xop", XOP)
2488 .Case("fma4", FMA4)
2489 .Case("sse4a", SSE4A)
2490 .Default(NoXOP);
2491 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002492 }
Eli Friedman33465822011-07-08 23:31:17 +00002493
Craig Topper7481d8a2013-09-10 06:55:47 +00002494 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2495 // Can't do this earlier because we need to be able to explicitly enable
2496 // popcnt and still disable sse4.2.
2497 if (!HasPOPCNT && SSELevel >= SSE42 &&
2498 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2499 HasPOPCNT = true;
2500 Features.push_back("+popcnt");
2501 }
2502
Yunzhong Gao61089362013-10-16 19:07:02 +00002503 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2504 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2505 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2506 HasPRFCHW = true;
2507 Features.push_back("+prfchw");
2508 }
2509
Rafael Espindolaeb265472013-08-21 21:59:03 +00002510 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2511 // matches the selected sse level.
2512 if (FPMath == FP_SSE && SSELevel < SSE1) {
2513 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2514 return false;
2515 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2516 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2517 return false;
2518 }
2519
Eli Friedman33465822011-07-08 23:31:17 +00002520 // Don't tell the backend if we're turning off mmx; it will end up disabling
2521 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002522 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2523 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002524 std::vector<std::string>::iterator it;
2525 it = std::find(Features.begin(), Features.end(), "-mmx");
2526 if (it != Features.end())
2527 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002528 else if (SSELevel > NoSSE)
2529 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002530 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002531}
Chris Lattnerecd49032009-03-02 22:27:17 +00002532
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002533/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2534/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002535void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002536 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002537 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002538 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002539 Builder.defineMacro("__amd64__");
2540 Builder.defineMacro("__amd64");
2541 Builder.defineMacro("__x86_64");
2542 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002543 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002544 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002545 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002546
Chris Lattnerecd49032009-03-02 22:27:17 +00002547 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002548 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2549 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002550 switch (CPU) {
2551 case CK_Generic:
2552 break;
2553 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002554 // The rest are coming from the i386 define above.
2555 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002556 break;
2557 case CK_i486:
2558 case CK_WinChipC6:
2559 case CK_WinChip2:
2560 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002561 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002562 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002563 case CK_PentiumMMX:
2564 Builder.defineMacro("__pentium_mmx__");
2565 Builder.defineMacro("__tune_pentium_mmx__");
2566 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002567 case CK_i586:
2568 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002569 defineCPUMacros(Builder, "i586");
2570 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002571 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002572 case CK_Pentium3:
2573 case CK_Pentium3M:
2574 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002575 Builder.defineMacro("__tune_pentium3__");
2576 // Fallthrough
2577 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002578 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002579 Builder.defineMacro("__tune_pentium2__");
2580 // Fallthrough
2581 case CK_PentiumPro:
2582 Builder.defineMacro("__tune_i686__");
2583 Builder.defineMacro("__tune_pentiumpro__");
2584 // Fallthrough
2585 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002586 Builder.defineMacro("__i686");
2587 Builder.defineMacro("__i686__");
2588 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2589 Builder.defineMacro("__pentiumpro");
2590 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002591 break;
2592 case CK_Pentium4:
2593 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002594 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002595 break;
2596 case CK_Yonah:
2597 case CK_Prescott:
2598 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002599 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002600 break;
2601 case CK_Core2:
2602 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002603 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002604 break;
2605 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002606 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002607 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002608 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002609 defineCPUMacros(Builder, "slm");
2610 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002611 case CK_Corei7:
2612 case CK_Corei7AVX:
2613 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002614 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002615 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002616 break;
Craig Topper449314e2013-08-20 07:09:39 +00002617 case CK_KNL:
2618 defineCPUMacros(Builder, "knl");
2619 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002620 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002621 Builder.defineMacro("__k6_2__");
2622 Builder.defineMacro("__tune_k6_2__");
2623 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002624 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002625 if (CPU != CK_K6_2) { // In case of fallthrough
2626 // FIXME: GCC may be enabling these in cases where some other k6
2627 // architecture is specified but -m3dnow is explicitly provided. The
2628 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002629 Builder.defineMacro("__k6_3__");
2630 Builder.defineMacro("__tune_k6_3__");
2631 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002632 // Fallthrough
2633 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002634 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002635 break;
2636 case CK_Athlon:
2637 case CK_AthlonThunderbird:
2638 case CK_Athlon4:
2639 case CK_AthlonXP:
2640 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002641 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002642 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002643 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002644 Builder.defineMacro("__tune_athlon_sse__");
2645 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002646 break;
2647 case CK_K8:
2648 case CK_K8SSE3:
2649 case CK_x86_64:
2650 case CK_Opteron:
2651 case CK_OpteronSSE3:
2652 case CK_Athlon64:
2653 case CK_Athlon64SSE3:
2654 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002655 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002656 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002657 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002658 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002659 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002660 case CK_BTVER1:
2661 defineCPUMacros(Builder, "btver1");
2662 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002663 case CK_BTVER2:
2664 defineCPUMacros(Builder, "btver2");
2665 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002666 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002667 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002668 break;
2669 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002670 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002671 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002672 case CK_BDVER3:
2673 defineCPUMacros(Builder, "bdver3");
2674 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002675 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002676 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002677 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002678 }
Chris Lattner96e43572009-03-02 22:40:39 +00002679
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002680 // Target properties.
2681 Builder.defineMacro("__LITTLE_ENDIAN__");
2682 Builder.defineMacro("__REGISTER_PREFIX__", "");
2683
Chris Lattner6df41af2009-04-19 17:32:33 +00002684 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2685 // functions in glibc header files that use FP Stack inline asm which the
2686 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002687 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002688
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002689 if (HasAES)
2690 Builder.defineMacro("__AES__");
2691
Craig Topper3f122a72012-05-31 05:18:48 +00002692 if (HasPCLMUL)
2693 Builder.defineMacro("__PCLMUL__");
2694
Craig Topper22967d42011-12-25 05:06:45 +00002695 if (HasLZCNT)
2696 Builder.defineMacro("__LZCNT__");
2697
Benjamin Kramer1e250392012-07-07 09:39:18 +00002698 if (HasRDRND)
2699 Builder.defineMacro("__RDRND__");
2700
Craig Topper22967d42011-12-25 05:06:45 +00002701 if (HasBMI)
2702 Builder.defineMacro("__BMI__");
2703
2704 if (HasBMI2)
2705 Builder.defineMacro("__BMI2__");
2706
Craig Topper1de83482011-12-29 16:10:46 +00002707 if (HasPOPCNT)
2708 Builder.defineMacro("__POPCNT__");
2709
Michael Liao625a8752012-11-10 05:17:46 +00002710 if (HasRTM)
2711 Builder.defineMacro("__RTM__");
2712
Michael Liao74f4eaf2013-03-26 17:52:08 +00002713 if (HasPRFCHW)
2714 Builder.defineMacro("__PRFCHW__");
2715
Michael Liaoffaae352013-03-29 05:17:55 +00002716 if (HasRDSEED)
2717 Builder.defineMacro("__RDSEED__");
2718
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002719 if (HasTBM)
2720 Builder.defineMacro("__TBM__");
2721
Rafael Espindolae62e2792013-08-20 13:44:29 +00002722 switch (XOPLevel) {
2723 case XOP:
2724 Builder.defineMacro("__XOP__");
2725 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002726 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002727 case SSE4A:
2728 Builder.defineMacro("__SSE4A__");
2729 case NoXOP:
2730 break;
2731 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002732
Craig Topperbba778b2012-06-03 21:46:30 +00002733 if (HasFMA)
2734 Builder.defineMacro("__FMA__");
2735
Manman Rena45358c2012-10-11 00:59:55 +00002736 if (HasF16C)
2737 Builder.defineMacro("__F16C__");
2738
Craig Topper679b53a2013-08-21 05:29:10 +00002739 if (HasAVX512CD)
2740 Builder.defineMacro("__AVX512CD__");
2741 if (HasAVX512ER)
2742 Builder.defineMacro("__AVX512ER__");
2743 if (HasAVX512PF)
2744 Builder.defineMacro("__AVX512PF__");
2745
Ben Langmuir58078d02013-09-19 13:22:04 +00002746 if (HasSHA)
2747 Builder.defineMacro("__SHA__");
2748
Nick Lewycky50e8f482013-10-05 20:14:27 +00002749 if (HasCX16)
2750 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2751
Chris Lattner96e43572009-03-02 22:40:39 +00002752 // Each case falls through to the previous one here.
2753 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002754 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002755 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002756 case AVX2:
2757 Builder.defineMacro("__AVX2__");
2758 case AVX:
2759 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002760 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002761 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002762 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002763 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002764 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002765 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002766 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002767 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002768 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002769 Builder.defineMacro("__SSE2__");
2770 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002771 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002772 Builder.defineMacro("__SSE__");
2773 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002774 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002775 break;
2776 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002777
Derek Schuffc7dd7222012-10-11 15:52:22 +00002778 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002779 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002780 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002781 case AVX2:
2782 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002783 case SSE42:
2784 case SSE41:
2785 case SSSE3:
2786 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002787 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002788 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002789 break;
2790 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002791 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002792 break;
2793 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002794 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002795 }
2796 }
2797
Anders Carlssone437c682010-01-27 03:47:49 +00002798 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002799 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002800 case AMD3DNowAthlon:
2801 Builder.defineMacro("__3dNOW_A__");
2802 case AMD3DNow:
2803 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002804 case MMX:
2805 Builder.defineMacro("__MMX__");
2806 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002807 break;
2808 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002809
2810 if (CPU >= CK_i486) {
2811 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2812 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2813 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2814 }
2815 if (CPU >= CK_i586)
2816 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002817}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002818
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002819bool X86TargetInfo::hasFeature(StringRef Feature) const {
2820 return llvm::StringSwitch<bool>(Feature)
2821 .Case("aes", HasAES)
2822 .Case("avx", SSELevel >= AVX)
2823 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002824 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002825 .Case("avx512cd", HasAVX512CD)
2826 .Case("avx512er", HasAVX512ER)
2827 .Case("avx512pf", HasAVX512PF)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002828 .Case("bmi", HasBMI)
2829 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002830 .Case("cx16", HasCX16)
2831 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002832 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002833 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002834 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002835 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002836 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002837 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2838 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2839 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002840 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002841 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002842 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002843 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002844 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002845 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002846 .Case("sse", SSELevel >= SSE1)
2847 .Case("sse2", SSELevel >= SSE2)
2848 .Case("sse3", SSELevel >= SSE3)
2849 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002850 .Case("sse4.1", SSELevel >= SSE41)
2851 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002852 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002853 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002854 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2855 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002856 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002857 .Default(false);
2858}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002859
Eli Friedman3fd920a2008-08-20 02:34:37 +00002860bool
Anders Carlsson58436352009-02-28 17:11:49 +00002861X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002862 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002863 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002864 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002865 case 'Y': // first letter of a pair:
2866 switch (*(Name+1)) {
2867 default: return false;
2868 case '0': // First SSE register.
2869 case 't': // Any SSE register, when SSE2 is enabled.
2870 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2871 case 'm': // any MMX register, when inter-unit moves enabled.
2872 break; // falls through to setAllowsRegister.
2873 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002874 case 'a': // eax.
2875 case 'b': // ebx.
2876 case 'c': // ecx.
2877 case 'd': // edx.
2878 case 'S': // esi.
2879 case 'D': // edi.
2880 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00002881 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002882 case 't': // top of floating point stack.
2883 case 'u': // second from top of floating point stack.
2884 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002885 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002886 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002887 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002888 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2889 case 'l': // "Index" registers: any general register that can be used as an
2890 // index in a base+index memory access.
2891 Info.setAllowsRegister();
2892 return true;
2893 case 'C': // SSE floating point constant.
2894 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002895 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002896 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002897 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002898 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002899 return true;
2900 }
2901}
2902
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002903
Eli Friedman3fd920a2008-08-20 02:34:37 +00002904std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002905X86TargetInfo::convertConstraint(const char *&Constraint) const {
2906 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002907 case 'a': return std::string("{ax}");
2908 case 'b': return std::string("{bx}");
2909 case 'c': return std::string("{cx}");
2910 case 'd': return std::string("{dx}");
2911 case 'S': return std::string("{si}");
2912 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002913 case 'p': // address
2914 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002915 case 't': // top of floating point stack.
2916 return std::string("{st}");
2917 case 'u': // second from top of floating point stack.
2918 return std::string("{st(1)}"); // second from top of floating point stack.
2919 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002920 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002921 }
2922}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002923} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002924
2925namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002926// X86-32 generic target
2927class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002928public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002929 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002930 DoubleAlign = LongLongAlign = 32;
2931 LongDoubleWidth = 96;
2932 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002933 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00002934 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002935 SizeType = UnsignedInt;
2936 PtrDiffType = SignedInt;
2937 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002938 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002939
2940 // Use fpret for all types.
2941 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2942 (1 << TargetInfo::Double) |
2943 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002944
2945 // x86-32 has atomics up to 8 bytes
2946 // FIXME: Check that we actually have cmpxchg8b before setting
2947 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2948 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002949 }
Meador Inge5d3fb222012-06-16 03:34:49 +00002950 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2951 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002952 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002953
Chris Lattnerd545ad12009-09-23 06:06:36 +00002954 int getEHDataRegisterNumber(unsigned RegNo) const {
2955 if (RegNo == 0) return 0;
2956 if (RegNo == 1) return 2;
2957 return -1;
2958 }
Bill Wendling887b4852012-11-12 06:42:51 +00002959 virtual bool validateInputSize(StringRef Constraint,
2960 unsigned Size) const {
2961 switch (Constraint[0]) {
2962 default: break;
2963 case 'a':
2964 case 'b':
2965 case 'c':
2966 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00002967 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00002968 }
2969
2970 return true;
2971 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002972};
2973} // end anonymous namespace
2974
2975namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002976class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2977public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002978 NetBSDI386TargetInfo(const llvm::Triple &Triple)
2979 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002980
2981 virtual unsigned getFloatEvalMethod() const {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00002982 unsigned Major, Minor, Micro;
2983 getTriple().getOSVersion(Major, Minor, Micro);
2984 // New NetBSD uses the default rounding mode.
2985 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
2986 return X86_32TargetInfo::getFloatEvalMethod();
2987 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002988 return 1;
2989 }
2990};
2991} // end anonymous namespace
2992
2993namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00002994class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2995public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002996 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
2997 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00002998 SizeType = UnsignedLong;
2999 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003000 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003001 }
3002};
3003} // end anonymous namespace
3004
3005namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003006class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3007public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003008 BitrigI386TargetInfo(const llvm::Triple &Triple)
3009 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003010 SizeType = UnsignedLong;
3011 IntPtrType = SignedLong;
3012 PtrDiffType = SignedLong;
3013 }
3014};
3015} // end anonymous namespace
3016
3017namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003018class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003019public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003020 DarwinI386TargetInfo(const llvm::Triple &Triple)
3021 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003022 LongDoubleWidth = 128;
3023 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003024 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003025 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003026 SizeType = UnsignedLong;
3027 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003028 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003029 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003030 }
3031
Eli Friedman3fd920a2008-08-20 02:34:37 +00003032};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003033} // end anonymous namespace
3034
3035namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003036// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003037class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003038public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003039 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3040 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00003041 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00003042 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003043 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003044 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003045 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003046 virtual void getTargetDefines(const LangOptions &Opts,
3047 MacroBuilder &Builder) const {
3048 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3049 }
3050};
3051} // end anonymous namespace
3052
3053namespace {
3054
3055// x86-32 Windows Visual Studio target
3056class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
3057public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003058 VisualStudioWindowsX86_32TargetInfo(const llvm::Triple &Triple)
3059 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003060 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003061 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3062 }
3063 virtual void getTargetDefines(const LangOptions &Opts,
3064 MacroBuilder &Builder) const {
3065 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3066 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3067 // The value of the following reflects processor type.
3068 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3069 // We lost the original triple, so we use the default.
3070 Builder.defineMacro("_M_IX86", "600");
3071 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003072};
3073} // end anonymous namespace
3074
3075namespace {
3076// x86-32 MinGW target
3077class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3078public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003079 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3080 : WindowsX86_32TargetInfo(Triple) {}
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003081 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003082 MacroBuilder &Builder) const {
3083 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003084 DefineStd(Builder, "WIN32", Opts);
3085 DefineStd(Builder, "WINNT", Opts);
3086 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003087 Builder.defineMacro("__MSVCRT__");
3088 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003089
3090 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3091 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003092 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003093 // Provide "as-is" __declspec.
3094 Builder.defineMacro("__declspec", "__declspec");
3095 else
3096 // Provide alias of __attribute__ like mingw32-gcc.
3097 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003098 }
3099};
3100} // end anonymous namespace
3101
3102namespace {
3103// x86-32 Cygwin target
3104class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3105public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003106 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3107 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003108 TLSSupported = false;
3109 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003110 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003111 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003112 }
3113 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003114 MacroBuilder &Builder) const {
3115 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003116 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003117 Builder.defineMacro("__CYGWIN__");
3118 Builder.defineMacro("__CYGWIN32__");
3119 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003120 if (Opts.CPlusPlus)
3121 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003122 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003123};
3124} // end anonymous namespace
3125
3126namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003127// x86-32 Haiku target
3128class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3129public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003130 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003131 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003132 IntPtrType = SignedLong;
3133 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003134 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003135 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003136 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003137 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00003138 virtual void getTargetDefines(const LangOptions &Opts,
3139 MacroBuilder &Builder) const {
3140 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3141 Builder.defineMacro("__INTEL__");
3142 Builder.defineMacro("__HAIKU__");
3143 }
3144};
3145} // end anonymous namespace
3146
Douglas Gregor9fabd852011-07-01 22:41:14 +00003147// RTEMS Target
3148template<typename Target>
3149class RTEMSTargetInfo : public OSTargetInfo<Target> {
3150protected:
3151 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3152 MacroBuilder &Builder) const {
3153 // RTEMS defines; list based off of gcc output
3154
Douglas Gregor9fabd852011-07-01 22:41:14 +00003155 Builder.defineMacro("__rtems__");
3156 Builder.defineMacro("__ELF__");
3157 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003158
Douglas Gregor9fabd852011-07-01 22:41:14 +00003159public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003160 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3161 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003162
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003163 switch (Triple.getArch()) {
3164 default:
3165 case llvm::Triple::x86:
3166 // this->MCountName = ".mcount";
3167 break;
3168 case llvm::Triple::mips:
3169 case llvm::Triple::mipsel:
3170 case llvm::Triple::ppc:
3171 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003172 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003173 // this->MCountName = "_mcount";
3174 break;
3175 case llvm::Triple::arm:
3176 // this->MCountName = "__mcount";
3177 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003178 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003179 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003180};
3181
3182namespace {
3183// x86-32 RTEMS target
3184class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3185public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003186 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003187 SizeType = UnsignedLong;
3188 IntPtrType = SignedLong;
3189 PtrDiffType = SignedLong;
3190 this->UserLabelPrefix = "";
3191 }
3192 virtual void getTargetDefines(const LangOptions &Opts,
3193 MacroBuilder &Builder) const {
3194 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3195 Builder.defineMacro("__INTEL__");
3196 Builder.defineMacro("__rtems__");
3197 }
3198};
3199} // end anonymous namespace
3200
Chris Lattnerb986aba2010-04-11 19:29:39 +00003201namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003202// x86-64 generic target
3203class X86_64TargetInfo : public X86TargetInfo {
3204public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003205 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00003206 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003207 LongDoubleWidth = 128;
3208 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003209 LargeArrayMinWidth = 128;
3210 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003211 SuitableAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003212 IntMaxType = SignedLong;
3213 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003214 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003215 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003216
Rafael Espindolac418ae92014-01-03 19:22:05 +00003217 DescriptionString = "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003218
3219 // Use fpret only for long double.
3220 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003221
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003222 // Use fp2ret for _Complex long double.
3223 ComplexLongDoubleUsesFP2Ret = true;
3224
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003225 // x86-64 has atomics up to 16 bytes.
3226 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3227 // on CPUs with cmpxchg16b
3228 MaxAtomicPromoteWidth = 128;
3229 MaxAtomicInlineWidth = 64;
Chris Lattner10a5b382007-01-29 05:24:35 +00003230 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003231 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3232 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003233 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003234
Chris Lattnerd545ad12009-09-23 06:06:36 +00003235 int getEHDataRegisterNumber(unsigned RegNo) const {
3236 if (RegNo == 0) return 0;
3237 if (RegNo == 1) return 1;
3238 return -1;
3239 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003240
3241 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
Charles Davisb5a214e2013-08-30 04:39:01 +00003242 return (CC == CC_C ||
3243 CC == CC_IntelOclBicc ||
3244 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003245 }
3246
Aaron Ballman02df2e02012-12-09 17:45:41 +00003247 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
3248 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003249 }
3250
Eli Friedman3fd920a2008-08-20 02:34:37 +00003251};
3252} // end anonymous namespace
3253
3254namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003255// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003256class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003257public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003258 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3259 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003260 TLSSupported = false;
3261 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003262 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003263 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003264 IntMaxType = SignedLongLong;
3265 UIntMaxType = UnsignedLongLong;
3266 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003267 SizeType = UnsignedLongLong;
3268 PtrDiffType = SignedLongLong;
3269 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003270 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003271 }
3272 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003273 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003274 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003275 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003276 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003277 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3278 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003279 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003280 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3281 return (CC == CC_C ||
3282 CC == CC_IntelOclBicc ||
3283 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3284 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003285};
3286} // end anonymous namespace
3287
3288namespace {
3289// x86-64 Windows Visual Studio target
3290class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
3291public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003292 VisualStudioWindowsX86_64TargetInfo(const llvm::Triple &Triple)
3293 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003294 LongDoubleWidth = LongDoubleAlign = 64;
3295 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003296 }
3297 virtual void getTargetDefines(const LangOptions &Opts,
3298 MacroBuilder &Builder) const {
3299 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3300 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003301 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003302 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003303 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003304};
3305} // end anonymous namespace
3306
3307namespace {
3308// x86-64 MinGW target
3309class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3310public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003311 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3312 : WindowsX86_64TargetInfo(Triple) {}
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003313 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003314 MacroBuilder &Builder) const {
3315 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003316 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003317 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00003318 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003319 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003320
3321 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3322 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003323 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003324 // Provide "as-is" __declspec.
3325 Builder.defineMacro("__declspec", "__declspec");
3326 else
3327 // Provide alias of __attribute__ like mingw32-gcc.
3328 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003329 }
3330};
3331} // end anonymous namespace
3332
3333namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003334class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3335public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003336 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3337 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003338 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003339 MaxVectorAlign = 256;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003340 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003341 }
3342};
3343} // end anonymous namespace
3344
3345namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003346class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3347public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003348 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3349 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003350 IntMaxType = SignedLongLong;
3351 UIntMaxType = UnsignedLongLong;
3352 Int64Type = SignedLongLong;
3353 }
3354};
3355} // end anonymous namespace
3356
3357namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003358class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3359public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003360 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3361 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3362 IntMaxType = SignedLongLong;
3363 UIntMaxType = UnsignedLongLong;
3364 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003365 }
3366};
Tim Northover9bb857a2013-01-31 12:13:10 +00003367}
3368
3369namespace {
3370class AArch64TargetInfo : public TargetInfo {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003371 virtual void setDescriptionString() = 0;
Tim Northover9bb857a2013-01-31 12:13:10 +00003372 static const char * const GCCRegNames[];
3373 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003374
Tim Northover2fe823a2013-08-01 09:23:19 +00003375 enum FPUModeEnum {
3376 FPUMode,
3377 NeonMode
3378 };
3379
3380 unsigned FPU;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003381 unsigned Crypto;
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003382 static const Builtin::Info BuiltinInfo[];
Tim Northover2fe823a2013-08-01 09:23:19 +00003383
Tim Northover9bb857a2013-01-31 12:13:10 +00003384public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003385 AArch64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Kevin Qinad64f6d2014-02-24 02:45:03 +00003386 IntMaxType = SignedLong;
3387 UIntMaxType = UnsignedLong;
3388 Int64Type = SignedLong;
Tim Northover9bb857a2013-01-31 12:13:10 +00003389 LongWidth = LongAlign = 64;
3390 LongDoubleWidth = LongDoubleAlign = 128;
3391 PointerWidth = PointerAlign = 64;
3392 SuitableAlign = 128;
Tim Northover9bb857a2013-01-31 12:13:10 +00003393
3394 WCharType = UnsignedInt;
Joerg Sonnenberger9864bd52014-02-02 21:55:10 +00003395 if (getTriple().getOS() == llvm::Triple::NetBSD)
3396 WCharType = SignedInt;
3397 else
3398 WCharType = UnsignedInt;
Tim Northover9bb857a2013-01-31 12:13:10 +00003399 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3400
Tim Northover847d2d42013-02-18 12:11:32 +00003401 // AArch64 backend supports 64-bit operations at the moment. In principle
3402 // 128-bit is possible if register-pairs are used.
3403 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3404
Tim Northover9bb857a2013-01-31 12:13:10 +00003405 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3406 }
3407 virtual void getTargetDefines(const LangOptions &Opts,
3408 MacroBuilder &Builder) const {
3409 // GCC defines theses currently
3410 Builder.defineMacro("__aarch64__");
Tim Northover9bb857a2013-01-31 12:13:10 +00003411
3412 // ACLE predefines. Many can only have one possible value on v8 AArch64.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003413 Builder.defineMacro("__ARM_ACLE", "200");
Tim Northoverb85654d2013-04-05 14:08:55 +00003414 Builder.defineMacro("__ARM_ARCH", "8");
3415 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
Tim Northover9bb857a2013-01-31 12:13:10 +00003416
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003417 Builder.defineMacro("__ARM_64BIT_STATE");
3418 Builder.defineMacro("__ARM_PCS_AAPCS64");
3419 Builder.defineMacro("__ARM_ARCH_ISA_A64");
3420
Tim Northoverb85654d2013-04-05 14:08:55 +00003421 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
3422 Builder.defineMacro("__ARM_FEATURE_CLZ");
3423 Builder.defineMacro("__ARM_FEATURE_FMA");
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003424 Builder.defineMacro("__ARM_FEATURE_DIV");
Tim Northover9bb857a2013-01-31 12:13:10 +00003425
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003426 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
Tim Northover9bb857a2013-01-31 12:13:10 +00003427
3428 // 0xe implies support for half, single and double precision operations.
Tim Northoverb85654d2013-04-05 14:08:55 +00003429 Builder.defineMacro("__ARM_FP", "0xe");
Tim Northover9bb857a2013-01-31 12:13:10 +00003430
3431 // PCS specifies this for SysV variants, which is all we support. Other ABIs
Tim Northoverb85654d2013-04-05 14:08:55 +00003432 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
3433 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
Tim Northover9bb857a2013-01-31 12:13:10 +00003434
3435 if (Opts.FastMath || Opts.FiniteMathOnly)
Tim Northoverb85654d2013-04-05 14:08:55 +00003436 Builder.defineMacro("__ARM_FP_FAST");
Tim Northover9bb857a2013-01-31 12:13:10 +00003437
3438 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
Tim Northoverb85654d2013-04-05 14:08:55 +00003439 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
Tim Northover9bb857a2013-01-31 12:13:10 +00003440
Tim Northoverb85654d2013-04-05 14:08:55 +00003441 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
Tim Northover9bb857a2013-01-31 12:13:10 +00003442 Opts.ShortWChar ? "2" : "4");
3443
Tim Northoverb85654d2013-04-05 14:08:55 +00003444 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
Tim Northover9bb857a2013-01-31 12:13:10 +00003445 Opts.ShortEnums ? "1" : "4");
3446
3447 if (BigEndian)
Tim Northover2fe823a2013-08-01 09:23:19 +00003448 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3449
Joerg Sonnenberger9864bd52014-02-02 21:55:10 +00003450 if (getTriple().getOS() == llvm::Triple::NetBSD) {
3451 if (BigEndian)
3452 Builder.defineMacro("__BIG_ENDIAN__");
3453 else
3454 Builder.defineMacro("__LITTLE_ENDIAN__");
3455 }
3456
Tim Northover2fe823a2013-08-01 09:23:19 +00003457 if (FPU == NeonMode) {
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003458 Builder.defineMacro("__ARM_NEON");
Tim Northover2fe823a2013-08-01 09:23:19 +00003459 // 64-bit NEON supports half, single and double precision operations.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003460 Builder.defineMacro("__ARM_NEON_FP", "7");
3461 }
3462
3463 if (Crypto) {
3464 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northover2fe823a2013-08-01 09:23:19 +00003465 }
Tim Northover9bb857a2013-01-31 12:13:10 +00003466 }
3467 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3468 unsigned &NumRecords) const {
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003469 Records = BuiltinInfo;
3470 NumRecords = clang::AArch64::LastTSBuiltin-Builtin::FirstTSBuiltin;
Tim Northover9bb857a2013-01-31 12:13:10 +00003471 }
3472 virtual bool hasFeature(StringRef Feature) const {
Tim Northover2fe823a2013-08-01 09:23:19 +00003473 return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode);
Tim Northover9bb857a2013-01-31 12:13:10 +00003474 }
Tim Northover2fe823a2013-08-01 09:23:19 +00003475
Amara Emerson703da2e2013-10-31 09:32:33 +00003476 virtual bool setCPU(const std::string &Name) {
3477 return llvm::StringSwitch<bool>(Name)
3478 .Case("generic", true)
3479 .Cases("cortex-a53", "cortex-a57", true)
3480 .Default(false);
3481 }
3482
Eric Christopher3ff21b32013-10-16 21:26:26 +00003483 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003484 DiagnosticsEngine &Diags) {
Tim Northover2fe823a2013-08-01 09:23:19 +00003485 FPU = FPUMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003486 Crypto = 0;
Tim Northover2fe823a2013-08-01 09:23:19 +00003487 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3488 if (Features[i] == "+neon")
3489 FPU = NeonMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003490 if (Features[i] == "+crypto")
3491 Crypto = 1;
Tim Northover2fe823a2013-08-01 09:23:19 +00003492 }
Christian Pirker9b019ae2014-02-25 13:51:00 +00003493
3494 setDescriptionString();
3495
Rafael Espindolaeb265472013-08-21 21:59:03 +00003496 return true;
Tim Northover2fe823a2013-08-01 09:23:19 +00003497 }
3498
3499 virtual void getGCCRegNames(const char *const *&Names,
Tim Northover9bb857a2013-01-31 12:13:10 +00003500 unsigned &NumNames) const;
3501 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3502 unsigned &NumAliases) const;
3503
3504 virtual bool isCLZForZeroUndef() const { return false; }
3505
3506 virtual bool validateAsmConstraint(const char *&Name,
3507 TargetInfo::ConstraintInfo &Info) const {
3508 switch (*Name) {
3509 default: return false;
3510 case 'w': // An FP/SIMD vector register
3511 Info.setAllowsRegister();
3512 return true;
3513 case 'I': // Constant that can be used with an ADD instruction
3514 case 'J': // Constant that can be used with a SUB instruction
3515 case 'K': // Constant that can be used with a 32-bit logical instruction
3516 case 'L': // Constant that can be used with a 64-bit logical instruction
3517 case 'M': // Constant that can be used as a 32-bit MOV immediate
3518 case 'N': // Constant that can be used as a 64-bit MOV immediate
3519 case 'Y': // Floating point constant zero
3520 case 'Z': // Integer constant zero
3521 return true;
3522 case 'Q': // A memory reference with base register and no offset
3523 Info.setAllowsMemory();
3524 return true;
3525 case 'S': // A symbolic address
3526 Info.setAllowsRegister();
3527 return true;
3528 case 'U':
3529 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3530 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3531 // Usa: An absolute symbolic address
3532 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3533 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3534 }
3535 }
3536
3537 virtual const char *getClobbers() const {
3538 // There are no AArch64 clobbers shared by all asm statements.
3539 return "";
3540 }
3541
3542 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3543 return TargetInfo::AArch64ABIBuiltinVaList;
3544 }
3545};
3546
3547const char * const AArch64TargetInfo::GCCRegNames[] = {
3548 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3549 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3550 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3551 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3552
3553 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3554 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3555 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3556 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3557
3558 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3559 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3560 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3561 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3562
3563 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3564 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3565 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3566 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3567
3568 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3569 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3570 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3571 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3572
3573 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3574 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3575 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3576 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3577
3578 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3579 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3580 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3581 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3582};
3583
3584void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3585 unsigned &NumNames) const {
3586 Names = GCCRegNames;
3587 NumNames = llvm::array_lengthof(GCCRegNames);
3588}
3589
3590const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3591 { { "x16" }, "ip0"},
3592 { { "x17" }, "ip1"},
3593 { { "x29" }, "fp" },
3594 { { "x30" }, "lr" }
3595};
3596
3597void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3598 unsigned &NumAliases) const {
3599 Aliases = GCCRegAliases;
3600 NumAliases = llvm::array_lengthof(GCCRegAliases);
3601
3602}
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003603
3604const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
3605#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3606#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3607 ALL_LANGUAGES },
Tim Northoverc322f832014-01-30 14:47:51 +00003608#define GET_NEON_BUILTINS
3609#include "clang/Basic/arm_neon.inc"
3610#undef GET_NEON_BUILTINS
3611
3612#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3613#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3614 ALL_LANGUAGES },
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003615#include "clang/Basic/BuiltinsAArch64.def"
3616};
3617
Christian Pirker9b019ae2014-02-25 13:51:00 +00003618class AArch64leTargetInfo : public AArch64TargetInfo {
3619 virtual void setDescriptionString() {
3620 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
3621 }
3622
3623public:
3624 AArch64leTargetInfo(const llvm::Triple &Triple)
3625 : AArch64TargetInfo(Triple) {
3626 BigEndian = false;
3627 }
3628 virtual void getTargetDefines(const LangOptions &Opts,
3629 MacroBuilder &Builder) const {
3630 Builder.defineMacro("__AARCH64EL__");
3631 AArch64TargetInfo::getTargetDefines(Opts, Builder);
3632 }
3633};
3634
3635class AArch64beTargetInfo : public AArch64TargetInfo {
3636 virtual void setDescriptionString() {
3637 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
3638 }
3639
3640public:
3641 AArch64beTargetInfo(const llvm::Triple &Triple)
3642 : AArch64TargetInfo(Triple) { }
3643 virtual void getTargetDefines(const LangOptions &Opts,
3644 MacroBuilder &Builder) const {
3645 Builder.defineMacro("__AARCH64EB__");
3646 AArch64TargetInfo::getTargetDefines(Opts, Builder);
3647 }
3648};
3649
Eli Friedman9fa28852012-08-08 23:57:20 +00003650} // end anonymous namespace
3651
3652namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003653class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003654 // Possible FPU choices.
3655 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003656 VFP2FPU = (1 << 0),
3657 VFP3FPU = (1 << 1),
3658 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003659 NeonFPU = (1 << 3),
3660 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003661 };
3662
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003663 // Possible HWDiv features.
3664 enum HWDivMode {
3665 HWDivThumb = (1 << 0),
3666 HWDivARM = (1 << 1)
3667 };
3668
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003669 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003670 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003671 }
3672
3673 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3674 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003675
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003676 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003677
Rafael Espindolaeb265472013-08-21 21:59:03 +00003678 enum {
3679 FP_Default,
3680 FP_VFP,
3681 FP_Neon
3682 } FPMath;
3683
Bernard Ogdenda13af32013-10-24 18:32:51 +00003684 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003685
Logan Chien57086ce2012-10-10 06:56:20 +00003686 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003687 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003688 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003689
3690 // Initialized via features.
3691 unsigned SoftFloat : 1;
3692 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003693
Bernard Ogden18b57012013-10-29 09:47:51 +00003694 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003695 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003696
Chris Lattner5cc15e02010-03-03 19:03:45 +00003697 static const Builtin::Info BuiltinInfo[];
3698
Rafael Espindola101d5b92013-05-13 20:09:47 +00003699 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3700 // On linux, binaries targeting old cpus call functions in libgcc to
3701 // perform atomic operations. The implementation in libgcc then calls into
3702 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3703 // is that if we assume the kernel is at least as recent as the hardware,
3704 // it is safe to use atomic instructions on armv6 and newer.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003705 if (!T.isOSLinux() &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003706 T.getOS() != llvm::Triple::FreeBSD &&
Joerg Sonnenbergerfbd51be2013-12-02 16:12:05 +00003707 T.getOS() != llvm::Triple::NetBSD &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003708 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten60afa2d2013-06-15 09:40:14 +00003709 return false;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003710 StringRef ArchName = T.getArchName();
Rafael Espindola92dbc312013-05-14 00:44:24 +00003711 if (T.getArch() == llvm::Triple::arm) {
3712 if (!ArchName.startswith("armv"))
3713 return false;
3714 StringRef VersionStr = ArchName.substr(4);
3715 unsigned Version;
3716 if (VersionStr.getAsInteger(10, Version))
3717 return false;
3718 return Version >= 6;
3719 }
3720 assert(T.getArch() == llvm::Triple::thumb);
3721 if (!ArchName.startswith("thumbv"))
3722 return false;
3723 StringRef VersionStr = ArchName.substr(6);
3724 unsigned Version;
3725 if (VersionStr.getAsInteger(10, Version))
3726 return false;
3727 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003728 }
3729
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003730 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003731 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003732
3733 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003734 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003735
Joerg Sonnenbergerf19dc302014-01-26 20:02:03 +00003736 // size_t is unsigned long on Darwin and NetBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003737 if (T.isOSDarwin() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003738 SizeType = UnsignedLong;
3739 else
3740 SizeType = UnsignedInt;
3741
Rafael Espindolac418ae92014-01-03 19:22:05 +00003742 if (T.getOS() == llvm::Triple::NetBSD) {
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003743 WCharType = SignedInt;
3744 } else {
3745 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3746 WCharType = UnsignedInt;
3747 }
3748
3749 UseBitFieldTypeAlignment = true;
3750
3751 ZeroLengthBitfieldBoundary = 0;
3752
3753 if (IsThumb) {
3754 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3755 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003756 if (T.isOSBinFormatMachO())
3757 DescriptionString = "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3758 "v128:64:128-a:0:32-n32-S64";
3759 else
3760 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3761 "v128:64:128-a:0:32-n32-S64";
3762
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003763 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003764 if (T.isOSBinFormatMachO())
3765 DescriptionString = "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
3766 else
3767 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003768 }
3769
3770 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003771 }
3772
3773 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003774 const llvm::Triple &T = getTriple();
3775
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003776 IsAAPCS = false;
3777
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003778 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003779
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003780 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003781 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003782 SizeType = UnsignedInt;
3783 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003784 SizeType = UnsignedLong;
3785
3786 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3787 WCharType = SignedInt;
3788
3789 // Do not respect the alignment of bit-field types when laying out
3790 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3791 UseBitFieldTypeAlignment = false;
3792
3793 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3794 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3795 /// gcc.
3796 ZeroLengthBitfieldBoundary = 32;
3797
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003798 if (IsThumb) {
3799 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3800 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003801 if (T.isOSBinFormatMachO())
3802 DescriptionString = "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3803 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
3804 else
3805 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3806 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003807 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003808 if (T.isOSBinFormatMachO())
3809 DescriptionString =
3810 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3811 else
3812 DescriptionString =
3813 "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 +00003814 }
3815
3816 // FIXME: Override "preferred align" for double and long long.
3817 }
3818
Chris Lattner17df24e2008-04-21 18:56:49 +00003819public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003820 ARMTargetInfo(const llvm::Triple &Triple)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003821 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3822 IsAAPCS(true) {
Eli Friedman803acb32011-12-22 03:51:45 +00003823 BigEndian = false;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003824 switch (getTriple().getOS()) {
3825 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003826 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003827 break;
3828 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003829 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003830 break;
3831 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003832
Chris Lattner1a8f3942010-04-23 16:29:58 +00003833 // {} in inline assembly are neon specifiers, not assembly variant
3834 // specifiers.
3835 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003836
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003837 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003838 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003839
3840 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003841
3842 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003843 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003844
3845 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003846 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003847 if (shouldUseInlineAtomic(getTriple()))
3848 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003849
3850 // Do force alignment of members that follow zero length bitfields. If
3851 // the alignment of the zero-length bitfield is greater than the member
3852 // that follows it, `bar', `bar' will be aligned as the type of the
3853 // zero length bitfield.
3854 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003855 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003856 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003857 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003858 ABI = Name;
3859
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003860 // The defaults (above) are for AAPCS, check if we need to change them.
3861 //
3862 // FIXME: We need support for -meabi... we could just mangle it into the
3863 // name.
3864 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003865 setABIAPCS();
3866 return true;
3867 }
3868 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3869 setABIAAPCS();
3870 return true;
3871 }
3872 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003873 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003874
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00003875 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003876 if (IsAAPCS)
3877 Features["aapcs"] = true;
3878 else
3879 Features["apcs"] = true;
3880
Silviu Barangae5690462013-10-21 10:59:33 +00003881 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003882 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3883 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003884 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3885 CPU == "cortex-a9-mp") {
3886 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003887 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003888 }
3889 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003890 Features["vfp4"] = true;
3891 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003892 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3893 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3894 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003895 Features["vfp4"] = true;
3896 Features["neon"] = true;
3897 Features["hwdiv"] = true;
3898 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003899 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3900 Features["fp-armv8"] = true;
3901 Features["neon"] = true;
3902 Features["hwdiv"] = true;
3903 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003904 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003905 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003906 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003907 // Enable the hwdiv extension for all v8a AArch32 cores by
3908 // default.
3909 ArchName == "armv8a" || ArchName == "armv8" ||
3910 ArchName == "thumbv8a" || ArchName == "thumbv8") {
3911 Features["hwdiv"] = true;
3912 Features["hwdiv-arm"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003913 } else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
3914 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003915 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003916 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003917
Eric Christopher3ff21b32013-10-16 21:26:26 +00003918 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003919 DiagnosticsEngine &Diags) {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003920 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003921 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003922 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003923 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003924 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003925 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3926 if (Features[i] == "+soft-float")
3927 SoftFloat = true;
3928 else if (Features[i] == "+soft-float-abi")
3929 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003930 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003931 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003932 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003933 FPU |= VFP3FPU;
3934 else if (Features[i] == "+vfp4")
3935 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003936 else if (Features[i] == "+fp-armv8")
3937 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003938 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003939 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003940 else if (Features[i] == "+hwdiv")
3941 HWDiv |= HWDivThumb;
3942 else if (Features[i] == "+hwdiv-arm")
3943 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00003944 else if (Features[i] == "+crc")
3945 CRC = 1;
Tim Northover02e38602014-02-03 17:28:04 +00003946 else if (Features[i] == "+crypto")
3947 Crypto = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003948 }
3949
Rafael Espindolaeb265472013-08-21 21:59:03 +00003950 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3951 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3952 return false;
3953 }
3954
3955 if (FPMath == FP_Neon)
3956 Features.push_back("+neonfp");
3957 else if (FPMath == FP_VFP)
3958 Features.push_back("-neonfp");
3959
Daniel Dunbar893d4752009-12-19 04:15:38 +00003960 // Remove front-end specific options which the backend handles differently.
3961 std::vector<std::string>::iterator it;
3962 it = std::find(Features.begin(), Features.end(), "+soft-float");
3963 if (it != Features.end())
3964 Features.erase(it);
3965 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3966 if (it != Features.end())
3967 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00003968 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003969 }
3970
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003971 virtual bool hasFeature(StringRef Feature) const {
3972 return llvm::StringSwitch<bool>(Feature)
3973 .Case("arm", true)
3974 .Case("softfloat", SoftFloat)
3975 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003976 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003977 .Case("hwdiv", HWDiv & HWDivThumb)
3978 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003979 .Default(false);
3980 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003981 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003982 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003983 return llvm::StringSwitch<const char*>(Name)
3984 .Cases("arm8", "arm810", "4")
3985 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3986 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3987 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3988 .Case("ep9312", "4T")
3989 .Cases("arm10tdmi", "arm1020t", "5T")
3990 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3991 .Case("arm926ej-s", "5TEJ")
3992 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3993 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003994 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003995 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003996 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003997 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00003998 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003999 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00004000 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00004001 .Case("swift", "7S")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004002 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00004003 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00004004 .Cases("cortex-a53", "cortex-a57", "8A")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004005 .Default(0);
4006 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004007 static const char *getCPUProfile(StringRef Name) {
4008 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00004009 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00004010 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00004011 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004012 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00004013 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00004014 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004015 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004016 virtual bool setCPU(const std::string &Name) {
4017 if (!getCPUDefineSuffix(Name))
4018 return false;
4019
4020 CPU = Name;
4021 return true;
4022 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00004023 virtual bool setFPMath(StringRef Name);
Chris Lattner4ba73aa02009-03-20 15:52:06 +00004024 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004025 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00004026 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004027 Builder.defineMacro("__arm");
4028 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004029
Chris Lattnerecd49032009-03-02 22:27:17 +00004030 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004031 Builder.defineMacro("__ARMEL__");
4032 Builder.defineMacro("__LITTLE_ENDIAN__");
4033 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004034
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004035 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004036 unsigned int CPUArchVer;
4037 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
4038 llvm_unreachable("Invalid char for architecture version number");
4039 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004040 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004041 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
4042 StringRef CPUProfile = getCPUProfile(CPU);
4043 if (!CPUProfile.empty())
4044 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004045
Mike Stump9d54bd72009-04-08 02:07:04 +00004046 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004047
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004048 // FIXME: It's more complicated than this and we don't really support
4049 // interworking.
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004050 if (5 <= CPUArchVer && CPUArchVer <= 8)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004051 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004052
David Tweed8f676532012-10-25 13:33:01 +00004053 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004054 // Embedded targets on Darwin follow AAPCS, but not EABI.
4055 if (!getTriple().isOSDarwin())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004056 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004057 Builder.defineMacro("__ARM_PCS", "1");
4058
David Tweed8f676532012-10-25 13:33:01 +00004059 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004060 Builder.defineMacro("__ARM_PCS_VFP", "1");
4061 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004062
Daniel Dunbar893d4752009-12-19 04:15:38 +00004063 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004064 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004065
4066 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004067 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004068
4069 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004070 Builder.defineMacro("__THUMBEL__");
4071 Builder.defineMacro("__thumb__");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004072 // We check both CPUArchVer and ArchName because when only triple is
4073 // specified, the default CPU is arm1136j-s.
4074 StringRef ArchName = getTriple().getArchName();
4075 if (CPUArch == "6T2" || CPUArchVer >= 7 || ArchName.endswith("v6t2") ||
4076 ArchName.endswith("v7") || ArchName.endswith("v8"))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004077 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004078 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004079 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4080 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004081
4082 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004083 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004084
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004085 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004086 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004087 if (FPU & VFP2FPU)
4088 Builder.defineMacro("__ARM_VFPV2__");
4089 if (FPU & VFP3FPU)
4090 Builder.defineMacro("__ARM_VFPV3__");
4091 if (FPU & VFP4FPU)
4092 Builder.defineMacro("__ARM_VFPV4__");
4093 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004094
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004095 // This only gets set when Neon instructions are actually available, unlike
4096 // the VFP define, hence the soft float and arch check. This is subtly
4097 // different from gcc, we follow the intent which was that it should be set
4098 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004099 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4100 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004101 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004102 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004103
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004104 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4105 Opts.ShortWChar ? "2" : "4");
4106
4107 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4108 Opts.ShortEnums ? "1" : "4");
4109
Bernard Ogden18b57012013-10-29 09:47:51 +00004110 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004111 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004112
Tim Northover02e38602014-02-03 17:28:04 +00004113 if (Crypto)
4114 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4115
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004116 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004117 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4118 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4119 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4120 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4121 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004122 }
4123 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4124 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004125 Records = BuiltinInfo;
4126 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004127 }
Bob Wilsona7a61e22012-01-26 22:14:27 +00004128 virtual bool isCLZForZeroUndef() const { return false; }
Meador Inge5d3fb222012-06-16 03:34:49 +00004129 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Logan Chien57086ce2012-10-10 06:56:20 +00004130 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004131 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004132 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004133 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004134 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004135 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004136 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004137 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004138 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004139 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004140 case 'l': // r0-r7
4141 case 'h': // r8-r15
4142 case 'w': // VFP Floating point register single precision
4143 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004144 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004145 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004146 case 'Q': // A memory address that is a single base register.
4147 Info.setAllowsMemory();
4148 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004149 case 'U': // a memory reference...
4150 switch (Name[1]) {
4151 case 'q': // ...ARMV4 ldrsb
4152 case 'v': // ...VFP load/store (reg+constant offset)
4153 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004154 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004155 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004156 case 'n': // valid address for Neon doubleword vector load/store
4157 case 'm': // valid address for Neon element and structure load/store
4158 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004159 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004160 Info.setAllowsMemory();
4161 Name++;
4162 return true;
4163 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004164 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004165 return false;
4166 }
Evan Chengd863adb2011-06-16 19:13:15 +00004167 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004168 std::string R;
4169 switch (*Constraint) {
4170 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004171 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004172 Constraint++;
4173 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004174 case 'p': // 'p' should be translated to 'r' by default.
4175 R = std::string("r");
4176 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004177 default:
4178 return std::string(1, *Constraint);
4179 }
4180 return R;
4181 }
Bill Wendling9d1ee112012-10-25 23:28:48 +00004182 virtual bool validateConstraintModifier(StringRef Constraint,
4183 const char Modifier,
4184 unsigned Size) const {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004185 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004186 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004187
Bill Wendling9d1ee112012-10-25 23:28:48 +00004188 // Strip off constraint modifiers.
4189 while (Constraint[0] == '=' ||
4190 Constraint[0] == '+' ||
4191 Constraint[0] == '&')
4192 Constraint = Constraint.substr(1);
4193
4194 switch (Constraint[0]) {
4195 default: break;
4196 case 'r': {
4197 switch (Modifier) {
4198 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004199 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004200 case 'q':
4201 // A register of size 32 cannot fit a vector type.
4202 return false;
4203 }
4204 }
4205 }
4206
4207 return true;
4208 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004209 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004210 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004211 return "";
4212 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004213
4214 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
4215 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4216 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004217
4218 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4219 if (RegNo == 0) return 0;
4220 if (RegNo == 1) return 1;
4221 return -1;
4222 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004223};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004224
Rafael Espindolaeb265472013-08-21 21:59:03 +00004225bool ARMTargetInfo::setFPMath(StringRef Name) {
4226 if (Name == "neon") {
4227 FPMath = FP_Neon;
4228 return true;
4229 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4230 Name == "vfp4") {
4231 FPMath = FP_VFP;
4232 return true;
4233 }
4234 return false;
4235}
4236
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004237const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004238 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004239 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004240 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4241
4242 // Float registers
4243 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4244 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4245 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004246 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004247
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004248 // Double registers
4249 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4250 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004251 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4252 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004253
4254 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004255 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4256 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004257};
4258
4259void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004260 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004261 Names = GCCRegNames;
4262 NumNames = llvm::array_lengthof(GCCRegNames);
4263}
4264
4265const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004266 { { "a1" }, "r0" },
4267 { { "a2" }, "r1" },
4268 { { "a3" }, "r2" },
4269 { { "a4" }, "r3" },
4270 { { "v1" }, "r4" },
4271 { { "v2" }, "r5" },
4272 { { "v3" }, "r6" },
4273 { { "v4" }, "r7" },
4274 { { "v5" }, "r8" },
4275 { { "v6", "rfp" }, "r9" },
4276 { { "sl" }, "r10" },
4277 { { "fp" }, "r11" },
4278 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004279 { { "r13" }, "sp" },
4280 { { "r14" }, "lr" },
4281 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004282 // The S, D and Q registers overlap, but aren't really aliases; we
4283 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004284};
4285
4286void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4287 unsigned &NumAliases) const {
4288 Aliases = GCCRegAliases;
4289 NumAliases = llvm::array_lengthof(GCCRegAliases);
4290}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004291
4292const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004293#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004294#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004295 ALL_LANGUAGES },
Tim Northoverc322f832014-01-30 14:47:51 +00004296#define GET_NEON_BUILTINS
4297#include "clang/Basic/arm_neon.inc"
4298#undef GET_NEON_BUILTINS
4299
4300#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4301#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4302 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004303#include "clang/Basic/BuiltinsARM.def"
4304};
Chris Lattner17df24e2008-04-21 18:56:49 +00004305} // end anonymous namespace.
4306
Eli Friedmanf05b7722008-08-20 07:44:10 +00004307namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004308class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00004309 public DarwinTargetInfo<ARMTargetInfo> {
4310protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00004311 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004312 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004313 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004314 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004315
Torok Edwinb2b37c62009-06-30 17:10:35 +00004316public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004317 DarwinARMTargetInfo(const llvm::Triple &Triple)
4318 : DarwinTargetInfo<ARMTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004319 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004320 // iOS always has 64-bit atomic instructions.
4321 // FIXME: This should be based off of the target features in ARMTargetInfo.
4322 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004323
4324 // Darwin on iOS uses a variant of the ARM C++ ABI.
4325 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004326 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004327};
4328} // end anonymous namespace.
4329
Tony Linthicum76329bf2011-12-12 21:14:55 +00004330
4331namespace {
4332// Hexagon abstract base class
4333class HexagonTargetInfo : public TargetInfo {
4334 static const Builtin::Info BuiltinInfo[];
4335 static const char * const GCCRegNames[];
4336 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4337 std::string CPU;
4338public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004339 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004340 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004341 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004342
4343 // {} in inline assembly are packet specifiers, not assembly variant
4344 // specifiers.
4345 NoAsmVariants = true;
4346 }
4347
4348 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4349 unsigned &NumRecords) const {
4350 Records = BuiltinInfo;
4351 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4352 }
4353
4354 virtual bool validateAsmConstraint(const char *&Name,
4355 TargetInfo::ConstraintInfo &Info) const {
4356 return true;
4357 }
4358
4359 virtual void getTargetDefines(const LangOptions &Opts,
4360 MacroBuilder &Builder) const;
4361
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004362 virtual bool hasFeature(StringRef Feature) const {
4363 return Feature == "hexagon";
4364 }
4365
Meador Inge5d3fb222012-06-16 03:34:49 +00004366 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4367 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004368 }
4369 virtual void getGCCRegNames(const char * const *&Names,
4370 unsigned &NumNames) const;
4371 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4372 unsigned &NumAliases) const;
4373 virtual const char *getClobbers() const {
4374 return "";
4375 }
Sebastian Pop86500282012-01-13 20:37:10 +00004376
4377 static const char *getHexagonCPUSuffix(StringRef Name) {
4378 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004379 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004380 .Case("hexagonv5", "5")
Sebastian Pop86500282012-01-13 20:37:10 +00004381 .Default(0);
4382 }
4383
Tony Linthicum76329bf2011-12-12 21:14:55 +00004384 virtual bool setCPU(const std::string &Name) {
Sebastian Pop86500282012-01-13 20:37:10 +00004385 if (!getHexagonCPUSuffix(Name))
4386 return false;
4387
Tony Linthicum76329bf2011-12-12 21:14:55 +00004388 CPU = Name;
4389 return true;
4390 }
4391};
4392
4393void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4394 MacroBuilder &Builder) const {
4395 Builder.defineMacro("qdsp6");
4396 Builder.defineMacro("__qdsp6", "1");
4397 Builder.defineMacro("__qdsp6__", "1");
4398
4399 Builder.defineMacro("hexagon");
4400 Builder.defineMacro("__hexagon", "1");
4401 Builder.defineMacro("__hexagon__", "1");
4402
4403 if(CPU == "hexagonv1") {
4404 Builder.defineMacro("__HEXAGON_V1__");
4405 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4406 if(Opts.HexagonQdsp6Compat) {
4407 Builder.defineMacro("__QDSP6_V1__");
4408 Builder.defineMacro("__QDSP6_ARCH__", "1");
4409 }
4410 }
4411 else if(CPU == "hexagonv2") {
4412 Builder.defineMacro("__HEXAGON_V2__");
4413 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4414 if(Opts.HexagonQdsp6Compat) {
4415 Builder.defineMacro("__QDSP6_V2__");
4416 Builder.defineMacro("__QDSP6_ARCH__", "2");
4417 }
4418 }
4419 else if(CPU == "hexagonv3") {
4420 Builder.defineMacro("__HEXAGON_V3__");
4421 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4422 if(Opts.HexagonQdsp6Compat) {
4423 Builder.defineMacro("__QDSP6_V3__");
4424 Builder.defineMacro("__QDSP6_ARCH__", "3");
4425 }
4426 }
4427 else if(CPU == "hexagonv4") {
4428 Builder.defineMacro("__HEXAGON_V4__");
4429 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4430 if(Opts.HexagonQdsp6Compat) {
4431 Builder.defineMacro("__QDSP6_V4__");
4432 Builder.defineMacro("__QDSP6_ARCH__", "4");
4433 }
4434 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004435 else if(CPU == "hexagonv5") {
4436 Builder.defineMacro("__HEXAGON_V5__");
4437 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4438 if(Opts.HexagonQdsp6Compat) {
4439 Builder.defineMacro("__QDSP6_V5__");
4440 Builder.defineMacro("__QDSP6_ARCH__", "5");
4441 }
4442 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004443}
4444
4445const char * const HexagonTargetInfo::GCCRegNames[] = {
4446 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4447 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4448 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4449 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4450 "p0", "p1", "p2", "p3",
4451 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4452};
4453
4454void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4455 unsigned &NumNames) const {
4456 Names = GCCRegNames;
4457 NumNames = llvm::array_lengthof(GCCRegNames);
4458}
4459
4460
4461const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4462 { { "sp" }, "r29" },
4463 { { "fp" }, "r30" },
4464 { { "lr" }, "r31" },
4465 };
4466
4467void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4468 unsigned &NumAliases) const {
4469 Aliases = GCCRegAliases;
4470 NumAliases = llvm::array_lengthof(GCCRegAliases);
4471}
4472
4473
4474const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4475#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4476#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4477 ALL_LANGUAGES },
4478#include "clang/Basic/BuiltinsHexagon.def"
4479};
4480}
4481
4482
Chris Lattner5ba61f02006-10-14 07:39:34 +00004483namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004484// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4485class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004486 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4487 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004488 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004489public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004490 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004491
Eric Christopher3ff21b32013-10-16 21:26:26 +00004492 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00004493 DiagnosticsEngine &Diags) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004494 SoftFloat = false;
4495 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4496 if (Features[i] == "+soft-float")
4497 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004498 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004499 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00004500 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004501 MacroBuilder &Builder) const {
4502 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004503 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004504
4505 if (SoftFloat)
4506 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004507 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004508
4509 virtual bool hasFeature(StringRef Feature) const {
4510 return llvm::StringSwitch<bool>(Feature)
4511 .Case("softfloat", SoftFloat)
4512 .Case("sparc", true)
4513 .Default(false);
4514 }
4515
Gabor Greif49991682008-02-21 16:29:08 +00004516 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4517 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004518 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00004519 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004520 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4521 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00004522 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004523 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00004524 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004525 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00004526 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004527 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00004528 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004529 // FIXME: Implement!
4530 return false;
Gabor Greif49991682008-02-21 16:29:08 +00004531 }
4532 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004533 // FIXME: Implement!
4534 return "";
Gabor Greif49991682008-02-21 16:29:08 +00004535 }
4536};
4537
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004538const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00004539 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4540 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4541 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4542 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4543};
4544
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004545void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4546 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004547 Names = GCCRegNames;
4548 NumNames = llvm::array_lengthof(GCCRegNames);
4549}
4550
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004551const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004552 { { "g0" }, "r0" },
4553 { { "g1" }, "r1" },
4554 { { "g2" }, "r2" },
4555 { { "g3" }, "r3" },
4556 { { "g4" }, "r4" },
4557 { { "g5" }, "r5" },
4558 { { "g6" }, "r6" },
4559 { { "g7" }, "r7" },
4560 { { "o0" }, "r8" },
4561 { { "o1" }, "r9" },
4562 { { "o2" }, "r10" },
4563 { { "o3" }, "r11" },
4564 { { "o4" }, "r12" },
4565 { { "o5" }, "r13" },
4566 { { "o6", "sp" }, "r14" },
4567 { { "o7" }, "r15" },
4568 { { "l0" }, "r16" },
4569 { { "l1" }, "r17" },
4570 { { "l2" }, "r18" },
4571 { { "l3" }, "r19" },
4572 { { "l4" }, "r20" },
4573 { { "l5" }, "r21" },
4574 { { "l6" }, "r22" },
4575 { { "l7" }, "r23" },
4576 { { "i0" }, "r24" },
4577 { { "i1" }, "r25" },
4578 { { "i2" }, "r26" },
4579 { { "i3" }, "r27" },
4580 { { "i4" }, "r28" },
4581 { { "i5" }, "r29" },
4582 { { "i6", "fp" }, "r30" },
4583 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00004584};
4585
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004586void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4587 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004588 Aliases = GCCRegAliases;
4589 NumAliases = llvm::array_lengthof(GCCRegAliases);
4590}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004591
4592// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4593class SparcV8TargetInfo : public SparcTargetInfo {
4594public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004595 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004596 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004597 }
4598
4599 virtual void getTargetDefines(const LangOptions &Opts,
4600 MacroBuilder &Builder) const {
4601 SparcTargetInfo::getTargetDefines(Opts, Builder);
4602 Builder.defineMacro("__sparcv8");
4603 }
4604};
4605
4606// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4607class SparcV9TargetInfo : public SparcTargetInfo {
4608public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004609 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004610 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00004611 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00004612 // This is an LP64 platform.
4613 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004614
4615 // OpenBSD uses long long for int64_t and intmax_t.
4616 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
4617 IntMaxType = SignedLongLong;
4618 UIntMaxType = UnsignedLongLong;
4619 } else {
4620 IntMaxType = SignedLong;
4621 UIntMaxType = UnsignedLong;
4622 }
4623 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00004624
4625 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
4626 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
4627 LongDoubleWidth = 128;
4628 LongDoubleAlign = 128;
4629 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00004630 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004631 }
4632
4633 virtual void getTargetDefines(const LangOptions &Opts,
4634 MacroBuilder &Builder) const {
4635 SparcTargetInfo::getTargetDefines(Opts, Builder);
4636 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00004637 Builder.defineMacro("__arch64__");
4638 // Solaris and its derivative AuroraUX don't need these variants, but the
4639 // BSDs do.
4640 if (getTriple().getOS() != llvm::Triple::Solaris &&
4641 getTriple().getOS() != llvm::Triple::AuroraUX) {
4642 Builder.defineMacro("__sparc64__");
4643 Builder.defineMacro("__sparc_v9__");
4644 Builder.defineMacro("__sparcv9__");
4645 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004646 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00004647
4648 virtual bool setCPU(const std::string &Name) {
4649 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4650 .Case("v9", true)
4651 .Case("ultrasparc", true)
4652 .Case("ultrasparc3", true)
4653 .Case("niagara", true)
4654 .Case("niagara2", true)
4655 .Case("niagara3", true)
4656 .Case("niagara4", true)
4657 .Default(false);
4658
4659 // No need to store the CPU yet. There aren't any CPU-specific
4660 // macros to define.
4661 return CPUKnown;
4662 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004663};
4664
Gabor Greif49991682008-02-21 16:29:08 +00004665} // end anonymous namespace.
4666
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004667namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004668class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4669public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004670 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
4671 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004672 SizeType = UnsignedInt;
4673 PtrDiffType = SignedInt;
4674 }
4675};
Torok Edwinb2b37c62009-06-30 17:10:35 +00004676class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004677public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004678 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
4679 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00004680 SizeType = UnsignedInt;
4681 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004682 }
4683};
4684} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00004685
Chris Lattnerb781dc792008-05-08 05:58:21 +00004686namespace {
Ulrich Weigand47445072013-05-06 16:26:41 +00004687 class SystemZTargetInfo : public TargetInfo {
4688 static const char *const GCCRegNames[];
4689
4690 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004691 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Ulrich Weigand47445072013-05-06 16:26:41 +00004692 TLSSupported = true;
4693 IntWidth = IntAlign = 32;
4694 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
4695 PointerWidth = PointerAlign = 64;
4696 LongDoubleWidth = 128;
4697 LongDoubleAlign = 64;
4698 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4699 MinGlobalAlign = 16;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004700 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
Ulrich Weigand47445072013-05-06 16:26:41 +00004701 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4702 }
4703 virtual void getTargetDefines(const LangOptions &Opts,
4704 MacroBuilder &Builder) const {
4705 Builder.defineMacro("__s390__");
4706 Builder.defineMacro("__s390x__");
4707 Builder.defineMacro("__zarch__");
4708 Builder.defineMacro("__LONG_DOUBLE_128__");
4709 }
4710 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4711 unsigned &NumRecords) const {
4712 // FIXME: Implement.
4713 Records = 0;
4714 NumRecords = 0;
4715 }
4716
4717 virtual void getGCCRegNames(const char *const *&Names,
4718 unsigned &NumNames) const;
4719 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4720 unsigned &NumAliases) const {
4721 // No aliases.
4722 Aliases = 0;
4723 NumAliases = 0;
4724 }
4725 virtual bool validateAsmConstraint(const char *&Name,
4726 TargetInfo::ConstraintInfo &info) const;
4727 virtual const char *getClobbers() const {
4728 // FIXME: Is this really right?
4729 return "";
4730 }
4731 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4732 return TargetInfo::SystemZBuiltinVaList;
4733 }
Richard Sandiford4652d892013-07-19 16:51:51 +00004734 virtual bool setCPU(const std::string &Name) {
4735 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4736 .Case("z10", true)
4737 .Case("z196", true)
4738 .Case("zEC12", true)
4739 .Default(false);
4740
4741 // No need to store the CPU yet. There aren't any CPU-specific
4742 // macros to define.
4743 return CPUKnown;
4744 }
Ulrich Weigand47445072013-05-06 16:26:41 +00004745 };
4746
4747 const char *const SystemZTargetInfo::GCCRegNames[] = {
4748 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4749 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4750 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
4751 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
4752 };
4753
4754 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
4755 unsigned &NumNames) const {
4756 Names = GCCRegNames;
4757 NumNames = llvm::array_lengthof(GCCRegNames);
4758 }
4759
4760 bool SystemZTargetInfo::
4761 validateAsmConstraint(const char *&Name,
4762 TargetInfo::ConstraintInfo &Info) const {
4763 switch (*Name) {
4764 default:
4765 return false;
4766
4767 case 'a': // Address register
4768 case 'd': // Data register (equivalent to 'r')
4769 case 'f': // Floating-point register
4770 Info.setAllowsRegister();
4771 return true;
4772
4773 case 'I': // Unsigned 8-bit constant
4774 case 'J': // Unsigned 12-bit constant
4775 case 'K': // Signed 16-bit constant
4776 case 'L': // Signed 20-bit displacement (on all targets we support)
4777 case 'M': // 0x7fffffff
4778 return true;
4779
4780 case 'Q': // Memory with base and unsigned 12-bit displacement
4781 case 'R': // Likewise, plus an index
4782 case 'S': // Memory with base and signed 20-bit displacement
4783 case 'T': // Likewise, plus an index
4784 Info.setAllowsMemory();
4785 return true;
4786 }
4787 }
4788}
4789
4790namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004791 class MSP430TargetInfo : public TargetInfo {
4792 static const char * const GCCRegNames[];
4793 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004794 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004795 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004796 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00004797 IntWidth = 16; IntAlign = 16;
4798 LongWidth = 32; LongLongWidth = 64;
4799 LongAlign = LongLongAlign = 16;
4800 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004801 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004802 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00004803 IntMaxType = SignedLongLong;
4804 UIntMaxType = UnsignedLongLong;
4805 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004806 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00004807 SigAtomicType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004808 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004809 }
4810 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004811 MacroBuilder &Builder) const {
4812 Builder.defineMacro("MSP430");
4813 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004814 // FIXME: defines for different 'flavours' of MCU
4815 }
4816 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4817 unsigned &NumRecords) const {
4818 // FIXME: Implement.
4819 Records = 0;
4820 NumRecords = 0;
4821 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004822 virtual bool hasFeature(StringRef Feature) const {
4823 return Feature == "msp430";
4824 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004825 virtual void getGCCRegNames(const char * const *&Names,
4826 unsigned &NumNames) const;
4827 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4828 unsigned &NumAliases) const {
4829 // No aliases.
4830 Aliases = 0;
4831 NumAliases = 0;
4832 }
4833 virtual bool validateAsmConstraint(const char *&Name,
4834 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00004835 // No target constraints for now.
4836 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004837 }
4838 virtual const char *getClobbers() const {
4839 // FIXME: Is this really right?
4840 return "";
4841 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004842 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004843 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00004844 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004845 }
4846 };
4847
4848 const char * const MSP430TargetInfo::GCCRegNames[] = {
4849 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4850 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4851 };
4852
4853 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4854 unsigned &NumNames) const {
4855 Names = GCCRegNames;
4856 NumNames = llvm::array_lengthof(GCCRegNames);
4857 }
4858}
4859
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00004860namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004861
Mike Stump11289f42009-09-09 15:08:12 +00004862 // LLVM and Clang cannot be used directly to output native binaries for
4863 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00004864 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00004865 //
4866 // TCE uses the llvm bitcode as input and uses it for generating customized
4867 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00004868 // publicly available in http://tce.cs.tut.fi
4869
Eli Friedman1f191002011-10-07 19:51:42 +00004870 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4871 3, // opencl_global
4872 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00004873 5, // opencl_constant
4874 0, // cuda_device
4875 0, // cuda_constant
4876 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00004877 };
4878
Eli Friedmana9c3d712009-08-19 20:47:07 +00004879 class TCETargetInfo : public TargetInfo{
4880 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004881 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004882 TLSSupported = false;
4883 IntWidth = 32;
4884 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004885 PointerWidth = 32;
4886 IntAlign = 32;
4887 LongAlign = LongLongAlign = 32;
4888 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004889 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004890 SizeType = UnsignedInt;
4891 IntMaxType = SignedLong;
4892 UIntMaxType = UnsignedLong;
4893 IntPtrType = SignedInt;
4894 PtrDiffType = SignedInt;
4895 FloatWidth = 32;
4896 FloatAlign = 32;
4897 DoubleWidth = 32;
4898 DoubleAlign = 32;
4899 LongDoubleWidth = 32;
4900 LongDoubleAlign = 32;
4901 FloatFormat = &llvm::APFloat::IEEEsingle;
4902 DoubleFormat = &llvm::APFloat::IEEEsingle;
4903 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00004904 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
4905 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00004906 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00004907 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004908 }
4909
4910 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004911 MacroBuilder &Builder) const {
4912 DefineStd(Builder, "tce", Opts);
4913 Builder.defineMacro("__TCE__");
4914 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00004915 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004916 virtual bool hasFeature(StringRef Feature) const {
4917 return Feature == "tce";
4918 }
4919
Eli Friedmana9c3d712009-08-19 20:47:07 +00004920 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4921 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00004922 virtual const char *getClobbers() const {
4923 return "";
4924 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004925 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4926 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004927 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00004928 virtual void getGCCRegNames(const char * const *&Names,
4929 unsigned &NumNames) const {}
4930 virtual bool validateAsmConstraint(const char *&Name,
4931 TargetInfo::ConstraintInfo &info) const {
4932 return true;
4933 }
4934 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4935 unsigned &NumAliases) const {}
4936 };
4937}
4938
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004939namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004940class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00004941 virtual void setDescriptionString() = 0;
4942
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004943 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004944 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00004945 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00004946 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004947 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00004948 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004949 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00004950 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004951 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004952 enum DspRevEnum {
4953 NoDSP, DSP1, DSP2
4954 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00004955 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004956
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004957protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00004958 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004959 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004960
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004961public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004962 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
4963 const std::string &CPUStr)
4964 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004965 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004966 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004967
Eric Christopher0b26a612010-03-02 02:41:08 +00004968 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004969 virtual bool setABI(const std::string &Name) = 0;
Eric Christopher0b26a612010-03-02 02:41:08 +00004970 virtual bool setCPU(const std::string &Name) {
4971 CPU = Name;
4972 return true;
4973 }
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00004974 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00004975 // The backend enables certain ABI's by default according to the
4976 // architecture.
4977 // Disable both possible defaults so that we don't end up with multiple
4978 // ABI's selected and trigger an assertion.
4979 Features["o32"] = false;
4980 Features["n64"] = false;
4981
Eric Christopher0b26a612010-03-02 02:41:08 +00004982 Features[ABI] = true;
4983 Features[CPU] = true;
4984 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004985
Simon Atanasyan16ee0052012-08-29 19:59:32 +00004986 virtual void getTargetDefines(const LangOptions &Opts,
4987 MacroBuilder &Builder) const {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00004988 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00004989 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00004990 if (Opts.GNUMode)
4991 Builder.defineMacro("mips");
4992
Simon Atanasyan683535b2012-08-29 19:14:58 +00004993 Builder.defineMacro("__REGISTER_PREFIX__", "");
4994
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004995 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004996 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004997 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004998 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004999 case SoftFloat:
5000 Builder.defineMacro("__mips_soft_float", Twine(1));
5001 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005002 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005003
Simon Atanasyan16071912013-04-14 14:07:30 +00005004 if (IsSingleFloat)
5005 Builder.defineMacro("__mips_single_float", Twine(1));
5006
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005007 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5008 Builder.defineMacro("_MIPS_FPSET",
5009 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5010
Simon Atanasyan72244b62012-07-05 16:06:06 +00005011 if (IsMips16)
5012 Builder.defineMacro("__mips16", Twine(1));
5013
Simon Atanasyan60777612013-04-14 14:07:51 +00005014 if (IsMicromips)
5015 Builder.defineMacro("__mips_micromips", Twine(1));
5016
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005017 if (IsNan2008)
5018 Builder.defineMacro("__mips_nan2008", Twine(1));
5019
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005020 switch (DspRev) {
5021 default:
5022 break;
5023 case DSP1:
5024 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5025 Builder.defineMacro("__mips_dsp", Twine(1));
5026 break;
5027 case DSP2:
5028 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5029 Builder.defineMacro("__mips_dspr2", Twine(1));
5030 Builder.defineMacro("__mips_dsp", Twine(1));
5031 break;
5032 }
5033
Jack Carter44ff1e52013-08-12 17:20:29 +00005034 if (HasMSA)
5035 Builder.defineMacro("__mips_msa", Twine(1));
5036
Simon Atanasyan26f19672012-04-05 19:28:31 +00005037 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5038 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5039 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005040
5041 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5042 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005043 }
5044
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005045 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5046 unsigned &NumRecords) const {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005047 Records = BuiltinInfo;
5048 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005049 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005050 virtual bool hasFeature(StringRef Feature) const {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005051 return llvm::StringSwitch<bool>(Feature)
5052 .Case("mips", true)
5053 .Case("fp64", HasFP64)
5054 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005055 }
Meador Inge5d3fb222012-06-16 03:34:49 +00005056 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5057 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005058 }
5059 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005060 unsigned &NumNames) const {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005061 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005062 // CPU register names
5063 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005064 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5065 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5066 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005067 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5068 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005069 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5070 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5071 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5072 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005073 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005074 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005075 "$fcc5","$fcc6","$fcc7",
5076 // MSA register names
5077 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5078 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5079 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5080 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5081 // MSA control register names
5082 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5083 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005084 };
5085 Names = GCCRegNames;
5086 NumNames = llvm::array_lengthof(GCCRegNames);
5087 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005088 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005089 unsigned &NumAliases) const = 0;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005090 virtual bool validateAsmConstraint(const char *&Name,
5091 TargetInfo::ConstraintInfo &Info) const {
5092 switch (*Name) {
5093 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005094 return false;
5095
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005096 case 'r': // CPU registers.
5097 case 'd': // Equivalent to "r" unless generating MIPS16 code.
5098 case 'y': // Equivalent to "r", backwards compatibility only.
5099 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005100 case 'c': // $25 for indirect jumps
5101 case 'l': // lo register
5102 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005103 Info.setAllowsRegister();
5104 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005105 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005106 Info.setAllowsMemory();
5107 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005108 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005109 }
5110
5111 virtual const char *getClobbers() const {
5112 // FIXME: Implement!
5113 return "";
5114 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005115
Eric Christopher3ff21b32013-10-16 21:26:26 +00005116 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00005117 DiagnosticsEngine &Diags) {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005118 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005119 IsMicromips = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005120 IsNan2008 = false;
Simon Atanasyan16071912013-04-14 14:07:30 +00005121 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005122 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005123 DspRev = NoDSP;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005124 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005125
5126 for (std::vector<std::string>::iterator it = Features.begin(),
5127 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005128 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005129 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005130 else if (*it == "+soft-float")
5131 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005132 else if (*it == "+mips16")
5133 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005134 else if (*it == "+micromips")
5135 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005136 else if (*it == "+dsp")
5137 DspRev = std::max(DspRev, DSP1);
5138 else if (*it == "+dspr2")
5139 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005140 else if (*it == "+msa")
5141 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005142 else if (*it == "+fp64")
5143 HasFP64 = true;
5144 else if (*it == "-fp64")
5145 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005146 else if (*it == "+nan2008")
5147 IsNan2008 = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005148 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005149
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005150 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005151 std::vector<std::string>::iterator it =
5152 std::find(Features.begin(), Features.end(), "+soft-float");
5153 if (it != Features.end())
5154 Features.erase(it);
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005155 it = std::find(Features.begin(), Features.end(), "+nan2008");
5156 if (it != Features.end())
5157 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005158
Akira Hatanaka9064e362013-10-29 18:30:33 +00005159 setDescriptionString();
5160
Rafael Espindolaeb265472013-08-21 21:59:03 +00005161 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005162 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005163
5164 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
5165 if (RegNo == 0) return 4;
5166 if (RegNo == 1) return 5;
5167 return -1;
5168 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005169};
5170
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005171const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5172#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5173#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5174 ALL_LANGUAGES },
5175#include "clang/Basic/BuiltinsMips.def"
5176};
5177
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005178class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005179public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005180 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005181 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005182 SizeType = UnsignedInt;
5183 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005184 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005185 }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005186 virtual bool setABI(const std::string &Name) {
5187 if ((Name == "o32") || (Name == "eabi")) {
5188 ABI = Name;
5189 return true;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005190 } else if (Name == "32") {
5191 ABI = "o32";
5192 return true;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005193 } else
5194 return false;
5195 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005196 virtual void getTargetDefines(const LangOptions &Opts,
5197 MacroBuilder &Builder) const {
5198 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005199
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005200 Builder.defineMacro("__mips", "32");
5201
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005202 if (ABI == "o32") {
5203 Builder.defineMacro("__mips_o32");
5204 Builder.defineMacro("_ABIO32", "1");
5205 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5206 }
5207 else if (ABI == "eabi")
5208 Builder.defineMacro("__mips_eabi");
5209 else
David Blaikie83d382b2011-09-23 05:06:16 +00005210 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005211 }
5212 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5213 unsigned &NumAliases) const {
5214 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5215 { { "at" }, "$1" },
5216 { { "v0" }, "$2" },
5217 { { "v1" }, "$3" },
5218 { { "a0" }, "$4" },
5219 { { "a1" }, "$5" },
5220 { { "a2" }, "$6" },
5221 { { "a3" }, "$7" },
5222 { { "t0" }, "$8" },
5223 { { "t1" }, "$9" },
5224 { { "t2" }, "$10" },
5225 { { "t3" }, "$11" },
5226 { { "t4" }, "$12" },
5227 { { "t5" }, "$13" },
5228 { { "t6" }, "$14" },
5229 { { "t7" }, "$15" },
5230 { { "s0" }, "$16" },
5231 { { "s1" }, "$17" },
5232 { { "s2" }, "$18" },
5233 { { "s3" }, "$19" },
5234 { { "s4" }, "$20" },
5235 { { "s5" }, "$21" },
5236 { { "s6" }, "$22" },
5237 { { "s7" }, "$23" },
5238 { { "t8" }, "$24" },
5239 { { "t9" }, "$25" },
5240 { { "k0" }, "$26" },
5241 { { "k1" }, "$27" },
5242 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005243 { { "sp","$sp" }, "$29" },
5244 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005245 { { "ra" }, "$31" }
5246 };
5247 Aliases = GCCRegAliases;
5248 NumAliases = llvm::array_lengthof(GCCRegAliases);
5249 }
5250};
5251
5252class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005253 virtual void setDescriptionString() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005254 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005255 }
5256
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005257public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005258 Mips32EBTargetInfo(const llvm::Triple &Triple)
5259 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005260 }
5261 virtual void getTargetDefines(const LangOptions &Opts,
5262 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005263 DefineStd(Builder, "MIPSEB", Opts);
5264 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005265 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005266 }
5267};
5268
5269class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005270 virtual void setDescriptionString() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005271 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005272 }
5273
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005274public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005275 Mips32ELTargetInfo(const llvm::Triple &Triple)
5276 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005277 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005278 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005279 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005280 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005281 DefineStd(Builder, "MIPSEL", Opts);
5282 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005283 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005284 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005285};
Akira Hatanakabef17452011-09-20 19:21:49 +00005286
5287class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005288public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005289 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005290 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005291 LongWidth = LongAlign = 64;
5292 PointerWidth = PointerAlign = 64;
5293 LongDoubleWidth = LongDoubleAlign = 128;
5294 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005295 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5296 LongDoubleWidth = LongDoubleAlign = 64;
5297 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5298 }
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005299 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005300 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005301 }
Akira Hatanakabef17452011-09-20 19:21:49 +00005302 virtual bool setABI(const std::string &Name) {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005303 if (Name == "n32") {
5304 LongWidth = LongAlign = 32;
5305 PointerWidth = PointerAlign = 32;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005306 ABI = Name;
5307 return true;
5308 } else if (Name == "n64") {
5309 ABI = Name;
5310 return true;
5311 } else if (Name == "64") {
5312 ABI = "n64";
5313 return true;
5314 } else
5315 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005316 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005317 virtual void getTargetDefines(const LangOptions &Opts,
5318 MacroBuilder &Builder) const {
5319 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005320
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005321 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005322 Builder.defineMacro("__mips64");
5323 Builder.defineMacro("__mips64__");
5324
Akira Hatanakabef17452011-09-20 19:21:49 +00005325 if (ABI == "n32") {
5326 Builder.defineMacro("__mips_n32");
5327 Builder.defineMacro("_ABIN32", "2");
5328 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5329 }
5330 else if (ABI == "n64") {
5331 Builder.defineMacro("__mips_n64");
5332 Builder.defineMacro("_ABI64", "3");
5333 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5334 }
5335 else
David Blaikie83d382b2011-09-23 05:06:16 +00005336 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005337 }
5338 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5339 unsigned &NumAliases) const {
5340 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5341 { { "at" }, "$1" },
5342 { { "v0" }, "$2" },
5343 { { "v1" }, "$3" },
5344 { { "a0" }, "$4" },
5345 { { "a1" }, "$5" },
5346 { { "a2" }, "$6" },
5347 { { "a3" }, "$7" },
5348 { { "a4" }, "$8" },
5349 { { "a5" }, "$9" },
5350 { { "a6" }, "$10" },
5351 { { "a7" }, "$11" },
5352 { { "t0" }, "$12" },
5353 { { "t1" }, "$13" },
5354 { { "t2" }, "$14" },
5355 { { "t3" }, "$15" },
5356 { { "s0" }, "$16" },
5357 { { "s1" }, "$17" },
5358 { { "s2" }, "$18" },
5359 { { "s3" }, "$19" },
5360 { { "s4" }, "$20" },
5361 { { "s5" }, "$21" },
5362 { { "s6" }, "$22" },
5363 { { "s7" }, "$23" },
5364 { { "t8" }, "$24" },
5365 { { "t9" }, "$25" },
5366 { { "k0" }, "$26" },
5367 { { "k1" }, "$27" },
5368 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005369 { { "sp","$sp" }, "$29" },
5370 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005371 { { "ra" }, "$31" }
5372 };
5373 Aliases = GCCRegAliases;
5374 NumAliases = llvm::array_lengthof(GCCRegAliases);
5375 }
5376};
5377
5378class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005379 virtual void setDescriptionString() {
5380 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005381 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 +00005382 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005383 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005384
Akira Hatanakabef17452011-09-20 19:21:49 +00005385 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005386
Akira Hatanakabef17452011-09-20 19:21:49 +00005387public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005388 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005389 : Mips64TargetInfoBase(Triple) {}
Akira Hatanakabef17452011-09-20 19:21:49 +00005390 virtual void getTargetDefines(const LangOptions &Opts,
5391 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00005392 DefineStd(Builder, "MIPSEB", Opts);
5393 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005394 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005395 }
5396};
5397
5398class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005399 virtual void setDescriptionString() {
5400 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005401 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 +00005402 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005403 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005404 }
5405public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005406 Mips64ELTargetInfo(const llvm::Triple &Triple)
5407 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005408 // Default ABI is n64.
5409 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005410 }
5411 virtual void getTargetDefines(const LangOptions &Opts,
5412 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00005413 DefineStd(Builder, "MIPSEL", Opts);
5414 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005415 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005416 }
5417};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005418} // end anonymous namespace.
5419
Ivan Krasindd7403e2011-08-24 20:22:22 +00005420namespace {
5421class PNaClTargetInfo : public TargetInfo {
5422public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005423 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005424 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005425 this->UserLabelPrefix = "";
5426 this->LongAlign = 32;
5427 this->LongWidth = 32;
5428 this->PointerAlign = 32;
5429 this->PointerWidth = 32;
5430 this->IntMaxType = TargetInfo::SignedLongLong;
5431 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5432 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005433 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005434 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005435 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005436 this->SizeType = TargetInfo::UnsignedInt;
5437 this->PtrDiffType = TargetInfo::SignedInt;
5438 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005439 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005440 }
5441
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005442 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005443 }
5444 virtual void getArchDefines(const LangOptions &Opts,
5445 MacroBuilder &Builder) const {
5446 Builder.defineMacro("__le32__");
5447 Builder.defineMacro("__pnacl__");
5448 }
5449 virtual void getTargetDefines(const LangOptions &Opts,
5450 MacroBuilder &Builder) const {
Jan Wen Voung1d4c2d92012-03-29 00:05:59 +00005451 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasindd7403e2011-08-24 20:22:22 +00005452 getArchDefines(Opts, Builder);
5453 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005454 virtual bool hasFeature(StringRef Feature) const {
5455 return Feature == "pnacl";
5456 }
Ivan Krasindd7403e2011-08-24 20:22:22 +00005457 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5458 unsigned &NumRecords) const {
5459 }
Meador Inge5d3fb222012-06-16 03:34:49 +00005460 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5461 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005462 }
5463 virtual void getGCCRegNames(const char * const *&Names,
5464 unsigned &NumNames) const;
5465 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5466 unsigned &NumAliases) const;
5467 virtual bool validateAsmConstraint(const char *&Name,
5468 TargetInfo::ConstraintInfo &Info) const {
5469 return false;
5470 }
5471
5472 virtual const char *getClobbers() const {
5473 return "";
5474 }
5475};
5476
5477void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5478 unsigned &NumNames) const {
5479 Names = NULL;
5480 NumNames = 0;
5481}
5482
5483void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5484 unsigned &NumAliases) const {
5485 Aliases = NULL;
5486 NumAliases = 0;
5487}
5488} // end anonymous namespace.
5489
Guy Benyeib798fc92012-12-11 21:38:14 +00005490namespace {
5491 static const unsigned SPIRAddrSpaceMap[] = {
5492 1, // opencl_global
5493 3, // opencl_local
5494 2, // opencl_constant
5495 0, // cuda_device
5496 0, // cuda_constant
5497 0 // cuda_shared
5498 };
5499 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00005500 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005501 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005502 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5503 "SPIR target must use unknown OS");
5504 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5505 "SPIR target must use unknown environment type");
5506 BigEndian = false;
5507 TLSSupported = false;
5508 LongWidth = LongAlign = 64;
5509 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005510 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00005511 // Define available target features
5512 // These must be defined in sorted order!
5513 NoAsmVariants = true;
5514 }
5515 virtual void getTargetDefines(const LangOptions &Opts,
5516 MacroBuilder &Builder) const {
5517 DefineStd(Builder, "SPIR", Opts);
5518 }
5519 virtual bool hasFeature(StringRef Feature) const {
5520 return Feature == "spir";
5521 }
5522
5523 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5524 unsigned &NumRecords) const {}
5525 virtual const char *getClobbers() const {
5526 return "";
5527 }
5528 virtual void getGCCRegNames(const char * const *&Names,
5529 unsigned &NumNames) const {}
5530 virtual bool validateAsmConstraint(const char *&Name,
5531 TargetInfo::ConstraintInfo &info) const {
5532 return true;
5533 }
5534 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5535 unsigned &NumAliases) const {}
5536 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5537 return TargetInfo::VoidPtrBuiltinVaList;
5538 }
5539 };
5540
5541
5542 class SPIR32TargetInfo : public SPIRTargetInfo {
5543 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005544 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005545 PointerWidth = PointerAlign = 32;
5546 SizeType = TargetInfo::UnsignedInt;
5547 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5548 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00005549 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
5550 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005551 }
5552 virtual void getTargetDefines(const LangOptions &Opts,
5553 MacroBuilder &Builder) const {
5554 DefineStd(Builder, "SPIR32", Opts);
5555 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005556 };
5557
5558 class SPIR64TargetInfo : public SPIRTargetInfo {
5559 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005560 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005561 PointerWidth = PointerAlign = 64;
5562 SizeType = TargetInfo::UnsignedLong;
5563 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005564 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
5565 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005566 }
5567 virtual void getTargetDefines(const LangOptions &Opts,
5568 MacroBuilder &Builder) const {
5569 DefineStd(Builder, "SPIR64", Opts);
5570 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005571 };
5572}
5573
Robert Lytton0e076492013-08-13 09:43:10 +00005574namespace {
5575class XCoreTargetInfo : public TargetInfo {
5576 static const Builtin::Info BuiltinInfo[];
5577public:
5578 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5579 BigEndian = false;
5580 NoAsmVariants = true;
5581 LongLongAlign = 32;
5582 SuitableAlign = 32;
5583 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00005584 SizeType = UnsignedInt;
5585 PtrDiffType = SignedInt;
5586 IntPtrType = SignedInt;
5587 WCharType = UnsignedChar;
5588 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00005589 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005590 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 +00005591 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00005592 }
5593 virtual void getTargetDefines(const LangOptions &Opts,
5594 MacroBuilder &Builder) const {
5595 Builder.defineMacro("__XS1B__");
5596 }
5597 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5598 unsigned &NumRecords) const {
5599 Records = BuiltinInfo;
5600 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5601 }
5602 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5603 return TargetInfo::VoidPtrBuiltinVaList;
5604 }
5605 virtual const char *getClobbers() const {
5606 return "";
5607 }
5608 virtual void getGCCRegNames(const char * const *&Names,
5609 unsigned &NumNames) const {
5610 static const char * const GCCRegNames[] = {
5611 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5612 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
5613 };
5614 Names = GCCRegNames;
5615 NumNames = llvm::array_lengthof(GCCRegNames);
5616 }
5617 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5618 unsigned &NumAliases) const {
5619 Aliases = NULL;
5620 NumAliases = 0;
5621 }
5622 virtual bool validateAsmConstraint(const char *&Name,
5623 TargetInfo::ConstraintInfo &Info) const {
5624 return false;
5625 }
Robert Lytton1a229262014-01-27 17:56:25 +00005626 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
5627 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
5628 return (RegNo < 2)? RegNo : -1;
5629 }
Robert Lytton0e076492013-08-13 09:43:10 +00005630};
5631
5632const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
5633#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5634#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5635 ALL_LANGUAGES },
5636#include "clang/Basic/BuiltinsXCore.def"
5637};
5638} // end anonymous namespace.
5639
Ivan Krasindd7403e2011-08-24 20:22:22 +00005640
Chris Lattner5ba61f02006-10-14 07:39:34 +00005641//===----------------------------------------------------------------------===//
5642// Driver code
5643//===----------------------------------------------------------------------===//
5644
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005645static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00005646 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00005647
Daniel Dunbar52322032009-08-18 05:47:58 +00005648 switch (Triple.getArch()) {
5649 default:
5650 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00005651
Robert Lytton0e076492013-08-13 09:43:10 +00005652 case llvm::Triple::xcore:
5653 return new XCoreTargetInfo(Triple);
5654
Tony Linthicum76329bf2011-12-12 21:14:55 +00005655 case llvm::Triple::hexagon:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005656 return new HexagonTargetInfo(Triple);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005657
Tim Northover9bb857a2013-01-31 12:13:10 +00005658 case llvm::Triple::aarch64:
5659 switch (os) {
5660 case llvm::Triple::Linux:
Christian Pirker9b019ae2014-02-25 13:51:00 +00005661 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
Joerg Sonnenberger98534392014-01-13 18:25:15 +00005662 case llvm::Triple::NetBSD:
Christian Pirker9b019ae2014-02-25 13:51:00 +00005663 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005664 default:
Christian Pirker9b019ae2014-02-25 13:51:00 +00005665 return new AArch64leTargetInfo(Triple);
5666 }
5667
5668 case llvm::Triple::aarch64_be:
5669 switch (os) {
5670 case llvm::Triple::Linux:
5671 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
5672 case llvm::Triple::NetBSD:
5673 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
5674 default:
5675 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005676 }
5677
Daniel Dunbar52322032009-08-18 05:47:58 +00005678 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00005679 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00005680 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005681 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005682
Daniel Dunbar52322032009-08-18 05:47:58 +00005683 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00005684 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005685 return new LinuxTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005686 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005687 return new FreeBSDTargetInfo<ARMTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005688 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005689 return new NetBSDTargetInfo<ARMTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005690 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005691 return new OpenBSDTargetInfo<ARMTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005692 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005693 return new BitrigTargetInfo<ARMTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005694 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005695 return new RTEMSTargetInfo<ARMTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005696 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005697 return new NaClTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005698 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005699 return new ARMTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005700 }
Eli Friedmanb5366062008-05-20 14:21:01 +00005701
Daniel Dunbar52322032009-08-18 05:47:58 +00005702 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005703 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00005704
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005705 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005706 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005707 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005708 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005709 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005710 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005711 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005712 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005713 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005714 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005715 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005716 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005717 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005718
5719 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005720 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005721 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005722 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005723 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005724 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005725 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005726 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005727 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005728 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00005729 case llvm::Triple::NaCl:
5730 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005731 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005732 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005733 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005734
Akira Hatanakabef17452011-09-20 19:21:49 +00005735 case llvm::Triple::mips64:
5736 switch (os) {
5737 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005738 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005739 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005740 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005741 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005742 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005743 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005744 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005745 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005746 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005747 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005748 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005749 }
5750
5751 case llvm::Triple::mips64el:
5752 switch (os) {
5753 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005754 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005755 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005756 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005757 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005758 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005759 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005760 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005761 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005762 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005763 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005764 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005765 }
5766
Ivan Krasindd7403e2011-08-24 20:22:22 +00005767 case llvm::Triple::le32:
5768 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00005769 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005770 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00005771 default:
5772 return NULL;
5773 }
5774
Daniel Dunbar52322032009-08-18 05:47:58 +00005775 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005776 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005777 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005778 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005779 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005780 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005781 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005782 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005783 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005784 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005785 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005786 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005787 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005788 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005789 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005790 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005791 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005792
5793 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005794 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005795 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005796 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005797 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005798 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005799 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005800 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005801 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005802 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005803 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005804 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005805 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005806 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005807 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005808
Bill Schmidt778d3872013-07-26 01:36:11 +00005809 case llvm::Triple::ppc64le:
5810 switch (os) {
5811 case llvm::Triple::Linux:
5812 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
5813 default:
5814 return new PPC64TargetInfo(Triple);
5815 }
5816
Peter Collingbournec947aae2012-05-20 23:28:41 +00005817 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005818 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005819 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005820 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005821
Eli Friedmand13b41e2012-10-12 23:32:00 +00005822 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005823 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00005824
Daniel Dunbar52322032009-08-18 05:47:58 +00005825 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005826 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005827 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005828 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005829 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005830 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005831 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005832 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005833 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005834 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005835 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005836 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005837 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005838 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005839 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005840 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005841 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005842
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005843 case llvm::Triple::sparcv9:
5844 switch (os) {
5845 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005846 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005847 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005848 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005849 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005850 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005851 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005852 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005853 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005854 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005855 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005856 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005857 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005858 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005859 }
5860
Ulrich Weigand47445072013-05-06 16:26:41 +00005861 case llvm::Triple::systemz:
5862 switch (os) {
5863 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005864 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005865 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005866 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005867 }
5868
Eli Friedmana9c3d712009-08-19 20:47:07 +00005869 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005870 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00005871
Daniel Dunbar52322032009-08-18 05:47:58 +00005872 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005873 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005874 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005875
Daniel Dunbar52322032009-08-18 05:47:58 +00005876 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005877 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005878 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005879 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005880 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005881 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005882 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005883 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005884 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005885 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005886 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005887 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005888 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005889 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005890 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005891 case llvm::Triple::KFreeBSD:
5892 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005893 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005894 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005895 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005896 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005897 case llvm::Triple::Cygwin:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005898 return new CygwinX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005899 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005900 return new MinGWX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005901 case llvm::Triple::Win32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005902 return new VisualStudioWindowsX86_32TargetInfo(Triple);
Chris Lattnerb986aba2010-04-11 19:29:39 +00005903 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005904 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005905 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005906 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005907 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005908 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005909 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005910 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005911 }
5912
5913 case llvm::Triple::x86_64:
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005914 if (Triple.isOSDarwin() || Triple.getObjectFormat() == llvm::Triple::MachO)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005915 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005916
Daniel Dunbar52322032009-08-18 05:47:58 +00005917 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005918 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005919 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005920 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005921 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00005922 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005923 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005924 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005925 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005926 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005927 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005928 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005929 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005930 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005931 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005932 case llvm::Triple::KFreeBSD:
5933 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005934 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005935 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00005936 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005937 return new MinGWX86_64TargetInfo(Triple);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00005938 case llvm::Triple::Win32: // This is what Triple.h supports now.
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005939 return new VisualStudioWindowsX86_64TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005940 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005941 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005942 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005943 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005944 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005945
5946 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005947 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005948 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005949 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005950 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005951 }
5952 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005953 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005954 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005955 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005956 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005957 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005958 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00005959}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005960
5961/// CreateTargetInfo - Return the target info object for the specified target
5962/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00005963TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregorf8715de2012-11-16 04:24:59 +00005964 TargetOptions *Opts) {
5965 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005966
5967 // Construct the target
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005968 OwningPtr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005969 if (!Target) {
5970 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5971 return 0;
5972 }
Douglas Gregorbc10b9f2012-10-15 16:45:32 +00005973 Target->setTargetOpts(Opts);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005974
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005975 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005976 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5977 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005978 return 0;
5979 }
5980
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005981 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005982 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5983 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005984 return 0;
5985 }
5986
Rafael Espindolaeb265472013-08-21 21:59:03 +00005987 // Set the fp math unit.
5988 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
5989 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
5990 return 0;
5991 }
5992
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005993 // Compute the default target features, we need the target to handle this
5994 // because features may have dependencies on one another.
5995 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005996 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005997
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005998 // Apply the user specified deltas.
5999 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6000 I < N; ++I) {
6001 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006002 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006003 bool Enabled = Name[0] == '+';
6004 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006005 }
6006
6007 // Add the features to the compile options.
6008 //
6009 // FIXME: If we are completely confident that we have the right set, we only
6010 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006011 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006012 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6013 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006014 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006015 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Rafael Espindolaeb265472013-08-21 21:59:03 +00006016 return 0;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006017
6018 return Target.take();
6019}