blob: b25388aa62f1adc4d1c3751359b4a5011f9f903d [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
Jim Grosbache2bfac42013-11-19 20:18:39 +0000140 // If there's an environment specified in the triple, that means we're dealing
141 // with an embedded variant of some sort and don't want the platform
142 // version-min defines, so only add them if there's not one.
143 if (Triple.getEnvironmentName().empty()) {
144 // Set the appropriate OS version define.
145 if (Triple.isiOS()) {
146 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
147 char Str[6];
148 Str[0] = '0' + Maj;
149 Str[1] = '0' + (Min / 10);
150 Str[2] = '0' + (Min % 10);
151 Str[3] = '0' + (Rev / 10);
152 Str[4] = '0' + (Rev % 10);
153 Str[5] = '\0';
154 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
155 Str);
Tim Northover157d9112014-01-16 08:48:16 +0000156 } else if (Triple.isMacOSX()) {
Jim Grosbache2bfac42013-11-19 20:18:39 +0000157 // Note that the Driver allows versions which aren't representable in the
158 // define (because we only get a single digit for the minor and micro
159 // revision numbers). So, we limit them to the maximum representable
160 // version.
161 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
162 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163 char Str[5];
164 Str[0] = '0' + (Maj / 10);
165 Str[1] = '0' + (Maj % 10);
166 Str[2] = '0' + std::min(Min, 9U);
167 Str[3] = '0' + std::min(Rev, 9U);
168 Str[4] = '\0';
169 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
170 }
Daniel Dunbar497ff132009-04-10 19:52:24 +0000171 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000172
Tim Northover157d9112014-01-16 08:48:16 +0000173 // Tell users about the kernel if there is one.
174 if (Triple.isOSDarwin())
175 Builder.defineMacro("__MACH__");
176
Daniel Dunbarecf13562011-04-19 21:40:34 +0000177 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000178}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000179
Chris Lattner30ba6742009-08-10 19:03:04 +0000180namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000181template<typename Target>
182class DarwinTargetInfo : public OSTargetInfo<Target> {
183protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000184 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000185 MacroBuilder &Builder) const {
Eric Christopher0c912c52011-07-07 22:55:26 +0000186 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000187 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000188 }
Mike Stump11289f42009-09-09 15:08:12 +0000189
Torok Edwinb2b37c62009-06-30 17:10:35 +0000190public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000191 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
192 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
193 this->MCountName = "\01mcount";
194 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000195
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000196 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner30ba6742009-08-10 19:03:04 +0000197 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000198 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000199 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000200 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000201 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000202 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000203 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000204
Anders Carlsson851318a2010-06-08 22:47:50 +0000205 virtual const char *getStaticInitSectionSpecifier() const {
206 // FIXME: We should return 0 when building kexts.
207 return "__TEXT,__StaticInit,regular,pure_instructions";
208 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000209
John McCalleed64c72012-01-29 01:20:30 +0000210 /// Darwin does not support protected visibility. Darwin's "default"
211 /// is very similar to ELF's "protected"; Darwin requires a "weak"
212 /// attribute on declarations that can be dynamically replaced.
213 virtual bool hasProtectedVisibility() const {
214 return false;
215 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000216};
217
Chris Lattner30ba6742009-08-10 19:03:04 +0000218
Torok Edwinb2b37c62009-06-30 17:10:35 +0000219// DragonFlyBSD Target
220template<typename Target>
221class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
222protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000223 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000224 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000225 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000226 Builder.defineMacro("__DragonFly__");
227 Builder.defineMacro("__DragonFly_cc_version", "100001");
228 Builder.defineMacro("__ELF__");
229 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
230 Builder.defineMacro("__tune_i386__");
231 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000232 }
233public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000234 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
235 : OSTargetInfo<Target>(Triple) {
236 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000237
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000238 switch (Triple.getArch()) {
239 default:
240 case llvm::Triple::x86:
241 case llvm::Triple::x86_64:
242 this->MCountName = ".mcount";
243 break;
244 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000245 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000246};
247
248// FreeBSD Target
249template<typename Target>
250class FreeBSDTargetInfo : public OSTargetInfo<Target> {
251protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000252 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000253 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000254 // FreeBSD defines; list based off of gcc output
255
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000256 unsigned Release = Triple.getOSMajorVersion();
257 if (Release == 0U)
258 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000259
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000260 Builder.defineMacro("__FreeBSD__", Twine(Release));
261 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000262 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
263 DefineStd(Builder, "unix", Opts);
264 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000265
266 // On FreeBSD, wchar_t contains the number of the code point as
267 // used by the character set of the locale. These character sets are
268 // not necessarily a superset of ASCII.
269 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000270 }
271public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000272 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
273 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000274
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000275 switch (Triple.getArch()) {
276 default:
277 case llvm::Triple::x86:
278 case llvm::Triple::x86_64:
279 this->MCountName = ".mcount";
280 break;
281 case llvm::Triple::mips:
282 case llvm::Triple::mipsel:
283 case llvm::Triple::ppc:
284 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000285 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000286 this->MCountName = "_mcount";
287 break;
288 case llvm::Triple::arm:
289 this->MCountName = "__mcount";
290 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000291 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000292 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000293};
294
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000295// GNU/kFreeBSD Target
296template<typename Target>
297class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
298protected:
299 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
300 MacroBuilder &Builder) const {
301 // GNU/kFreeBSD defines; list based off of gcc output
302
303 DefineStd(Builder, "unix", Opts);
304 Builder.defineMacro("__FreeBSD_kernel__");
305 Builder.defineMacro("__GLIBC__");
306 Builder.defineMacro("__ELF__");
307 if (Opts.POSIXThreads)
308 Builder.defineMacro("_REENTRANT");
309 if (Opts.CPlusPlus)
310 Builder.defineMacro("_GNU_SOURCE");
311 }
312public:
Sylvestre Ledru15832282013-09-05 13:58:07 +0000313 KFreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000314 this->UserLabelPrefix = "";
315 }
316};
317
Chris Lattner3e2ee142010-07-07 16:01:42 +0000318// Minix Target
319template<typename Target>
320class MinixTargetInfo : public OSTargetInfo<Target> {
321protected:
322 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
323 MacroBuilder &Builder) const {
324 // Minix defines
325
326 Builder.defineMacro("__minix", "3");
327 Builder.defineMacro("_EM_WSIZE", "4");
328 Builder.defineMacro("_EM_PSIZE", "4");
329 Builder.defineMacro("_EM_SSIZE", "2");
330 Builder.defineMacro("_EM_LSIZE", "4");
331 Builder.defineMacro("_EM_FSIZE", "4");
332 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000333 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000334 DefineStd(Builder, "unix", Opts);
335 }
336public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000337 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
338 this->UserLabelPrefix = "";
339 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000340};
341
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342// Linux target
343template<typename Target>
344class LinuxTargetInfo : public OSTargetInfo<Target> {
345protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000346 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000347 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000348 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000349 DefineStd(Builder, "unix", Opts);
350 DefineStd(Builder, "linux", Opts);
351 Builder.defineMacro("__gnu_linux__");
352 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000353 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000354 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000355 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000356 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000357 if (Opts.CPlusPlus)
358 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 }
360public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000361 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000362 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000363 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000364 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000365
366 virtual const char *getStaticInitSectionSpecifier() const {
367 return ".text.startup";
368 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000369};
370
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000371// NetBSD Target
372template<typename Target>
373class NetBSDTargetInfo : public OSTargetInfo<Target> {
374protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000375 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000376 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000377 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000378 Builder.defineMacro("__NetBSD__");
379 Builder.defineMacro("__unix__");
380 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000381 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000382 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000383 }
384public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000385 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
386 this->UserLabelPrefix = "";
387 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000388};
389
Torok Edwinb2b37c62009-06-30 17:10:35 +0000390// OpenBSD Target
391template<typename Target>
392class OpenBSDTargetInfo : public OSTargetInfo<Target> {
393protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000394 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000395 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000396 // OpenBSD defines; list based off of gcc output
397
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000398 Builder.defineMacro("__OpenBSD__");
399 DefineStd(Builder, "unix", Opts);
400 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000401 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000402 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000403 }
404public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000405 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
406 this->UserLabelPrefix = "";
407 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000408
Eli Friedman3715d1f2011-12-15 02:15:56 +0000409 switch (Triple.getArch()) {
410 default:
411 case llvm::Triple::x86:
412 case llvm::Triple::x86_64:
413 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000414 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000415 this->MCountName = "__mcount";
416 break;
417 case llvm::Triple::mips64:
418 case llvm::Triple::mips64el:
419 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000420 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000421 this->MCountName = "_mcount";
422 break;
423 }
424 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000425};
426
Eli Friedman9fa28852012-08-08 23:57:20 +0000427// Bitrig Target
428template<typename Target>
429class BitrigTargetInfo : public OSTargetInfo<Target> {
430protected:
431 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
432 MacroBuilder &Builder) const {
433 // Bitrig defines; list based off of gcc output
434
435 Builder.defineMacro("__Bitrig__");
436 DefineStd(Builder, "unix", Opts);
437 Builder.defineMacro("__ELF__");
438 if (Opts.POSIXThreads)
439 Builder.defineMacro("_REENTRANT");
440 }
441public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000442 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
443 this->UserLabelPrefix = "";
444 this->TLSSupported = false;
445 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000446 }
447};
448
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000449// PSP Target
450template<typename Target>
451class PSPTargetInfo : public OSTargetInfo<Target> {
452protected:
453 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000454 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000455 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000456 Builder.defineMacro("PSP");
457 Builder.defineMacro("_PSP");
458 Builder.defineMacro("__psp__");
459 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000460 }
461public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000462 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000463 this->UserLabelPrefix = "";
464 }
465};
466
John Thompsone467e192009-11-19 17:18:50 +0000467// PS3 PPU Target
468template<typename Target>
469class PS3PPUTargetInfo : public OSTargetInfo<Target> {
470protected:
471 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000472 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000473 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000474 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000475 Builder.defineMacro("__PPU__");
476 Builder.defineMacro("__CELLOS_LV2__");
477 Builder.defineMacro("__ELF__");
478 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000479 Builder.defineMacro("_ARCH_PPC64");
480 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000481 }
482public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000483 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000484 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000485 this->LongWidth = this->LongAlign = 32;
486 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000487 this->IntMaxType = TargetInfo::SignedLongLong;
488 this->UIntMaxType = TargetInfo::UnsignedLongLong;
489 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000490 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000491 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000492 }
493};
494
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000495// AuroraUX target
496template<typename Target>
497class AuroraUXTargetInfo : public OSTargetInfo<Target> {
498protected:
499 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000500 MacroBuilder &Builder) const {
501 DefineStd(Builder, "sun", Opts);
502 DefineStd(Builder, "unix", Opts);
503 Builder.defineMacro("__ELF__");
504 Builder.defineMacro("__svr4__");
505 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000506 }
507public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000508 AuroraUXTargetInfo(const llvm::Triple &Triple)
509 : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000510 this->UserLabelPrefix = "";
511 this->WCharType = this->SignedLong;
512 // FIXME: WIntType should be SignedLong
513 }
514};
515
Torok Edwinb2b37c62009-06-30 17:10:35 +0000516// Solaris target
517template<typename Target>
518class SolarisTargetInfo : public OSTargetInfo<Target> {
519protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000520 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000521 MacroBuilder &Builder) const {
522 DefineStd(Builder, "sun", Opts);
523 DefineStd(Builder, "unix", Opts);
524 Builder.defineMacro("__ELF__");
525 Builder.defineMacro("__svr4__");
526 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000527 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
528 // newer, but to 500 for everything else. feature_test.h has a check to
529 // ensure that you are not using C99 with an old version of X/Open or C89
530 // with a new version.
531 if (Opts.C99 || Opts.C11)
532 Builder.defineMacro("_XOPEN_SOURCE", "600");
533 else
534 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000535 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000536 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000537 Builder.defineMacro("_LARGEFILE_SOURCE");
538 Builder.defineMacro("_LARGEFILE64_SOURCE");
539 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000540 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000541 }
542public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000543 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000544 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000545 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000546 // FIXME: WIntType should be SignedLong
547 }
548};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000549
550// Windows target
551template<typename Target>
552class WindowsTargetInfo : public OSTargetInfo<Target> {
553protected:
554 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
555 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000556 Builder.defineMacro("_WIN32");
557 }
558 void getVisualStudioDefines(const LangOptions &Opts,
559 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000560 if (Opts.CPlusPlus) {
561 if (Opts.RTTI)
562 Builder.defineMacro("_CPPRTTI");
563
564 if (Opts.Exceptions)
565 Builder.defineMacro("_CPPUNWIND");
566 }
567
568 if (!Opts.CharIsSigned)
569 Builder.defineMacro("_CHAR_UNSIGNED");
570
571 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
572 // but it works for now.
573 if (Opts.POSIXThreads)
574 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000575
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000576 if (Opts.MSCVersion != 0)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000577 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000578
Francois Pichet0706d202011-09-17 17:15:52 +0000579 if (Opts.MicrosoftExt) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000580 Builder.defineMacro("_MSC_EXTENSIONS");
581
Richard Smith2bf7fdb2013-01-02 11:42:31 +0000582 if (Opts.CPlusPlus11) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000583 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
584 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
585 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
586 }
587 }
588
589 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000590 }
591
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000592public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000593 WindowsTargetInfo(const llvm::Triple &Triple)
594 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000595};
596
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000597template <typename Target>
598class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000599protected:
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000600 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
601 MacroBuilder &Builder) const {
602 if (Opts.POSIXThreads)
603 Builder.defineMacro("_REENTRANT");
604 if (Opts.CPlusPlus)
605 Builder.defineMacro("_GNU_SOURCE");
606
607 DefineStd(Builder, "unix", Opts);
608 Builder.defineMacro("__ELF__");
609 Builder.defineMacro("__native_client__");
610 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000611
612public:
613 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000614 this->UserLabelPrefix = "";
615 this->LongAlign = 32;
616 this->LongWidth = 32;
617 this->PointerAlign = 32;
618 this->PointerWidth = 32;
619 this->IntMaxType = TargetInfo::SignedLongLong;
620 this->UIntMaxType = TargetInfo::UnsignedLongLong;
621 this->Int64Type = TargetInfo::SignedLongLong;
622 this->DoubleAlign = 64;
623 this->LongDoubleWidth = 64;
624 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000625 this->LongLongWidth = 64;
626 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000627 this->SizeType = TargetInfo::UnsignedInt;
628 this->PtrDiffType = TargetInfo::SignedInt;
629 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000630 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000631 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000632 if (Triple.getArch() == llvm::Triple::arm) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000633 this->DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000634 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000635 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000636 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000637 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000638 } else if (Triple.getArch() == llvm::Triple::mipsel) {
639 // Handled on mips' setDescriptionString.
640 } else {
641 assert(Triple.getArch() == llvm::Triple::le32);
642 this->DescriptionString = "e-p:32:32-i64:64";
643 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000644 }
Derek Schuffa2020962012-10-16 22:30:41 +0000645 virtual typename Target::CallingConvCheckResult checkCallingConvention(
646 CallingConv CC) const {
647 return CC == CC_PnaclCall ? Target::CCCR_OK :
648 Target::checkCallingConvention(CC);
649 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000650};
Mike Stump11289f42009-09-09 15:08:12 +0000651} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000652
Chris Lattner09d98f52008-10-05 21:50:58 +0000653//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000654// Specific target implementations.
655//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000656
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000657namespace {
658// PPC abstract base class
659class PPCTargetInfo : public TargetInfo {
660 static const Builtin::Info BuiltinInfo[];
661 static const char * const GCCRegNames[];
662 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000663 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000664
665 // Target cpu features.
666 bool HasVSX;
667
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000668public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000669 PPCTargetInfo(const llvm::Triple &Triple)
670 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000671 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000672 LongDoubleWidth = LongDoubleAlign = 128;
673 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
674 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000675
Hal Finkel6b984f02012-07-03 16:51:04 +0000676 /// \brief Flags for architecture specific defines.
677 typedef enum {
678 ArchDefineNone = 0,
679 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
680 ArchDefinePpcgr = 1 << 1,
681 ArchDefinePpcsq = 1 << 2,
682 ArchDefine440 = 1 << 3,
683 ArchDefine603 = 1 << 4,
684 ArchDefine604 = 1 << 5,
685 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000686 ArchDefinePwr5 = 1 << 7,
687 ArchDefinePwr5x = 1 << 8,
688 ArchDefinePwr6 = 1 << 9,
689 ArchDefinePwr6x = 1 << 10,
690 ArchDefinePwr7 = 1 << 11,
691 ArchDefineA2 = 1 << 12,
692 ArchDefineA2q = 1 << 13
Hal Finkel6b984f02012-07-03 16:51:04 +0000693 } ArchDefineTypes;
694
Bill Schmidt38378a02013-02-01 20:23:10 +0000695 // Note: GCC recognizes the following additional cpus:
696 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
697 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
698 // titan, rs64.
Hal Finkel8eb59282012-06-11 22:35:19 +0000699 virtual bool setCPU(const std::string &Name) {
700 bool CPUKnown = llvm::StringSwitch<bool>(Name)
701 .Case("generic", true)
702 .Case("440", true)
703 .Case("450", true)
704 .Case("601", true)
705 .Case("602", true)
706 .Case("603", true)
707 .Case("603e", true)
708 .Case("603ev", true)
709 .Case("604", true)
710 .Case("604e", true)
711 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000712 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000713 .Case("g3", true)
714 .Case("7400", true)
715 .Case("g4", true)
716 .Case("7450", true)
717 .Case("g4+", true)
718 .Case("750", true)
719 .Case("970", true)
720 .Case("g5", true)
721 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000722 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000723 .Case("e500mc", true)
724 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000725 .Case("power3", true)
726 .Case("pwr3", true)
727 .Case("power4", true)
728 .Case("pwr4", true)
729 .Case("power5", true)
730 .Case("pwr5", true)
731 .Case("power5x", true)
732 .Case("pwr5x", true)
733 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000734 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000735 .Case("power6x", true)
736 .Case("pwr6x", true)
737 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000738 .Case("pwr7", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000739 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000740 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000741 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000742 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000743 .Case("powerpc64le", true)
744 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000745 .Default(false);
746
747 if (CPUKnown)
748 CPU = Name;
749
750 return CPUKnown;
751 }
752
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000753 virtual void getTargetBuiltins(const Builtin::Info *&Records,
754 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000755 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000756 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000757 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000758
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000759 virtual bool isCLZForZeroUndef() const { return false; }
760
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000761 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000762 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000763
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000764 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
765
Eric Christopher3ff21b32013-10-16 21:26:26 +0000766 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000767 DiagnosticsEngine &Diags);
Douglas Gregor0070c0b2012-01-30 06:38:25 +0000768 virtual bool hasFeature(StringRef Feature) const;
769
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000770 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000771 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000772 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000773 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000774 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000775 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000776 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000777 default: return false;
778 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000779 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000780 case 'b': // Base register
781 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000782 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000783 break;
784 // FIXME: The following are added to allow parsing.
785 // I just took a guess at what the actions should be.
786 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000787 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000788 case 'v': // Altivec vector register
789 Info.setAllowsRegister();
790 break;
791 case 'w':
792 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000793 case 'd':// VSX vector register to hold vector double data
794 case 'f':// VSX vector register to hold vector float data
795 case 's':// VSX vector register to hold scalar float data
796 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000797 break;
798 default:
799 return false;
800 }
801 Info.setAllowsRegister();
802 Name++; // Skip over 'w'.
803 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000804 case 'h': // `MQ', `CTR', or `LINK' register
805 case 'q': // `MQ' register
806 case 'c': // `CTR' register
807 case 'l': // `LINK' register
808 case 'x': // `CR' register (condition register) number 0
809 case 'y': // `CR' register (condition register)
810 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000811 Info.setAllowsRegister();
812 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000813 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000814 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000815 // (use `L' instead for SImode constants)
816 case 'K': // Unsigned 16-bit constant
817 case 'L': // Signed 16-bit constant shifted left 16 bits
818 case 'M': // Constant larger than 31
819 case 'N': // Exact power of 2
820 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000821 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000822 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000823 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000824 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000825 break;
826 case 'm': // Memory operand. Note that on PowerPC targets, m can
827 // include addresses that update the base register. It
828 // is therefore only safe to use `m' in an asm statement
829 // if that asm statement accesses the operand exactly once.
830 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000831 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000832 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000833 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000834 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000835 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
836 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000837 // register to be updated.
838 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000839 if (Name[1] != 's')
840 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000841 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000842 // include any automodification of the base register. Unlike
843 // `m', this constraint can be used in asm statements that
844 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000845 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000846 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000847 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000848 break;
849 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000850 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000851 case 'Z': // Memory operand that is an indexed or indirect from a
852 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000853 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000854 Info.setAllowsMemory();
855 Info.setAllowsRegister();
856 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000857 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000858 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000859 // register (`p' is preferable for asm statements)
860 case 'S': // Constant suitable as a 64-bit mask operand
861 case 'T': // Constant suitable as a 32-bit mask operand
862 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000863 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000864 // instructions
865 case 'W': // Vector constant that does not require memory
866 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000867 break;
868 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000869 }
John Thompson07a61a42010-06-24 22:44:13 +0000870 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000871 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000872 virtual const char *getClobbers() const {
873 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000874 }
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000875 int getEHDataRegisterNumber(unsigned RegNo) const {
876 if (RegNo == 0) return 3;
877 if (RegNo == 1) return 4;
878 return -1;
879 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000880};
Anders Carlssonf511f642007-11-27 04:11:28 +0000881
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000882const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000883#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000884#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000885 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000886#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000887};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000888
Eric Christopher3ff21b32013-10-16 21:26:26 +0000889 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000890/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000891bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000892 DiagnosticsEngine &Diags) {
893 // Remember the maximum enabled sselevel.
894 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
895 // Ignore disabled features.
896 if (Features[i][0] == '-')
897 continue;
898
899 StringRef Feature = StringRef(Features[i]).substr(1);
900
901 if (Feature == "vsx") {
902 HasVSX = true;
903 continue;
904 }
905
906 // TODO: Finish this list and add an assert that we've handled them
907 // all.
908 }
909
910 return true;
911}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000912
Chris Lattnerecd49032009-03-02 22:27:17 +0000913/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
914/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000915void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000916 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000917 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000918 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000919 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000920 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000921 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000922 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000923 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000924 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000925 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000926 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000927 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000928 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000929
Chris Lattnerecd49032009-03-02 22:27:17 +0000930 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000931 if (getTriple().getArch() == llvm::Triple::ppc64le) {
932 Builder.defineMacro("_LITTLE_ENDIAN");
933 Builder.defineMacro("__LITTLE_ENDIAN__");
934 } else {
935 if (getTriple().getOS() != llvm::Triple::NetBSD &&
936 getTriple().getOS() != llvm::Triple::OpenBSD)
937 Builder.defineMacro("_BIG_ENDIAN");
938 Builder.defineMacro("__BIG_ENDIAN__");
939 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000940
Chris Lattnerecd49032009-03-02 22:27:17 +0000941 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000942 Builder.defineMacro("__NATURAL_ALIGNMENT__");
943 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000944
Chris Lattnerecd49032009-03-02 22:27:17 +0000945 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000946 if (LongDoubleWidth == 128)
947 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000948
John Thompsone467e192009-11-19 17:18:50 +0000949 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000950 Builder.defineMacro("__VEC__", "10206");
951 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000952 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000953
954 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000955 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
956 .Case("440", ArchDefineName)
957 .Case("450", ArchDefineName | ArchDefine440)
958 .Case("601", ArchDefineName)
959 .Case("602", ArchDefineName | ArchDefinePpcgr)
960 .Case("603", ArchDefineName | ArchDefinePpcgr)
961 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
962 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
963 .Case("604", ArchDefineName | ArchDefinePpcgr)
964 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
965 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +0000966 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +0000967 .Case("7400", ArchDefineName | ArchDefinePpcgr)
968 .Case("7450", ArchDefineName | ArchDefinePpcgr)
969 .Case("750", ArchDefineName | ArchDefinePpcgr)
970 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
971 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000972 .Case("a2", ArchDefineA2)
973 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +0000974 .Case("pwr3", ArchDefinePpcgr)
975 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
976 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
977 | ArchDefinePpcsq)
978 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
979 | ArchDefinePpcgr | ArchDefinePpcsq)
980 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
981 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
982 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
983 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
984 | ArchDefinePpcsq)
985 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
986 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
987 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
988 .Case("power3", ArchDefinePpcgr)
989 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
990 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
991 | ArchDefinePpcsq)
992 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
993 | ArchDefinePpcgr | ArchDefinePpcsq)
994 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
995 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
996 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
997 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
998 | ArchDefinePpcsq)
999 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1000 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1001 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001002 .Default(ArchDefineNone);
1003
1004 if (defs & ArchDefineName)
1005 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1006 if (defs & ArchDefinePpcgr)
1007 Builder.defineMacro("_ARCH_PPCGR");
1008 if (defs & ArchDefinePpcsq)
1009 Builder.defineMacro("_ARCH_PPCSQ");
1010 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001011 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001012 if (defs & ArchDefine603)
1013 Builder.defineMacro("_ARCH_603");
1014 if (defs & ArchDefine604)
1015 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001016 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001017 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001018 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001019 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001020 if (defs & ArchDefinePwr5x)
1021 Builder.defineMacro("_ARCH_PWR5X");
1022 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001023 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001024 if (defs & ArchDefinePwr6x)
1025 Builder.defineMacro("_ARCH_PWR6X");
1026 if (defs & ArchDefinePwr7)
1027 Builder.defineMacro("_ARCH_PWR7");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001028 if (defs & ArchDefineA2)
1029 Builder.defineMacro("_ARCH_A2");
1030 if (defs & ArchDefineA2q) {
1031 Builder.defineMacro("_ARCH_A2Q");
1032 Builder.defineMacro("_ARCH_QP");
1033 }
1034
1035 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1036 Builder.defineMacro("__bg__");
1037 Builder.defineMacro("__THW_BLUEGENE__");
1038 Builder.defineMacro("__bgq__");
1039 Builder.defineMacro("__TOS_BGQ__");
1040 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001041
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001042 if (HasVSX)
1043 Builder.defineMacro("__VSX__");
1044
Bill Schmidt38378a02013-02-01 20:23:10 +00001045 // FIXME: The following are not yet generated here by Clang, but are
1046 // generated by GCC:
1047 //
1048 // _SOFT_FLOAT_
1049 // __RECIP_PRECISION__
1050 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001051 // __RECIP__
1052 // __RECIPF__
1053 // __RSQRTE__
1054 // __RSQRTEF__
1055 // _SOFT_DOUBLE_
1056 // __NO_LWSYNC__
1057 // __HAVE_BSWAP__
1058 // __LONGDOUBLE128
1059 // __CMODEL_MEDIUM__
1060 // __CMODEL_LARGE__
1061 // _CALL_SYSV
1062 // _CALL_DARWIN
1063 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001064}
1065
1066void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1067 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1068 .Case("7400", true)
1069 .Case("g4", true)
1070 .Case("7450", true)
1071 .Case("g4+", true)
1072 .Case("970", true)
1073 .Case("g5", true)
1074 .Case("pwr6", true)
1075 .Case("pwr7", true)
1076 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001077 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001078 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001079
1080 Features["qpx"] = (CPU == "a2q");
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001081}
1082
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001083bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1084 return Feature == "powerpc";
1085}
Chris Lattner17df24e2008-04-21 18:56:49 +00001086
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001087
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001088const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001089 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1090 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1091 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1092 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1093 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1094 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1095 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1096 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001097 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001098 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001099 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001100 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1101 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1102 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1103 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001104 "vrsave", "vscr",
1105 "spe_acc", "spefscr",
1106 "sfp"
1107};
Chris Lattner10a5b382007-01-29 05:24:35 +00001108
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001109void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001110 unsigned &NumNames) const {
1111 Names = GCCRegNames;
1112 NumNames = llvm::array_lengthof(GCCRegNames);
1113}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001114
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001115const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1116 // While some of these aliases do map to different registers
1117 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001118 { { "0" }, "r0" },
1119 { { "1"}, "r1" },
1120 { { "2" }, "r2" },
1121 { { "3" }, "r3" },
1122 { { "4" }, "r4" },
1123 { { "5" }, "r5" },
1124 { { "6" }, "r6" },
1125 { { "7" }, "r7" },
1126 { { "8" }, "r8" },
1127 { { "9" }, "r9" },
1128 { { "10" }, "r10" },
1129 { { "11" }, "r11" },
1130 { { "12" }, "r12" },
1131 { { "13" }, "r13" },
1132 { { "14" }, "r14" },
1133 { { "15" }, "r15" },
1134 { { "16" }, "r16" },
1135 { { "17" }, "r17" },
1136 { { "18" }, "r18" },
1137 { { "19" }, "r19" },
1138 { { "20" }, "r20" },
1139 { { "21" }, "r21" },
1140 { { "22" }, "r22" },
1141 { { "23" }, "r23" },
1142 { { "24" }, "r24" },
1143 { { "25" }, "r25" },
1144 { { "26" }, "r26" },
1145 { { "27" }, "r27" },
1146 { { "28" }, "r28" },
1147 { { "29" }, "r29" },
1148 { { "30" }, "r30" },
1149 { { "31" }, "r31" },
1150 { { "fr0" }, "f0" },
1151 { { "fr1" }, "f1" },
1152 { { "fr2" }, "f2" },
1153 { { "fr3" }, "f3" },
1154 { { "fr4" }, "f4" },
1155 { { "fr5" }, "f5" },
1156 { { "fr6" }, "f6" },
1157 { { "fr7" }, "f7" },
1158 { { "fr8" }, "f8" },
1159 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001160 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001161 { { "fr11" }, "f11" },
1162 { { "fr12" }, "f12" },
1163 { { "fr13" }, "f13" },
1164 { { "fr14" }, "f14" },
1165 { { "fr15" }, "f15" },
1166 { { "fr16" }, "f16" },
1167 { { "fr17" }, "f17" },
1168 { { "fr18" }, "f18" },
1169 { { "fr19" }, "f19" },
1170 { { "fr20" }, "f20" },
1171 { { "fr21" }, "f21" },
1172 { { "fr22" }, "f22" },
1173 { { "fr23" }, "f23" },
1174 { { "fr24" }, "f24" },
1175 { { "fr25" }, "f25" },
1176 { { "fr26" }, "f26" },
1177 { { "fr27" }, "f27" },
1178 { { "fr28" }, "f28" },
1179 { { "fr29" }, "f29" },
1180 { { "fr30" }, "f30" },
1181 { { "fr31" }, "f31" },
1182 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001183};
1184
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001185void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001186 unsigned &NumAliases) const {
1187 Aliases = GCCRegAliases;
1188 NumAliases = llvm::array_lengthof(GCCRegAliases);
1189}
1190} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001191
Chris Lattner5ba61f02006-10-14 07:39:34 +00001192namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001193class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001194public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001195 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001196 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001197
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001198 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001199 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001200 case llvm::Triple::FreeBSD:
1201 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001202 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001203 PtrDiffType = SignedInt;
1204 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001205 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001206 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001207 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001208 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001209
Roman Divacky3ffe7462012-03-13 19:20:17 +00001210 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1211 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001212 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001213 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001214
1215 // PPC32 supports atomics up to 4 bytes.
1216 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001217 }
1218
Meador Inge5d3fb222012-06-16 03:34:49 +00001219 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Roman Divacky965b0b72011-01-06 08:27:10 +00001220 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001221 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001222 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001223};
1224} // end anonymous namespace.
1225
Bill Schmidt778d3872013-07-26 01:36:11 +00001226// Note: ABI differences may eventually require us to have a separate
1227// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001228namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001229class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001230public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001231 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001232 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001233 IntMaxType = SignedLong;
1234 UIntMaxType = UnsignedLong;
1235 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001236
Roman Divacky3ffe7462012-03-13 19:20:17 +00001237 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1238 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001239 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001240 DescriptionString = "E-m:e-i64:64-n32:64";
Bill Schmidtcec4cb12012-10-29 14:59:24 +00001241 } else
Rafael Espindolac418ae92014-01-03 19:22:05 +00001242 DescriptionString = "E-m:e-i64:64-n32:64";
Benjamin Kramer37196de2012-11-17 17:30:55 +00001243
1244 // PPC64 supports atomics up to 8 bytes.
1245 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001246 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001247 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1248 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001249 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001250};
1251} // end anonymous namespace.
1252
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001253
1254namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001255class DarwinPPC32TargetInfo :
1256 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001257public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001258 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1259 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001260 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001261 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherc04fe092013-10-16 21:19:19 +00001262 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001263 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001264 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001265 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001266 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001267 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1268 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001269 }
1270};
1271
1272class DarwinPPC64TargetInfo :
1273 public DarwinTargetInfo<PPC64TargetInfo> {
1274public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001275 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1276 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001277 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001278 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001279 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001280 }
1281};
1282} // end anonymous namespace.
1283
Chris Lattner5ba61f02006-10-14 07:39:34 +00001284namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001285 static const unsigned NVPTXAddrSpaceMap[] = {
1286 1, // opencl_global
1287 3, // opencl_local
1288 4, // opencl_constant
1289 1, // cuda_device
1290 4, // cuda_constant
1291 3, // cuda_shared
1292 };
1293 class NVPTXTargetInfo : public TargetInfo {
1294 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001295 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001296 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001297 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001298 BigEndian = false;
1299 TLSSupported = false;
1300 LongWidth = LongAlign = 64;
1301 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001302 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001303 // Define available target features
1304 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001305 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001306 }
1307 virtual void getTargetDefines(const LangOptions &Opts,
1308 MacroBuilder &Builder) const {
1309 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001310 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001311 }
1312 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1313 unsigned &NumRecords) const {
Justin Holewinski83e96682012-05-24 17:43:12 +00001314 Records = BuiltinInfo;
1315 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001316 }
1317 virtual bool hasFeature(StringRef Feature) const {
Justin Holewinski83e96682012-05-24 17:43:12 +00001318 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001319 }
1320
1321 virtual void getGCCRegNames(const char * const *&Names,
1322 unsigned &NumNames) const;
1323 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1324 unsigned &NumAliases) const {
1325 // No aliases.
1326 Aliases = 0;
1327 NumAliases = 0;
1328 }
1329 virtual bool validateAsmConstraint(const char *&Name,
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001330 TargetInfo::ConstraintInfo &Info) const {
1331 switch (*Name) {
1332 default: return false;
1333 case 'c':
1334 case 'h':
1335 case 'r':
1336 case 'l':
1337 case 'f':
1338 case 'd':
1339 Info.setAllowsRegister();
1340 return true;
1341 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001342 }
1343 virtual const char *getClobbers() const {
1344 // FIXME: Is this really right?
1345 return "";
1346 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001347 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001348 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001349 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001350 }
1351 virtual bool setCPU(const std::string &Name) {
Justin Holewinski91203e82013-03-30 14:38:26 +00001352 bool Valid = llvm::StringSwitch<bool>(Name)
1353 .Case("sm_20", true)
1354 .Case("sm_21", true)
1355 .Case("sm_30", true)
1356 .Case("sm_35", true)
1357 .Default(false);
1358
1359 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001360 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001361 };
1362
1363 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1364#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1365#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1366 ALL_LANGUAGES },
1367#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001368 };
1369
1370 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1371 "r0"
1372 };
1373
1374 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1375 unsigned &NumNames) const {
1376 Names = GCCRegNames;
1377 NumNames = llvm::array_lengthof(GCCRegNames);
1378 }
1379
1380 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1381 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001382 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001383 PointerWidth = PointerAlign = 32;
Justin Holewinski83e96682012-05-24 17:43:12 +00001384 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001385 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001386 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001387 };
1388
1389 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1390 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001391 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001392 PointerWidth = PointerAlign = 64;
Justin Holewinski83e96682012-05-24 17:43:12 +00001393 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001394 DescriptionString = "e-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
1399namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001400
1401static const unsigned R600AddrSpaceMap[] = {
1402 1, // opencl_global
1403 3, // opencl_local
1404 2, // opencl_constant
1405 1, // cuda_device
1406 2, // cuda_constant
1407 3 // cuda_shared
1408};
1409
Tom Stellardc74b1e02013-03-04 17:40:53 +00001410static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001411 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1412 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001413
1414static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001415 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1416 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001417
1418static const char *DescriptionStringSI =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001419 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:32:32-p5:64:64"
1420 "-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
Eli Friedmand13b41e2012-10-12 23:32:00 +00001423class R600TargetInfo : public TargetInfo {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001424 /// \brief The GPU profiles supported by the R600 target.
1425 enum GPUKind {
1426 GK_NONE,
1427 GK_R600,
1428 GK_R600_DOUBLE_OPS,
1429 GK_R700,
1430 GK_R700_DOUBLE_OPS,
1431 GK_EVERGREEN,
1432 GK_EVERGREEN_DOUBLE_OPS,
1433 GK_NORTHERN_ISLANDS,
1434 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001435 GK_SOUTHERN_ISLANDS,
1436 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001437 } GPU;
1438
Eli Friedmand13b41e2012-10-12 23:32:00 +00001439public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001440 R600TargetInfo(const llvm::Triple &Triple)
1441 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001442 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001443 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001444 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001445 }
1446
1447 virtual const char * getClobbers() const {
1448 return "";
1449 }
1450
1451 virtual void getGCCRegNames(const char * const *&Names,
1452 unsigned &numNames) const {
1453 Names = NULL;
1454 numNames = 0;
1455 }
1456
1457 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1458 unsigned &NumAliases) const {
1459 Aliases = NULL;
1460 NumAliases = 0;
1461 }
1462
1463 virtual bool validateAsmConstraint(const char *&Name,
1464 TargetInfo::ConstraintInfo &info) const {
1465 return true;
1466 }
1467
1468 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1469 unsigned &NumRecords) const {
1470 Records = NULL;
1471 NumRecords = 0;
1472 }
1473
1474
1475 virtual void getTargetDefines(const LangOptions &Opts,
1476 MacroBuilder &Builder) const {
1477 Builder.defineMacro("__R600__");
1478 }
1479
1480 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1481 return TargetInfo::CharPtrBuiltinVaList;
1482 }
1483
Tom Stellardc74b1e02013-03-04 17:40:53 +00001484 virtual bool setCPU(const std::string &Name) {
1485 GPU = llvm::StringSwitch<GPUKind>(Name)
1486 .Case("r600" , GK_R600)
1487 .Case("rv610", GK_R600)
1488 .Case("rv620", GK_R600)
1489 .Case("rv630", GK_R600)
1490 .Case("rv635", GK_R600)
1491 .Case("rs780", GK_R600)
1492 .Case("rs880", GK_R600)
1493 .Case("rv670", GK_R600_DOUBLE_OPS)
1494 .Case("rv710", GK_R700)
1495 .Case("rv730", GK_R700)
1496 .Case("rv740", GK_R700_DOUBLE_OPS)
1497 .Case("rv770", GK_R700_DOUBLE_OPS)
1498 .Case("palm", GK_EVERGREEN)
1499 .Case("cedar", GK_EVERGREEN)
1500 .Case("sumo", GK_EVERGREEN)
1501 .Case("sumo2", GK_EVERGREEN)
1502 .Case("redwood", GK_EVERGREEN)
1503 .Case("juniper", GK_EVERGREEN)
1504 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1505 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1506 .Case("barts", GK_NORTHERN_ISLANDS)
1507 .Case("turks", GK_NORTHERN_ISLANDS)
1508 .Case("caicos", GK_NORTHERN_ISLANDS)
1509 .Case("cayman", GK_CAYMAN)
1510 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001511 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001512 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1513 .Case("verde", GK_SOUTHERN_ISLANDS)
1514 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001515 .Case("bonaire", GK_SEA_ISLANDS)
1516 .Case("kabini", GK_SEA_ISLANDS)
1517 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001518 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001519 .Default(GK_NONE);
1520
1521 if (GPU == GK_NONE) {
1522 return false;
1523 }
1524
1525 // Set the correct data layout
1526 switch (GPU) {
1527 case GK_NONE:
1528 case GK_R600:
1529 case GK_R700:
1530 case GK_EVERGREEN:
1531 case GK_NORTHERN_ISLANDS:
1532 DescriptionString = DescriptionStringR600;
1533 break;
1534 case GK_R600_DOUBLE_OPS:
1535 case GK_R700_DOUBLE_OPS:
1536 case GK_EVERGREEN_DOUBLE_OPS:
1537 case GK_CAYMAN:
1538 DescriptionString = DescriptionStringR600DoubleOps;
1539 break;
1540 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001541 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001542 DescriptionString = DescriptionStringSI;
1543 break;
1544 }
1545
1546 return true;
1547 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001548};
1549
1550} // end anonymous namespace
1551
1552namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001553// Namespace for x86 abstract base class
1554const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001555#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001556#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001557 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001558#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001559};
Eli Friedmanb5366062008-05-20 14:21:01 +00001560
Nuno Lopescfca1f02009-12-23 17:49:57 +00001561static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001562 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1563 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001564 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001565 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1566 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1567 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001568 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001569 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1570 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001571};
1572
Eric Christophercdd36352011-06-21 00:05:20 +00001573const TargetInfo::AddlRegName AddlRegNames[] = {
1574 { { "al", "ah", "eax", "rax" }, 0 },
1575 { { "bl", "bh", "ebx", "rbx" }, 3 },
1576 { { "cl", "ch", "ecx", "rcx" }, 2 },
1577 { { "dl", "dh", "edx", "rdx" }, 1 },
1578 { { "esi", "rsi" }, 4 },
1579 { { "edi", "rdi" }, 5 },
1580 { { "esp", "rsp" }, 7 },
1581 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001582};
1583
1584// X86 target abstract base class; x86-32 and x86-64 are very close, so
1585// most of the implementation can be shared.
1586class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001587 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001588 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001589 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001590 enum MMX3DNowEnum {
1591 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1592 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001593 enum XOPEnum {
1594 NoXOP,
1595 SSE4A,
1596 FMA4,
1597 XOP
1598 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001599
Eric Christophere1ddaf92010-04-02 23:50:19 +00001600 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001601 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001602 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001603 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001604 bool HasBMI;
1605 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001606 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001607 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001608 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001609 bool HasRDSEED;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001610 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001611 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001612 bool HasF16C;
Craig Topper679b53a2013-08-21 05:29:10 +00001613 bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
Ben Langmuir58078d02013-09-19 13:22:04 +00001614 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001615 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001616
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001617 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1618 ///
1619 /// Each enumeration represents a particular CPU supported by Clang. These
1620 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1621 enum CPUKind {
1622 CK_Generic,
1623
1624 /// \name i386
1625 /// i386-generation processors.
1626 //@{
1627 CK_i386,
1628 //@}
1629
1630 /// \name i486
1631 /// i486-generation processors.
1632 //@{
1633 CK_i486,
1634 CK_WinChipC6,
1635 CK_WinChip2,
1636 CK_C3,
1637 //@}
1638
1639 /// \name i586
1640 /// i586-generation processors, P5 microarchitecture based.
1641 //@{
1642 CK_i586,
1643 CK_Pentium,
1644 CK_PentiumMMX,
1645 //@}
1646
1647 /// \name i686
1648 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1649 //@{
1650 CK_i686,
1651 CK_PentiumPro,
1652 CK_Pentium2,
1653 CK_Pentium3,
1654 CK_Pentium3M,
1655 CK_PentiumM,
1656 CK_C3_2,
1657
1658 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1659 /// Clang however has some logic to suport this.
1660 // FIXME: Warn, deprecate, and potentially remove this.
1661 CK_Yonah,
1662 //@}
1663
1664 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001665 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001666 //@{
1667 CK_Pentium4,
1668 CK_Pentium4M,
1669 CK_Prescott,
1670 CK_Nocona,
1671 //@}
1672
1673 /// \name Core
1674 /// Core microarchitecture based processors.
1675 //@{
1676 CK_Core2,
1677
1678 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1679 /// codename which GCC no longer accepts as an option to -march, but Clang
1680 /// has some logic for recognizing it.
1681 // FIXME: Warn, deprecate, and potentially remove this.
1682 CK_Penryn,
1683 //@}
1684
1685 /// \name Atom
1686 /// Atom processors
1687 //@{
1688 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001689 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001690 //@}
1691
1692 /// \name Nehalem
1693 /// Nehalem microarchitecture based processors.
1694 //@{
1695 CK_Corei7,
1696 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001697 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001698 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001699 //@}
1700
Craig Topper449314e2013-08-20 07:09:39 +00001701 /// \name Knights Landing
1702 /// Knights Landing processor.
1703 CK_KNL,
1704
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001705 /// \name K6
1706 /// K6 architecture processors.
1707 //@{
1708 CK_K6,
1709 CK_K6_2,
1710 CK_K6_3,
1711 //@}
1712
1713 /// \name K7
1714 /// K7 architecture processors.
1715 //@{
1716 CK_Athlon,
1717 CK_AthlonThunderbird,
1718 CK_Athlon4,
1719 CK_AthlonXP,
1720 CK_AthlonMP,
1721 //@}
1722
1723 /// \name K8
1724 /// K8 architecture processors.
1725 //@{
1726 CK_Athlon64,
1727 CK_Athlon64SSE3,
1728 CK_AthlonFX,
1729 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001730 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001731 CK_Opteron,
1732 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001733 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001734 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001735
Benjamin Kramer569f2152012-01-10 11:50:18 +00001736 /// \name Bobcat
1737 /// Bobcat architecture processors.
1738 //@{
1739 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001740 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001741 //@}
1742
1743 /// \name Bulldozer
1744 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001745 //@{
1746 CK_BDVER1,
1747 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001748 CK_BDVER3,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001749 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001750
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001751 /// This specification is deprecated and will be removed in the future.
1752 /// Users should prefer \see CK_K8.
1753 // FIXME: Warn on this when the CPU is set to it.
1754 CK_x86_64,
1755 //@}
1756
1757 /// \name Geode
1758 /// Geode processors.
1759 //@{
1760 CK_Geode
1761 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001762 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001763
Rafael Espindolaeb265472013-08-21 21:59:03 +00001764 enum FPMathKind {
1765 FP_Default,
1766 FP_SSE,
1767 FP_387
1768 } FPMath;
1769
Eli Friedman3fd920a2008-08-20 02:34:37 +00001770public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001771 X86TargetInfo(const llvm::Triple &Triple)
1772 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001773 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1774 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001775 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1776 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001777 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1778 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001779 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001780 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001781 }
Benjamin Kramercf501472011-12-28 15:47:06 +00001782 virtual unsigned getFloatEvalMethod() const {
1783 // X87 evaluates with 80 bits "long double" precision.
1784 return SSELevel == NoSSE ? 2 : 0;
1785 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001786 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1787 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001788 Records = BuiltinInfo;
1789 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001790 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001791 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001792 unsigned &NumNames) const {
1793 Names = GCCRegNames;
1794 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001795 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001796 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001797 unsigned &NumAliases) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001798 Aliases = 0;
1799 NumAliases = 0;
1800 }
1801 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
Eric Christopherfd081ca2012-11-14 22:08:59 +00001802 unsigned &NumNames) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001803 Names = AddlRegNames;
1804 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001805 }
Anders Carlsson58436352009-02-28 17:11:49 +00001806 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001807 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001808 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001809 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001810 return "~{dirflag},~{fpsr},~{flags}";
1811 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001812 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001813 MacroBuilder &Builder) const;
Craig Topper13f61a62013-09-17 04:12:55 +00001814 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1815 bool Enabled);
1816 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1817 bool Enabled);
1818 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1819 bool Enabled);
Rafael Espindolaa38ce292013-08-20 15:30:32 +00001820 virtual void setFeatureEnabled(llvm::StringMap<bool> &Features,
Craig Topper86d79ef2013-09-17 04:51:29 +00001821 StringRef Name, bool Enabled) const {
1822 setFeatureEnabledImpl(Features, Name, Enabled);
1823 }
1824 // This exists purely to cut down on the number of virtual calls in
1825 // getDefaultFeatures which calls this repeatedly.
1826 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1827 StringRef Name, bool Enabled);
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00001828 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001829 virtual bool hasFeature(StringRef Feature) const;
Eric Christopher3ff21b32013-10-16 21:26:26 +00001830 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00001831 DiagnosticsEngine &Diags);
Eli Friedman33465822011-07-08 23:31:17 +00001832 virtual const char* getABI() const {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001833 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001834 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001835 else if (getTriple().getArch() == llvm::Triple::x86 &&
1836 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001837 return "no-mmx";
1838 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001839 }
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001840 virtual bool setCPU(const std::string &Name) {
Chandler Carruth212334f2011-09-28 08:55:37 +00001841 CPU = llvm::StringSwitch<CPUKind>(Name)
1842 .Case("i386", CK_i386)
1843 .Case("i486", CK_i486)
1844 .Case("winchip-c6", CK_WinChipC6)
1845 .Case("winchip2", CK_WinChip2)
1846 .Case("c3", CK_C3)
1847 .Case("i586", CK_i586)
1848 .Case("pentium", CK_Pentium)
1849 .Case("pentium-mmx", CK_PentiumMMX)
1850 .Case("i686", CK_i686)
1851 .Case("pentiumpro", CK_PentiumPro)
1852 .Case("pentium2", CK_Pentium2)
1853 .Case("pentium3", CK_Pentium3)
1854 .Case("pentium3m", CK_Pentium3M)
1855 .Case("pentium-m", CK_PentiumM)
1856 .Case("c3-2", CK_C3_2)
1857 .Case("yonah", CK_Yonah)
1858 .Case("pentium4", CK_Pentium4)
1859 .Case("pentium4m", CK_Pentium4M)
1860 .Case("prescott", CK_Prescott)
1861 .Case("nocona", CK_Nocona)
1862 .Case("core2", CK_Core2)
1863 .Case("penryn", CK_Penryn)
1864 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001865 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001866 .Case("corei7", CK_Corei7)
1867 .Case("corei7-avx", CK_Corei7AVX)
1868 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001869 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001870 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00001871 .Case("k6", CK_K6)
1872 .Case("k6-2", CK_K6_2)
1873 .Case("k6-3", CK_K6_3)
1874 .Case("athlon", CK_Athlon)
1875 .Case("athlon-tbird", CK_AthlonThunderbird)
1876 .Case("athlon-4", CK_Athlon4)
1877 .Case("athlon-xp", CK_AthlonXP)
1878 .Case("athlon-mp", CK_AthlonMP)
1879 .Case("athlon64", CK_Athlon64)
1880 .Case("athlon64-sse3", CK_Athlon64SSE3)
1881 .Case("athlon-fx", CK_AthlonFX)
1882 .Case("k8", CK_K8)
1883 .Case("k8-sse3", CK_K8SSE3)
1884 .Case("opteron", CK_Opteron)
1885 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001886 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001887 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001888 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001889 .Case("bdver1", CK_BDVER1)
1890 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001891 .Case("bdver3", CK_BDVER3)
Chandler Carruth212334f2011-09-28 08:55:37 +00001892 .Case("x86-64", CK_x86_64)
1893 .Case("geode", CK_Geode)
1894 .Default(CK_Generic);
1895
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001896 // Perform any per-CPU checks necessary to determine if this CPU is
1897 // acceptable.
1898 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1899 // invalid without explaining *why*.
1900 switch (CPU) {
1901 case CK_Generic:
1902 // No processor selected!
1903 return false;
1904
1905 case CK_i386:
1906 case CK_i486:
1907 case CK_WinChipC6:
1908 case CK_WinChip2:
1909 case CK_C3:
1910 case CK_i586:
1911 case CK_Pentium:
1912 case CK_PentiumMMX:
1913 case CK_i686:
1914 case CK_PentiumPro:
1915 case CK_Pentium2:
1916 case CK_Pentium3:
1917 case CK_Pentium3M:
1918 case CK_PentiumM:
1919 case CK_Yonah:
1920 case CK_C3_2:
1921 case CK_Pentium4:
1922 case CK_Pentium4M:
1923 case CK_Prescott:
1924 case CK_K6:
1925 case CK_K6_2:
1926 case CK_K6_3:
1927 case CK_Athlon:
1928 case CK_AthlonThunderbird:
1929 case CK_Athlon4:
1930 case CK_AthlonXP:
1931 case CK_AthlonMP:
1932 case CK_Geode:
1933 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00001934 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001935 return false;
1936
1937 // Fallthrough
1938 case CK_Nocona:
1939 case CK_Core2:
1940 case CK_Penryn:
1941 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00001942 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001943 case CK_Corei7:
1944 case CK_Corei7AVX:
1945 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00001946 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00001947 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001948 case CK_Athlon64:
1949 case CK_Athlon64SSE3:
1950 case CK_AthlonFX:
1951 case CK_K8:
1952 case CK_K8SSE3:
1953 case CK_Opteron:
1954 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00001955 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00001956 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001957 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001958 case CK_BDVER1:
1959 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001960 case CK_BDVER3:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001961 case CK_x86_64:
1962 return true;
1963 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00001964 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001965 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001966
Rafael Espindolaeb265472013-08-21 21:59:03 +00001967 virtual bool setFPMath(StringRef Name);
1968
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001969 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
1970 // We accept all non-ARM calling conventions
1971 return (CC == CC_X86ThisCall ||
1972 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00001973 CC == CC_X86StdCall ||
1974 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00001975 CC == CC_X86Pascal ||
1976 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001977 }
1978
Aaron Ballman02df2e02012-12-09 17:45:41 +00001979 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
1980 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001981 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001982};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001983
Rafael Espindolaeb265472013-08-21 21:59:03 +00001984bool X86TargetInfo::setFPMath(StringRef Name) {
1985 if (Name == "387") {
1986 FPMath = FP_387;
1987 return true;
1988 }
1989 if (Name == "sse") {
1990 FPMath = FP_SSE;
1991 return true;
1992 }
1993 return false;
1994}
1995
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00001996void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00001997 // FIXME: This *really* should not be here.
1998
1999 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002000 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002001 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002002
Chandler Carruth212334f2011-09-28 08:55:37 +00002003 switch (CPU) {
2004 case CK_Generic:
2005 case CK_i386:
2006 case CK_i486:
2007 case CK_i586:
2008 case CK_Pentium:
2009 case CK_i686:
2010 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002011 break;
2012 case CK_PentiumMMX:
2013 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002014 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002015 break;
2016 case CK_Pentium3:
2017 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002018 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002019 break;
2020 case CK_PentiumM:
2021 case CK_Pentium4:
2022 case CK_Pentium4M:
2023 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002024 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002025 break;
2026 case CK_Yonah:
2027 case CK_Prescott:
2028 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002029 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002030 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002031 break;
2032 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002033 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002034 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002035 break;
2036 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002037 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002038 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002039 break;
2040 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002041 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002042 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002043 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002044 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002045 setFeatureEnabledImpl(Features, "sse4.2", true);
2046 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002047 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002048 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002049 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002050 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002051 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002052 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002053 break;
2054 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002055 setFeatureEnabledImpl(Features, "avx", true);
2056 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002057 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002058 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002059 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002060 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002061 setFeatureEnabledImpl(Features, "avx", true);
2062 setFeatureEnabledImpl(Features, "aes", true);
2063 setFeatureEnabledImpl(Features, "pclmul", true);
2064 setFeatureEnabledImpl(Features, "rdrnd", true);
2065 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002066 break;
Craig Topper865fff52011-12-17 19:55:21 +00002067 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002068 setFeatureEnabledImpl(Features, "avx2", true);
2069 setFeatureEnabledImpl(Features, "aes", true);
2070 setFeatureEnabledImpl(Features, "pclmul", true);
2071 setFeatureEnabledImpl(Features, "lzcnt", true);
2072 setFeatureEnabledImpl(Features, "rdrnd", true);
2073 setFeatureEnabledImpl(Features, "f16c", true);
2074 setFeatureEnabledImpl(Features, "bmi", true);
2075 setFeatureEnabledImpl(Features, "bmi2", true);
2076 setFeatureEnabledImpl(Features, "rtm", true);
2077 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002078 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002079 break;
Craig Topper449314e2013-08-20 07:09:39 +00002080 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002081 setFeatureEnabledImpl(Features, "avx512f", true);
2082 setFeatureEnabledImpl(Features, "avx512cd", true);
2083 setFeatureEnabledImpl(Features, "avx512er", true);
2084 setFeatureEnabledImpl(Features, "avx512pf", true);
2085 setFeatureEnabledImpl(Features, "aes", true);
2086 setFeatureEnabledImpl(Features, "pclmul", true);
2087 setFeatureEnabledImpl(Features, "lzcnt", true);
2088 setFeatureEnabledImpl(Features, "rdrnd", true);
2089 setFeatureEnabledImpl(Features, "f16c", true);
2090 setFeatureEnabledImpl(Features, "bmi", true);
2091 setFeatureEnabledImpl(Features, "bmi2", true);
2092 setFeatureEnabledImpl(Features, "rtm", true);
2093 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002094 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002095 case CK_K6:
2096 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002097 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002098 break;
2099 case CK_K6_2:
2100 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002101 case CK_WinChip2:
2102 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002103 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002104 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002105 case CK_Athlon:
2106 case CK_AthlonThunderbird:
2107 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002108 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002109 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002110 case CK_Athlon4:
2111 case CK_AthlonXP:
2112 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002113 setFeatureEnabledImpl(Features, "sse", true);
2114 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002115 break;
2116 case CK_K8:
2117 case CK_Opteron:
2118 case CK_Athlon64:
2119 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002120 setFeatureEnabledImpl(Features, "sse2", true);
2121 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002122 break;
2123 case CK_K8SSE3:
2124 case CK_OpteronSSE3:
2125 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002126 setFeatureEnabledImpl(Features, "sse3", true);
2127 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002128 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002129 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002130 setFeatureEnabledImpl(Features, "sse3", true);
2131 setFeatureEnabledImpl(Features, "sse4a", true);
2132 setFeatureEnabledImpl(Features, "3dnowa", true);
2133 setFeatureEnabledImpl(Features, "lzcnt", true);
2134 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002135 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002136 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002137 setFeatureEnabledImpl(Features, "ssse3", true);
2138 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002139 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002140 setFeatureEnabledImpl(Features, "lzcnt", true);
2141 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002142 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002143 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002144 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002145 setFeatureEnabledImpl(Features, "avx", true);
2146 setFeatureEnabledImpl(Features, "sse4a", true);
2147 setFeatureEnabledImpl(Features, "lzcnt", true);
2148 setFeatureEnabledImpl(Features, "aes", true);
2149 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002150 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002151 setFeatureEnabledImpl(Features, "bmi", true);
2152 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002153 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002154 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002155 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002156 setFeatureEnabledImpl(Features, "xop", true);
2157 setFeatureEnabledImpl(Features, "lzcnt", true);
2158 setFeatureEnabledImpl(Features, "aes", true);
2159 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002160 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002161 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002162 break;
Eli Friedman3e94f572012-11-17 01:43:10 +00002163 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002164 case CK_BDVER3:
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);
Craig Topper86d79ef2013-09-17 04:51:29 +00002170 setFeatureEnabledImpl(Features, "bmi", true);
2171 setFeatureEnabledImpl(Features, "fma", true);
2172 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002173 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002174 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002175 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002176 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002177 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002178 break;
Eli Friedman33465822011-07-08 23:31:17 +00002179 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002180}
2181
Rafael Espindolae62e2792013-08-20 13:44:29 +00002182void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002183 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002184 if (Enabled) {
2185 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002186 case AVX512F:
2187 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002188 case AVX2:
2189 Features["avx2"] = true;
2190 case AVX:
2191 Features["avx"] = true;
2192 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002193 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002194 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002195 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002196 case SSSE3:
2197 Features["ssse3"] = true;
2198 case SSE3:
2199 Features["sse3"] = true;
2200 case SSE2:
2201 Features["sse2"] = true;
2202 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002203 Features["sse"] = true;
2204 case NoSSE:
2205 break;
2206 }
2207 return;
2208 }
2209
2210 switch (Level) {
2211 case NoSSE:
2212 case SSE1:
2213 Features["sse"] = false;
2214 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002215 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2216 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002217 case SSE3:
2218 Features["sse3"] = false;
2219 setXOPLevel(Features, NoXOP, false);
2220 case SSSE3:
2221 Features["ssse3"] = false;
2222 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002223 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002224 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002225 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002226 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002227 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002228 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002229 case AVX2:
2230 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002231 case AVX512F:
Craig Topper679b53a2013-08-21 05:29:10 +00002232 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2233 Features["avx512pf"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002234 }
2235}
2236
2237void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002238 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002239 if (Enabled) {
2240 switch (Level) {
2241 case AMD3DNowAthlon:
2242 Features["3dnowa"] = true;
2243 case AMD3DNow:
2244 Features["3dnow"] = true;
2245 case MMX:
2246 Features["mmx"] = true;
2247 case NoMMX3DNow:
2248 break;
2249 }
2250 return;
2251 }
2252
2253 switch (Level) {
2254 case NoMMX3DNow:
2255 case MMX:
2256 Features["mmx"] = false;
2257 case AMD3DNow:
2258 Features["3dnow"] = false;
2259 case AMD3DNowAthlon:
2260 Features["3dnowa"] = false;
2261 }
2262}
2263
2264void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002265 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002266 if (Enabled) {
2267 switch (Level) {
2268 case XOP:
2269 Features["xop"] = true;
2270 case FMA4:
2271 Features["fma4"] = true;
2272 setSSELevel(Features, AVX, true);
2273 case SSE4A:
2274 Features["sse4a"] = true;
2275 setSSELevel(Features, SSE3, true);
2276 case NoXOP:
2277 break;
2278 }
2279 return;
2280 }
2281
2282 switch (Level) {
2283 case NoXOP:
2284 case SSE4A:
2285 Features["sse4a"] = false;
2286 case FMA4:
2287 Features["fma4"] = false;
2288 case XOP:
2289 Features["xop"] = false;
2290 }
2291}
2292
Craig Topper86d79ef2013-09-17 04:51:29 +00002293void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2294 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002295 // FIXME: This *really* should not be here. We need some way of translating
2296 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002297 if (Name == "sse4")
2298 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002299
Rafael Espindolae62e2792013-08-20 13:44:29 +00002300 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002301
Craig Topper29561122013-09-19 01:13:07 +00002302 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002303 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002304 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002305 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002306 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002307 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002308 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002309 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002310 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002311 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002312 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002313 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002314 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002315 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002316 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002317 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002318 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002319 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002320 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002321 if (Enabled)
2322 setSSELevel(Features, SSE2, Enabled);
2323 } else if (Name == "pclmul") {
2324 if (Enabled)
2325 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002326 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002327 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002328 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002329 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002330 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002331 setSSELevel(Features, AVX512F, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002332 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002333 if (Enabled)
2334 setSSELevel(Features, AVX512F, Enabled);
2335 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002336 if (Enabled)
2337 setSSELevel(Features, AVX, Enabled);
2338 } else if (Name == "fma4") {
2339 setXOPLevel(Features, FMA4, Enabled);
2340 } else if (Name == "xop") {
2341 setXOPLevel(Features, XOP, Enabled);
2342 } else if (Name == "sse4a") {
2343 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002344 } else if (Name == "f16c") {
2345 if (Enabled)
2346 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002347 } else if (Name == "sha") {
2348 if (Enabled)
2349 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002350 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002351}
2352
Eric Christopher3ff21b32013-10-16 21:26:26 +00002353/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002354/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002355bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002356 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002357 // Remember the maximum enabled sselevel.
2358 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2359 // Ignore disabled features.
2360 if (Features[i][0] == '-')
2361 continue;
2362
Benjamin Kramer27402c62012-03-05 15:10:44 +00002363 StringRef Feature = StringRef(Features[i]).substr(1);
2364
2365 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002366 HasAES = true;
2367 continue;
2368 }
2369
Craig Topper3f122a72012-05-31 05:18:48 +00002370 if (Feature == "pclmul") {
2371 HasPCLMUL = true;
2372 continue;
2373 }
2374
Benjamin Kramer27402c62012-03-05 15:10:44 +00002375 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002376 HasLZCNT = true;
2377 continue;
2378 }
2379
Rafael Espindola89049822013-08-23 20:21:37 +00002380 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002381 HasRDRND = true;
2382 continue;
2383 }
2384
Benjamin Kramer27402c62012-03-05 15:10:44 +00002385 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002386 HasBMI = true;
2387 continue;
2388 }
2389
Benjamin Kramer27402c62012-03-05 15:10:44 +00002390 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002391 HasBMI2 = true;
2392 continue;
2393 }
2394
Benjamin Kramer27402c62012-03-05 15:10:44 +00002395 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002396 HasPOPCNT = true;
2397 continue;
2398 }
2399
Michael Liao625a8752012-11-10 05:17:46 +00002400 if (Feature == "rtm") {
2401 HasRTM = true;
2402 continue;
2403 }
2404
Michael Liao74f4eaf2013-03-26 17:52:08 +00002405 if (Feature == "prfchw") {
2406 HasPRFCHW = true;
2407 continue;
2408 }
2409
Michael Liaoffaae352013-03-29 05:17:55 +00002410 if (Feature == "rdseed") {
2411 HasRDSEED = true;
2412 continue;
2413 }
2414
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002415 if (Feature == "tbm") {
2416 HasTBM = true;
2417 continue;
2418 }
2419
Craig Topperbba778b2012-06-03 21:46:30 +00002420 if (Feature == "fma") {
2421 HasFMA = true;
2422 continue;
2423 }
2424
Manman Rena45358c2012-10-11 00:59:55 +00002425 if (Feature == "f16c") {
2426 HasF16C = true;
2427 continue;
2428 }
2429
Craig Topper679b53a2013-08-21 05:29:10 +00002430 if (Feature == "avx512cd") {
2431 HasAVX512CD = true;
2432 continue;
2433 }
2434
2435 if (Feature == "avx512er") {
2436 HasAVX512ER = true;
2437 continue;
2438 }
2439
2440 if (Feature == "avx512pf") {
2441 HasAVX512PF = true;
2442 continue;
2443 }
2444
Ben Langmuir58078d02013-09-19 13:22:04 +00002445 if (Feature == "sha") {
2446 HasSHA = true;
2447 continue;
2448 }
2449
Nick Lewycky50e8f482013-10-05 20:14:27 +00002450 if (Feature == "cx16") {
2451 HasCX16 = true;
2452 continue;
2453 }
2454
Daniel Dunbar979586e2009-11-11 09:38:56 +00002455 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002456 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002457 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002458 .Case("avx2", AVX2)
2459 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002460 .Case("sse4.2", SSE42)
2461 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002462 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002463 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002464 .Case("sse2", SSE2)
2465 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002466 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002467 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002468
Eli Friedman33465822011-07-08 23:31:17 +00002469 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002470 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002471 .Case("3dnowa", AMD3DNowAthlon)
2472 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002473 .Case("mmx", MMX)
2474 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002475 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002476
2477 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2478 .Case("xop", XOP)
2479 .Case("fma4", FMA4)
2480 .Case("sse4a", SSE4A)
2481 .Default(NoXOP);
2482 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002483 }
Eli Friedman33465822011-07-08 23:31:17 +00002484
Craig Topper7481d8a2013-09-10 06:55:47 +00002485 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2486 // Can't do this earlier because we need to be able to explicitly enable
2487 // popcnt and still disable sse4.2.
2488 if (!HasPOPCNT && SSELevel >= SSE42 &&
2489 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2490 HasPOPCNT = true;
2491 Features.push_back("+popcnt");
2492 }
2493
Yunzhong Gao61089362013-10-16 19:07:02 +00002494 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2495 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2496 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2497 HasPRFCHW = true;
2498 Features.push_back("+prfchw");
2499 }
2500
Rafael Espindolaeb265472013-08-21 21:59:03 +00002501 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2502 // matches the selected sse level.
2503 if (FPMath == FP_SSE && SSELevel < SSE1) {
2504 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2505 return false;
2506 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2507 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2508 return false;
2509 }
2510
Eli Friedman33465822011-07-08 23:31:17 +00002511 // Don't tell the backend if we're turning off mmx; it will end up disabling
2512 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002513 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2514 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002515 std::vector<std::string>::iterator it;
2516 it = std::find(Features.begin(), Features.end(), "-mmx");
2517 if (it != Features.end())
2518 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002519 else if (SSELevel > NoSSE)
2520 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002521 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002522}
Chris Lattnerecd49032009-03-02 22:27:17 +00002523
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002524/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2525/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002526void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002527 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002528 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002529 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002530 Builder.defineMacro("__amd64__");
2531 Builder.defineMacro("__amd64");
2532 Builder.defineMacro("__x86_64");
2533 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002534 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002535 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002536 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002537
Chris Lattnerecd49032009-03-02 22:27:17 +00002538 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002539 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2540 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002541 switch (CPU) {
2542 case CK_Generic:
2543 break;
2544 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002545 // The rest are coming from the i386 define above.
2546 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002547 break;
2548 case CK_i486:
2549 case CK_WinChipC6:
2550 case CK_WinChip2:
2551 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002552 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002553 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002554 case CK_PentiumMMX:
2555 Builder.defineMacro("__pentium_mmx__");
2556 Builder.defineMacro("__tune_pentium_mmx__");
2557 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002558 case CK_i586:
2559 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002560 defineCPUMacros(Builder, "i586");
2561 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002562 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002563 case CK_Pentium3:
2564 case CK_Pentium3M:
2565 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002566 Builder.defineMacro("__tune_pentium3__");
2567 // Fallthrough
2568 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002569 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002570 Builder.defineMacro("__tune_pentium2__");
2571 // Fallthrough
2572 case CK_PentiumPro:
2573 Builder.defineMacro("__tune_i686__");
2574 Builder.defineMacro("__tune_pentiumpro__");
2575 // Fallthrough
2576 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002577 Builder.defineMacro("__i686");
2578 Builder.defineMacro("__i686__");
2579 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2580 Builder.defineMacro("__pentiumpro");
2581 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002582 break;
2583 case CK_Pentium4:
2584 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002585 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002586 break;
2587 case CK_Yonah:
2588 case CK_Prescott:
2589 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002590 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002591 break;
2592 case CK_Core2:
2593 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002594 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002595 break;
2596 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002597 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002598 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002599 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002600 defineCPUMacros(Builder, "slm");
2601 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002602 case CK_Corei7:
2603 case CK_Corei7AVX:
2604 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002605 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002606 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002607 break;
Craig Topper449314e2013-08-20 07:09:39 +00002608 case CK_KNL:
2609 defineCPUMacros(Builder, "knl");
2610 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002611 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002612 Builder.defineMacro("__k6_2__");
2613 Builder.defineMacro("__tune_k6_2__");
2614 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002615 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002616 if (CPU != CK_K6_2) { // In case of fallthrough
2617 // FIXME: GCC may be enabling these in cases where some other k6
2618 // architecture is specified but -m3dnow is explicitly provided. The
2619 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002620 Builder.defineMacro("__k6_3__");
2621 Builder.defineMacro("__tune_k6_3__");
2622 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002623 // Fallthrough
2624 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002625 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002626 break;
2627 case CK_Athlon:
2628 case CK_AthlonThunderbird:
2629 case CK_Athlon4:
2630 case CK_AthlonXP:
2631 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002632 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002633 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002634 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002635 Builder.defineMacro("__tune_athlon_sse__");
2636 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002637 break;
2638 case CK_K8:
2639 case CK_K8SSE3:
2640 case CK_x86_64:
2641 case CK_Opteron:
2642 case CK_OpteronSSE3:
2643 case CK_Athlon64:
2644 case CK_Athlon64SSE3:
2645 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002646 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002647 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002648 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002649 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002650 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002651 case CK_BTVER1:
2652 defineCPUMacros(Builder, "btver1");
2653 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002654 case CK_BTVER2:
2655 defineCPUMacros(Builder, "btver2");
2656 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002657 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002658 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002659 break;
2660 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002661 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002662 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002663 case CK_BDVER3:
2664 defineCPUMacros(Builder, "bdver3");
2665 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002666 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002667 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002668 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002669 }
Chris Lattner96e43572009-03-02 22:40:39 +00002670
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002671 // Target properties.
2672 Builder.defineMacro("__LITTLE_ENDIAN__");
2673 Builder.defineMacro("__REGISTER_PREFIX__", "");
2674
Chris Lattner6df41af2009-04-19 17:32:33 +00002675 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2676 // functions in glibc header files that use FP Stack inline asm which the
2677 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002678 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002679
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002680 if (HasAES)
2681 Builder.defineMacro("__AES__");
2682
Craig Topper3f122a72012-05-31 05:18:48 +00002683 if (HasPCLMUL)
2684 Builder.defineMacro("__PCLMUL__");
2685
Craig Topper22967d42011-12-25 05:06:45 +00002686 if (HasLZCNT)
2687 Builder.defineMacro("__LZCNT__");
2688
Benjamin Kramer1e250392012-07-07 09:39:18 +00002689 if (HasRDRND)
2690 Builder.defineMacro("__RDRND__");
2691
Craig Topper22967d42011-12-25 05:06:45 +00002692 if (HasBMI)
2693 Builder.defineMacro("__BMI__");
2694
2695 if (HasBMI2)
2696 Builder.defineMacro("__BMI2__");
2697
Craig Topper1de83482011-12-29 16:10:46 +00002698 if (HasPOPCNT)
2699 Builder.defineMacro("__POPCNT__");
2700
Michael Liao625a8752012-11-10 05:17:46 +00002701 if (HasRTM)
2702 Builder.defineMacro("__RTM__");
2703
Michael Liao74f4eaf2013-03-26 17:52:08 +00002704 if (HasPRFCHW)
2705 Builder.defineMacro("__PRFCHW__");
2706
Michael Liaoffaae352013-03-29 05:17:55 +00002707 if (HasRDSEED)
2708 Builder.defineMacro("__RDSEED__");
2709
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002710 if (HasTBM)
2711 Builder.defineMacro("__TBM__");
2712
Rafael Espindolae62e2792013-08-20 13:44:29 +00002713 switch (XOPLevel) {
2714 case XOP:
2715 Builder.defineMacro("__XOP__");
2716 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002717 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002718 case SSE4A:
2719 Builder.defineMacro("__SSE4A__");
2720 case NoXOP:
2721 break;
2722 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002723
Craig Topperbba778b2012-06-03 21:46:30 +00002724 if (HasFMA)
2725 Builder.defineMacro("__FMA__");
2726
Manman Rena45358c2012-10-11 00:59:55 +00002727 if (HasF16C)
2728 Builder.defineMacro("__F16C__");
2729
Craig Topper679b53a2013-08-21 05:29:10 +00002730 if (HasAVX512CD)
2731 Builder.defineMacro("__AVX512CD__");
2732 if (HasAVX512ER)
2733 Builder.defineMacro("__AVX512ER__");
2734 if (HasAVX512PF)
2735 Builder.defineMacro("__AVX512PF__");
2736
Ben Langmuir58078d02013-09-19 13:22:04 +00002737 if (HasSHA)
2738 Builder.defineMacro("__SHA__");
2739
Nick Lewycky50e8f482013-10-05 20:14:27 +00002740 if (HasCX16)
2741 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2742
Chris Lattner96e43572009-03-02 22:40:39 +00002743 // Each case falls through to the previous one here.
2744 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002745 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002746 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002747 case AVX2:
2748 Builder.defineMacro("__AVX2__");
2749 case AVX:
2750 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002751 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002752 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002753 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002754 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002755 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002756 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002757 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002758 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002759 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002760 Builder.defineMacro("__SSE2__");
2761 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002762 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002763 Builder.defineMacro("__SSE__");
2764 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002765 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002766 break;
2767 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002768
Derek Schuffc7dd7222012-10-11 15:52:22 +00002769 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002770 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002771 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002772 case AVX2:
2773 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002774 case SSE42:
2775 case SSE41:
2776 case SSSE3:
2777 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002778 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002779 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002780 break;
2781 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002782 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002783 break;
2784 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002785 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002786 }
2787 }
2788
Anders Carlssone437c682010-01-27 03:47:49 +00002789 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002790 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002791 case AMD3DNowAthlon:
2792 Builder.defineMacro("__3dNOW_A__");
2793 case AMD3DNow:
2794 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002795 case MMX:
2796 Builder.defineMacro("__MMX__");
2797 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002798 break;
2799 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002800
2801 if (CPU >= CK_i486) {
2802 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2803 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2804 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2805 }
2806 if (CPU >= CK_i586)
2807 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002808}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002809
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002810bool X86TargetInfo::hasFeature(StringRef Feature) const {
2811 return llvm::StringSwitch<bool>(Feature)
2812 .Case("aes", HasAES)
2813 .Case("avx", SSELevel >= AVX)
2814 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002815 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002816 .Case("avx512cd", HasAVX512CD)
2817 .Case("avx512er", HasAVX512ER)
2818 .Case("avx512pf", HasAVX512PF)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002819 .Case("bmi", HasBMI)
2820 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002821 .Case("cx16", HasCX16)
2822 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002823 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002824 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002825 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002826 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002827 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002828 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2829 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2830 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002831 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002832 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002833 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002834 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002835 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002836 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002837 .Case("sse", SSELevel >= SSE1)
2838 .Case("sse2", SSELevel >= SSE2)
2839 .Case("sse3", SSELevel >= SSE3)
2840 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002841 .Case("sse4.1", SSELevel >= SSE41)
2842 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002843 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002844 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002845 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2846 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002847 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002848 .Default(false);
2849}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002850
Eli Friedman3fd920a2008-08-20 02:34:37 +00002851bool
Anders Carlsson58436352009-02-28 17:11:49 +00002852X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002853 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002854 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002855 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002856 case 'Y': // first letter of a pair:
2857 switch (*(Name+1)) {
2858 default: return false;
2859 case '0': // First SSE register.
2860 case 't': // Any SSE register, when SSE2 is enabled.
2861 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2862 case 'm': // any MMX register, when inter-unit moves enabled.
2863 break; // falls through to setAllowsRegister.
2864 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002865 case 'a': // eax.
2866 case 'b': // ebx.
2867 case 'c': // ecx.
2868 case 'd': // edx.
2869 case 'S': // esi.
2870 case 'D': // edi.
2871 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00002872 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002873 case 't': // top of floating point stack.
2874 case 'u': // second from top of floating point stack.
2875 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002876 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002877 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002878 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002879 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2880 case 'l': // "Index" registers: any general register that can be used as an
2881 // index in a base+index memory access.
2882 Info.setAllowsRegister();
2883 return true;
2884 case 'C': // SSE floating point constant.
2885 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002886 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002887 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002888 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002889 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002890 return true;
2891 }
2892}
2893
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002894
Eli Friedman3fd920a2008-08-20 02:34:37 +00002895std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002896X86TargetInfo::convertConstraint(const char *&Constraint) const {
2897 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002898 case 'a': return std::string("{ax}");
2899 case 'b': return std::string("{bx}");
2900 case 'c': return std::string("{cx}");
2901 case 'd': return std::string("{dx}");
2902 case 'S': return std::string("{si}");
2903 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002904 case 'p': // address
2905 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002906 case 't': // top of floating point stack.
2907 return std::string("{st}");
2908 case 'u': // second from top of floating point stack.
2909 return std::string("{st(1)}"); // second from top of floating point stack.
2910 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002911 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002912 }
2913}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002914} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002915
2916namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002917// X86-32 generic target
2918class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002919public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002920 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002921 DoubleAlign = LongLongAlign = 32;
2922 LongDoubleWidth = 96;
2923 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002924 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00002925 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002926 SizeType = UnsignedInt;
2927 PtrDiffType = SignedInt;
2928 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002929 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002930
2931 // Use fpret for all types.
2932 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2933 (1 << TargetInfo::Double) |
2934 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002935
2936 // x86-32 has atomics up to 8 bytes
2937 // FIXME: Check that we actually have cmpxchg8b before setting
2938 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2939 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002940 }
Meador Inge5d3fb222012-06-16 03:34:49 +00002941 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2942 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002943 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002944
Chris Lattnerd545ad12009-09-23 06:06:36 +00002945 int getEHDataRegisterNumber(unsigned RegNo) const {
2946 if (RegNo == 0) return 0;
2947 if (RegNo == 1) return 2;
2948 return -1;
2949 }
Bill Wendling887b4852012-11-12 06:42:51 +00002950 virtual bool validateInputSize(StringRef Constraint,
2951 unsigned Size) const {
2952 switch (Constraint[0]) {
2953 default: break;
2954 case 'a':
2955 case 'b':
2956 case 'c':
2957 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00002958 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00002959 }
2960
2961 return true;
2962 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002963};
2964} // end anonymous namespace
2965
2966namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002967class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2968public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002969 NetBSDI386TargetInfo(const llvm::Triple &Triple)
2970 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002971
2972 virtual unsigned getFloatEvalMethod() const {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00002973 unsigned Major, Minor, Micro;
2974 getTriple().getOSVersion(Major, Minor, Micro);
2975 // New NetBSD uses the default rounding mode.
2976 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
2977 return X86_32TargetInfo::getFloatEvalMethod();
2978 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002979 return 1;
2980 }
2981};
2982} // end anonymous namespace
2983
2984namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00002985class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2986public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002987 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
2988 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00002989 SizeType = UnsignedLong;
2990 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00002991 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00002992 }
2993};
2994} // end anonymous namespace
2995
2996namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00002997class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
2998public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002999 BitrigI386TargetInfo(const llvm::Triple &Triple)
3000 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003001 SizeType = UnsignedLong;
3002 IntPtrType = SignedLong;
3003 PtrDiffType = SignedLong;
3004 }
3005};
3006} // end anonymous namespace
3007
3008namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003009class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003010public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003011 DarwinI386TargetInfo(const llvm::Triple &Triple)
3012 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003013 LongDoubleWidth = 128;
3014 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003015 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003016 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003017 SizeType = UnsignedLong;
3018 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003019 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003020 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003021 }
3022
Eli Friedman3fd920a2008-08-20 02:34:37 +00003023};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003024} // end anonymous namespace
3025
3026namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003027// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003028class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003029public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003030 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3031 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00003032 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00003033 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003034 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003035 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003036 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003037 virtual void getTargetDefines(const LangOptions &Opts,
3038 MacroBuilder &Builder) const {
3039 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3040 }
3041};
3042} // end anonymous namespace
3043
3044namespace {
3045
3046// x86-32 Windows Visual Studio target
3047class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
3048public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003049 VisualStudioWindowsX86_32TargetInfo(const llvm::Triple &Triple)
3050 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003051 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003052 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3053 }
3054 virtual void getTargetDefines(const LangOptions &Opts,
3055 MacroBuilder &Builder) const {
3056 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3057 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3058 // The value of the following reflects processor type.
3059 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3060 // We lost the original triple, so we use the default.
3061 Builder.defineMacro("_M_IX86", "600");
3062 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003063};
3064} // end anonymous namespace
3065
3066namespace {
3067// x86-32 MinGW target
3068class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3069public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003070 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3071 : WindowsX86_32TargetInfo(Triple) {}
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003072 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003073 MacroBuilder &Builder) const {
3074 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003075 DefineStd(Builder, "WIN32", Opts);
3076 DefineStd(Builder, "WINNT", Opts);
3077 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003078 Builder.defineMacro("__MSVCRT__");
3079 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003080
3081 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3082 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003083 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003084 // Provide "as-is" __declspec.
3085 Builder.defineMacro("__declspec", "__declspec");
3086 else
3087 // Provide alias of __attribute__ like mingw32-gcc.
3088 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003089 }
3090};
3091} // end anonymous namespace
3092
3093namespace {
3094// x86-32 Cygwin target
3095class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3096public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003097 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3098 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003099 TLSSupported = false;
3100 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003101 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003102 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003103 }
3104 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003105 MacroBuilder &Builder) const {
3106 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003107 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003108 Builder.defineMacro("__CYGWIN__");
3109 Builder.defineMacro("__CYGWIN32__");
3110 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003111 if (Opts.CPlusPlus)
3112 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003113 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003114};
3115} // end anonymous namespace
3116
3117namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003118// x86-32 Haiku target
3119class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3120public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003121 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003122 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003123 IntPtrType = SignedLong;
3124 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003125 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003126 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003127 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003128 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00003129 virtual void getTargetDefines(const LangOptions &Opts,
3130 MacroBuilder &Builder) const {
3131 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3132 Builder.defineMacro("__INTEL__");
3133 Builder.defineMacro("__HAIKU__");
3134 }
3135};
3136} // end anonymous namespace
3137
Douglas Gregor9fabd852011-07-01 22:41:14 +00003138// RTEMS Target
3139template<typename Target>
3140class RTEMSTargetInfo : public OSTargetInfo<Target> {
3141protected:
3142 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3143 MacroBuilder &Builder) const {
3144 // RTEMS defines; list based off of gcc output
3145
Douglas Gregor9fabd852011-07-01 22:41:14 +00003146 Builder.defineMacro("__rtems__");
3147 Builder.defineMacro("__ELF__");
3148 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003149
Douglas Gregor9fabd852011-07-01 22:41:14 +00003150public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003151 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3152 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003153
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003154 switch (Triple.getArch()) {
3155 default:
3156 case llvm::Triple::x86:
3157 // this->MCountName = ".mcount";
3158 break;
3159 case llvm::Triple::mips:
3160 case llvm::Triple::mipsel:
3161 case llvm::Triple::ppc:
3162 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003163 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003164 // this->MCountName = "_mcount";
3165 break;
3166 case llvm::Triple::arm:
3167 // this->MCountName = "__mcount";
3168 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003169 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003170 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003171};
3172
3173namespace {
3174// x86-32 RTEMS target
3175class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3176public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003177 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003178 SizeType = UnsignedLong;
3179 IntPtrType = SignedLong;
3180 PtrDiffType = SignedLong;
3181 this->UserLabelPrefix = "";
3182 }
3183 virtual void getTargetDefines(const LangOptions &Opts,
3184 MacroBuilder &Builder) const {
3185 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3186 Builder.defineMacro("__INTEL__");
3187 Builder.defineMacro("__rtems__");
3188 }
3189};
3190} // end anonymous namespace
3191
Chris Lattnerb986aba2010-04-11 19:29:39 +00003192namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003193// x86-64 generic target
3194class X86_64TargetInfo : public X86TargetInfo {
3195public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003196 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00003197 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003198 LongDoubleWidth = 128;
3199 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003200 LargeArrayMinWidth = 128;
3201 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003202 SuitableAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003203 IntMaxType = SignedLong;
3204 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003205 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003206 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003207
Rafael Espindolac418ae92014-01-03 19:22:05 +00003208 DescriptionString = "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003209
3210 // Use fpret only for long double.
3211 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003212
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003213 // Use fp2ret for _Complex long double.
3214 ComplexLongDoubleUsesFP2Ret = true;
3215
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003216 // x86-64 has atomics up to 16 bytes.
3217 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3218 // on CPUs with cmpxchg16b
3219 MaxAtomicPromoteWidth = 128;
3220 MaxAtomicInlineWidth = 64;
Chris Lattner10a5b382007-01-29 05:24:35 +00003221 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003222 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3223 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003224 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003225
Chris Lattnerd545ad12009-09-23 06:06:36 +00003226 int getEHDataRegisterNumber(unsigned RegNo) const {
3227 if (RegNo == 0) return 0;
3228 if (RegNo == 1) return 1;
3229 return -1;
3230 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003231
3232 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
Charles Davisb5a214e2013-08-30 04:39:01 +00003233 return (CC == CC_C ||
3234 CC == CC_IntelOclBicc ||
3235 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003236 }
3237
Aaron Ballman02df2e02012-12-09 17:45:41 +00003238 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
3239 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003240 }
3241
Eli Friedman3fd920a2008-08-20 02:34:37 +00003242};
3243} // end anonymous namespace
3244
3245namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003246// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003247class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003248public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003249 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3250 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003251 TLSSupported = false;
3252 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003253 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003254 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003255 IntMaxType = SignedLongLong;
3256 UIntMaxType = UnsignedLongLong;
3257 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003258 SizeType = UnsignedLongLong;
3259 PtrDiffType = SignedLongLong;
3260 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003261 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003262 }
3263 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003264 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003265 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003266 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003267 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003268 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3269 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003270 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003271 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3272 return (CC == CC_C ||
3273 CC == CC_IntelOclBicc ||
3274 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3275 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003276};
3277} // end anonymous namespace
3278
3279namespace {
3280// x86-64 Windows Visual Studio target
3281class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
3282public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003283 VisualStudioWindowsX86_64TargetInfo(const llvm::Triple &Triple)
3284 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003285 LongDoubleWidth = LongDoubleAlign = 64;
3286 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003287 }
3288 virtual void getTargetDefines(const LangOptions &Opts,
3289 MacroBuilder &Builder) const {
3290 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3291 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003292 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003293 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003294 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003295};
3296} // end anonymous namespace
3297
3298namespace {
3299// x86-64 MinGW target
3300class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3301public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003302 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3303 : WindowsX86_64TargetInfo(Triple) {}
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003304 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003305 MacroBuilder &Builder) const {
3306 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003307 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003308 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00003309 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003310 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003311
3312 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3313 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003314 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003315 // Provide "as-is" __declspec.
3316 Builder.defineMacro("__declspec", "__declspec");
3317 else
3318 // Provide alias of __attribute__ like mingw32-gcc.
3319 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003320 }
3321};
3322} // end anonymous namespace
3323
3324namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003325class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3326public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003327 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3328 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003329 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003330 MaxVectorAlign = 256;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003331 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003332 }
3333};
3334} // end anonymous namespace
3335
3336namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003337class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3338public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003339 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3340 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003341 IntMaxType = SignedLongLong;
3342 UIntMaxType = UnsignedLongLong;
3343 Int64Type = SignedLongLong;
3344 }
3345};
3346} // end anonymous namespace
3347
3348namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003349class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3350public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003351 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3352 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3353 IntMaxType = SignedLongLong;
3354 UIntMaxType = UnsignedLongLong;
3355 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003356 }
3357};
Tim Northover9bb857a2013-01-31 12:13:10 +00003358}
3359
3360namespace {
3361class AArch64TargetInfo : public TargetInfo {
3362 static const char * const GCCRegNames[];
3363 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003364
Tim Northover2fe823a2013-08-01 09:23:19 +00003365 enum FPUModeEnum {
3366 FPUMode,
3367 NeonMode
3368 };
3369
3370 unsigned FPU;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003371 unsigned Crypto;
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003372 static const Builtin::Info BuiltinInfo[];
Tim Northover2fe823a2013-08-01 09:23:19 +00003373
Tim Northover9bb857a2013-01-31 12:13:10 +00003374public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003375 AArch64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Tim Northover9bb857a2013-01-31 12:13:10 +00003376 BigEndian = false;
3377 LongWidth = LongAlign = 64;
3378 LongDoubleWidth = LongDoubleAlign = 128;
3379 PointerWidth = PointerAlign = 64;
3380 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003381 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
Tim Northover9bb857a2013-01-31 12:13:10 +00003382
3383 WCharType = UnsignedInt;
3384 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3385
Tim Northover847d2d42013-02-18 12:11:32 +00003386 // AArch64 backend supports 64-bit operations at the moment. In principle
3387 // 128-bit is possible if register-pairs are used.
3388 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3389
Tim Northover9bb857a2013-01-31 12:13:10 +00003390 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3391 }
3392 virtual void getTargetDefines(const LangOptions &Opts,
3393 MacroBuilder &Builder) const {
3394 // GCC defines theses currently
3395 Builder.defineMacro("__aarch64__");
3396 Builder.defineMacro("__AARCH64EL__");
3397
3398 // ACLE predefines. Many can only have one possible value on v8 AArch64.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003399 Builder.defineMacro("__ARM_ACLE", "200");
Tim Northoverb85654d2013-04-05 14:08:55 +00003400 Builder.defineMacro("__ARM_ARCH", "8");
3401 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
Tim Northover9bb857a2013-01-31 12:13:10 +00003402
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003403 Builder.defineMacro("__ARM_64BIT_STATE");
3404 Builder.defineMacro("__ARM_PCS_AAPCS64");
3405 Builder.defineMacro("__ARM_ARCH_ISA_A64");
3406
Tim Northoverb85654d2013-04-05 14:08:55 +00003407 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
3408 Builder.defineMacro("__ARM_FEATURE_CLZ");
3409 Builder.defineMacro("__ARM_FEATURE_FMA");
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003410 Builder.defineMacro("__ARM_FEATURE_DIV");
Tim Northover9bb857a2013-01-31 12:13:10 +00003411
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003412 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
Tim Northover9bb857a2013-01-31 12:13:10 +00003413
3414 // 0xe implies support for half, single and double precision operations.
Tim Northoverb85654d2013-04-05 14:08:55 +00003415 Builder.defineMacro("__ARM_FP", "0xe");
Tim Northover9bb857a2013-01-31 12:13:10 +00003416
3417 // PCS specifies this for SysV variants, which is all we support. Other ABIs
Tim Northoverb85654d2013-04-05 14:08:55 +00003418 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
3419 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
Tim Northover9bb857a2013-01-31 12:13:10 +00003420
3421 if (Opts.FastMath || Opts.FiniteMathOnly)
Tim Northoverb85654d2013-04-05 14:08:55 +00003422 Builder.defineMacro("__ARM_FP_FAST");
Tim Northover9bb857a2013-01-31 12:13:10 +00003423
3424 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
Tim Northoverb85654d2013-04-05 14:08:55 +00003425 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
Tim Northover9bb857a2013-01-31 12:13:10 +00003426
Tim Northoverb85654d2013-04-05 14:08:55 +00003427 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
Tim Northover9bb857a2013-01-31 12:13:10 +00003428 Opts.ShortWChar ? "2" : "4");
3429
Tim Northoverb85654d2013-04-05 14:08:55 +00003430 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
Tim Northover9bb857a2013-01-31 12:13:10 +00003431 Opts.ShortEnums ? "1" : "4");
3432
3433 if (BigEndian)
Tim Northover2fe823a2013-08-01 09:23:19 +00003434 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3435
3436 if (FPU == NeonMode) {
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003437 Builder.defineMacro("__ARM_NEON");
Tim Northover2fe823a2013-08-01 09:23:19 +00003438 // 64-bit NEON supports half, single and double precision operations.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003439 Builder.defineMacro("__ARM_NEON_FP", "7");
3440 }
3441
3442 if (Crypto) {
3443 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northover2fe823a2013-08-01 09:23:19 +00003444 }
Tim Northover9bb857a2013-01-31 12:13:10 +00003445 }
3446 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3447 unsigned &NumRecords) const {
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003448 Records = BuiltinInfo;
3449 NumRecords = clang::AArch64::LastTSBuiltin-Builtin::FirstTSBuiltin;
Tim Northover9bb857a2013-01-31 12:13:10 +00003450 }
3451 virtual bool hasFeature(StringRef Feature) const {
Tim Northover2fe823a2013-08-01 09:23:19 +00003452 return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode);
Tim Northover9bb857a2013-01-31 12:13:10 +00003453 }
Tim Northover2fe823a2013-08-01 09:23:19 +00003454
Amara Emerson703da2e2013-10-31 09:32:33 +00003455 virtual bool setCPU(const std::string &Name) {
3456 return llvm::StringSwitch<bool>(Name)
3457 .Case("generic", true)
3458 .Cases("cortex-a53", "cortex-a57", true)
3459 .Default(false);
3460 }
3461
Eric Christopher3ff21b32013-10-16 21:26:26 +00003462 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003463 DiagnosticsEngine &Diags) {
Tim Northover2fe823a2013-08-01 09:23:19 +00003464 FPU = FPUMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003465 Crypto = 0;
Tim Northover2fe823a2013-08-01 09:23:19 +00003466 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3467 if (Features[i] == "+neon")
3468 FPU = NeonMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003469 if (Features[i] == "+crypto")
3470 Crypto = 1;
Tim Northover2fe823a2013-08-01 09:23:19 +00003471 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00003472 return true;
Tim Northover2fe823a2013-08-01 09:23:19 +00003473 }
3474
3475 virtual void getGCCRegNames(const char *const *&Names,
Tim Northover9bb857a2013-01-31 12:13:10 +00003476 unsigned &NumNames) const;
3477 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3478 unsigned &NumAliases) const;
3479
3480 virtual bool isCLZForZeroUndef() const { return false; }
3481
3482 virtual bool validateAsmConstraint(const char *&Name,
3483 TargetInfo::ConstraintInfo &Info) const {
3484 switch (*Name) {
3485 default: return false;
3486 case 'w': // An FP/SIMD vector register
3487 Info.setAllowsRegister();
3488 return true;
3489 case 'I': // Constant that can be used with an ADD instruction
3490 case 'J': // Constant that can be used with a SUB instruction
3491 case 'K': // Constant that can be used with a 32-bit logical instruction
3492 case 'L': // Constant that can be used with a 64-bit logical instruction
3493 case 'M': // Constant that can be used as a 32-bit MOV immediate
3494 case 'N': // Constant that can be used as a 64-bit MOV immediate
3495 case 'Y': // Floating point constant zero
3496 case 'Z': // Integer constant zero
3497 return true;
3498 case 'Q': // A memory reference with base register and no offset
3499 Info.setAllowsMemory();
3500 return true;
3501 case 'S': // A symbolic address
3502 Info.setAllowsRegister();
3503 return true;
3504 case 'U':
3505 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3506 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3507 // Usa: An absolute symbolic address
3508 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3509 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3510 }
3511 }
3512
3513 virtual const char *getClobbers() const {
3514 // There are no AArch64 clobbers shared by all asm statements.
3515 return "";
3516 }
3517
3518 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3519 return TargetInfo::AArch64ABIBuiltinVaList;
3520 }
3521};
3522
3523const char * const AArch64TargetInfo::GCCRegNames[] = {
3524 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3525 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3526 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3527 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3528
3529 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3530 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3531 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3532 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3533
3534 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3535 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3536 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3537 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3538
3539 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3540 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3541 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3542 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3543
3544 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3545 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3546 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3547 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3548
3549 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3550 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3551 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3552 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3553
3554 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3555 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3556 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3557 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3558};
3559
3560void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3561 unsigned &NumNames) const {
3562 Names = GCCRegNames;
3563 NumNames = llvm::array_lengthof(GCCRegNames);
3564}
3565
3566const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3567 { { "x16" }, "ip0"},
3568 { { "x17" }, "ip1"},
3569 { { "x29" }, "fp" },
3570 { { "x30" }, "lr" }
3571};
3572
3573void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3574 unsigned &NumAliases) const {
3575 Aliases = GCCRegAliases;
3576 NumAliases = llvm::array_lengthof(GCCRegAliases);
3577
3578}
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003579
3580const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
3581#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3582#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3583 ALL_LANGUAGES },
3584#include "clang/Basic/BuiltinsAArch64.def"
3585};
3586
Eli Friedman9fa28852012-08-08 23:57:20 +00003587} // end anonymous namespace
3588
3589namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003590class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003591 // Possible FPU choices.
3592 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003593 VFP2FPU = (1 << 0),
3594 VFP3FPU = (1 << 1),
3595 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003596 NeonFPU = (1 << 3),
3597 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003598 };
3599
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003600 // Possible HWDiv features.
3601 enum HWDivMode {
3602 HWDivThumb = (1 << 0),
3603 HWDivARM = (1 << 1)
3604 };
3605
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003606 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003607 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003608 }
3609
3610 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3611 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003612
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003613 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003614
Rafael Espindolaeb265472013-08-21 21:59:03 +00003615 enum {
3616 FP_Default,
3617 FP_VFP,
3618 FP_Neon
3619 } FPMath;
3620
Bernard Ogdenda13af32013-10-24 18:32:51 +00003621 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003622
Logan Chien57086ce2012-10-10 06:56:20 +00003623 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003624 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003625 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003626
3627 // Initialized via features.
3628 unsigned SoftFloat : 1;
3629 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003630
Bernard Ogden18b57012013-10-29 09:47:51 +00003631 unsigned CRC : 1;
3632
Chris Lattner5cc15e02010-03-03 19:03:45 +00003633 static const Builtin::Info BuiltinInfo[];
3634
Rafael Espindola101d5b92013-05-13 20:09:47 +00003635 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3636 // On linux, binaries targeting old cpus call functions in libgcc to
3637 // perform atomic operations. The implementation in libgcc then calls into
3638 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3639 // is that if we assume the kernel is at least as recent as the hardware,
3640 // it is safe to use atomic instructions on armv6 and newer.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003641 if (!T.isOSLinux() &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003642 T.getOS() != llvm::Triple::FreeBSD &&
Joerg Sonnenbergerfbd51be2013-12-02 16:12:05 +00003643 T.getOS() != llvm::Triple::NetBSD &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003644 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten60afa2d2013-06-15 09:40:14 +00003645 return false;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003646 StringRef ArchName = T.getArchName();
Rafael Espindola92dbc312013-05-14 00:44:24 +00003647 if (T.getArch() == llvm::Triple::arm) {
3648 if (!ArchName.startswith("armv"))
3649 return false;
3650 StringRef VersionStr = ArchName.substr(4);
3651 unsigned Version;
3652 if (VersionStr.getAsInteger(10, Version))
3653 return false;
3654 return Version >= 6;
3655 }
3656 assert(T.getArch() == llvm::Triple::thumb);
3657 if (!ArchName.startswith("thumbv"))
3658 return false;
3659 StringRef VersionStr = ArchName.substr(6);
3660 unsigned Version;
3661 if (VersionStr.getAsInteger(10, Version))
3662 return false;
3663 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003664 }
3665
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003666 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003667 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003668
3669 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003670 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003671
Joerg Sonnenbergerf19dc302014-01-26 20:02:03 +00003672 // size_t is unsigned long on Darwin and NetBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003673 if (T.isOSDarwin() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003674 SizeType = UnsignedLong;
3675 else
3676 SizeType = UnsignedInt;
3677
Rafael Espindolac418ae92014-01-03 19:22:05 +00003678 if (T.getOS() == llvm::Triple::NetBSD) {
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003679 WCharType = SignedInt;
3680 } else {
3681 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3682 WCharType = UnsignedInt;
3683 }
3684
3685 UseBitFieldTypeAlignment = true;
3686
3687 ZeroLengthBitfieldBoundary = 0;
3688
3689 if (IsThumb) {
3690 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3691 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003692 if (T.isOSBinFormatMachO())
3693 DescriptionString = "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3694 "v128:64:128-a:0:32-n32-S64";
3695 else
3696 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3697 "v128:64:128-a:0:32-n32-S64";
3698
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003699 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003700 if (T.isOSBinFormatMachO())
3701 DescriptionString = "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
3702 else
3703 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003704 }
3705
3706 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003707 }
3708
3709 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003710 const llvm::Triple &T = getTriple();
3711
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003712 IsAAPCS = false;
3713
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003714 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003715
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003716 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003717 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003718 SizeType = UnsignedInt;
3719 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003720 SizeType = UnsignedLong;
3721
3722 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3723 WCharType = SignedInt;
3724
3725 // Do not respect the alignment of bit-field types when laying out
3726 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3727 UseBitFieldTypeAlignment = false;
3728
3729 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3730 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3731 /// gcc.
3732 ZeroLengthBitfieldBoundary = 32;
3733
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003734 if (IsThumb) {
3735 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3736 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003737 if (T.isOSBinFormatMachO())
3738 DescriptionString = "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3739 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
3740 else
3741 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3742 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003743 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003744 if (T.isOSBinFormatMachO())
3745 DescriptionString =
3746 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3747 else
3748 DescriptionString =
3749 "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 +00003750 }
3751
3752 // FIXME: Override "preferred align" for double and long long.
3753 }
3754
Chris Lattner17df24e2008-04-21 18:56:49 +00003755public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003756 ARMTargetInfo(const llvm::Triple &Triple)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003757 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3758 IsAAPCS(true) {
Eli Friedman803acb32011-12-22 03:51:45 +00003759 BigEndian = false;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003760 switch (getTriple().getOS()) {
3761 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003762 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003763 break;
3764 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003765 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003766 break;
3767 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003768
Chris Lattner1a8f3942010-04-23 16:29:58 +00003769 // {} in inline assembly are neon specifiers, not assembly variant
3770 // specifiers.
3771 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003772
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003773 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003774 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003775
3776 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003777
3778 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003779 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003780
3781 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003782 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003783 if (shouldUseInlineAtomic(getTriple()))
3784 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003785
3786 // Do force alignment of members that follow zero length bitfields. If
3787 // the alignment of the zero-length bitfield is greater than the member
3788 // that follows it, `bar', `bar' will be aligned as the type of the
3789 // zero length bitfield.
3790 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003791 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003792 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003793 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003794 ABI = Name;
3795
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003796 // The defaults (above) are for AAPCS, check if we need to change them.
3797 //
3798 // FIXME: We need support for -meabi... we could just mangle it into the
3799 // name.
3800 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003801 setABIAPCS();
3802 return true;
3803 }
3804 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3805 setABIAAPCS();
3806 return true;
3807 }
3808 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003809 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003810
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00003811 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003812 if (IsAAPCS)
3813 Features["aapcs"] = true;
3814 else
3815 Features["apcs"] = true;
3816
Silviu Barangae5690462013-10-21 10:59:33 +00003817 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003818 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3819 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003820 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3821 CPU == "cortex-a9-mp") {
3822 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003823 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003824 }
3825 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003826 Features["vfp4"] = true;
3827 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003828 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3829 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3830 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003831 Features["vfp4"] = true;
3832 Features["neon"] = true;
3833 Features["hwdiv"] = true;
3834 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003835 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3836 Features["fp-armv8"] = true;
3837 Features["neon"] = true;
3838 Features["hwdiv"] = true;
3839 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003840 Features["crc"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003841 } else if (CPU == "cortex-r5" || CPU == "cortex-m3" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003842 CPU == "cortex-m4" ||
3843 // Enable the hwdiv extension for all v8a AArch32 cores by
3844 // default.
3845 ArchName == "armv8a" || ArchName == "armv8" ||
3846 ArchName == "thumbv8a" || ArchName == "thumbv8") {
3847 Features["hwdiv"] = true;
3848 Features["hwdiv-arm"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003849 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003850 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003851
Eric Christopher3ff21b32013-10-16 21:26:26 +00003852 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003853 DiagnosticsEngine &Diags) {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003854 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003855 CRC = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003856 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003857 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003858 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3859 if (Features[i] == "+soft-float")
3860 SoftFloat = true;
3861 else if (Features[i] == "+soft-float-abi")
3862 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003863 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003864 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003865 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003866 FPU |= VFP3FPU;
3867 else if (Features[i] == "+vfp4")
3868 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003869 else if (Features[i] == "+fp-armv8")
3870 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003871 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003872 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003873 else if (Features[i] == "+hwdiv")
3874 HWDiv |= HWDivThumb;
3875 else if (Features[i] == "+hwdiv-arm")
3876 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00003877 else if (Features[i] == "+crc")
3878 CRC = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003879 }
3880
Rafael Espindolaeb265472013-08-21 21:59:03 +00003881 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3882 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3883 return false;
3884 }
3885
3886 if (FPMath == FP_Neon)
3887 Features.push_back("+neonfp");
3888 else if (FPMath == FP_VFP)
3889 Features.push_back("-neonfp");
3890
Daniel Dunbar893d4752009-12-19 04:15:38 +00003891 // Remove front-end specific options which the backend handles differently.
3892 std::vector<std::string>::iterator it;
3893 it = std::find(Features.begin(), Features.end(), "+soft-float");
3894 if (it != Features.end())
3895 Features.erase(it);
3896 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3897 if (it != Features.end())
3898 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00003899 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003900 }
3901
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003902 virtual bool hasFeature(StringRef Feature) const {
3903 return llvm::StringSwitch<bool>(Feature)
3904 .Case("arm", true)
3905 .Case("softfloat", SoftFloat)
3906 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003907 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003908 .Case("hwdiv", HWDiv & HWDivThumb)
3909 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003910 .Default(false);
3911 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003912 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003913 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003914 return llvm::StringSwitch<const char*>(Name)
3915 .Cases("arm8", "arm810", "4")
3916 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3917 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3918 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3919 .Case("ep9312", "4T")
3920 .Cases("arm10tdmi", "arm1020t", "5T")
3921 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3922 .Case("arm926ej-s", "5TEJ")
3923 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3924 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003925 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003926 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003927 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003928 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00003929 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003930 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003931 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003932 .Case("swift", "7S")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003933 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003934 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003935 .Cases("cortex-a53", "cortex-a57", "8A")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003936 .Default(0);
3937 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003938 static const char *getCPUProfile(StringRef Name) {
3939 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003940 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003941 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003942 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003943 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00003944 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00003945 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003946 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003947 virtual bool setCPU(const std::string &Name) {
3948 if (!getCPUDefineSuffix(Name))
3949 return false;
3950
3951 CPU = Name;
3952 return true;
3953 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00003954 virtual bool setFPMath(StringRef Name);
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003955 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003956 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003957 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003958 Builder.defineMacro("__arm");
3959 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003960
Chris Lattnerecd49032009-03-02 22:27:17 +00003961 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003962 Builder.defineMacro("__ARMEL__");
3963 Builder.defineMacro("__LITTLE_ENDIAN__");
3964 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003965
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003966 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003967 unsigned int CPUArchVer;
3968 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
3969 llvm_unreachable("Invalid char for architecture version number");
3970 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003971 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003972 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3973 StringRef CPUProfile = getCPUProfile(CPU);
3974 if (!CPUProfile.empty())
3975 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00003976
Mike Stump9d54bd72009-04-08 02:07:04 +00003977 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003978
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003979 // FIXME: It's more complicated than this and we don't really support
3980 // interworking.
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00003981 if (5 <= CPUArchVer && CPUArchVer <= 8)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003982 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003983
David Tweed8f676532012-10-25 13:33:01 +00003984 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00003985 // Embedded targets on Darwin follow AAPCS, but not EABI.
3986 if (!getTriple().isOSDarwin())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00003987 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003988 Builder.defineMacro("__ARM_PCS", "1");
3989
David Tweed8f676532012-10-25 13:33:01 +00003990 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003991 Builder.defineMacro("__ARM_PCS_VFP", "1");
3992 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003993
Daniel Dunbar893d4752009-12-19 04:15:38 +00003994 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003995 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003996
3997 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003998 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003999
4000 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004001 Builder.defineMacro("__THUMBEL__");
4002 Builder.defineMacro("__thumb__");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004003 // We check both CPUArchVer and ArchName because when only triple is
4004 // specified, the default CPU is arm1136j-s.
4005 StringRef ArchName = getTriple().getArchName();
4006 if (CPUArch == "6T2" || CPUArchVer >= 7 || ArchName.endswith("v6t2") ||
4007 ArchName.endswith("v7") || ArchName.endswith("v8"))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004008 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004009 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004010 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4011 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004012
4013 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004014 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004015
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004016 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004017 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004018 if (FPU & VFP2FPU)
4019 Builder.defineMacro("__ARM_VFPV2__");
4020 if (FPU & VFP3FPU)
4021 Builder.defineMacro("__ARM_VFPV3__");
4022 if (FPU & VFP4FPU)
4023 Builder.defineMacro("__ARM_VFPV4__");
4024 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004025
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004026 // This only gets set when Neon instructions are actually available, unlike
4027 // the VFP define, hence the soft float and arch check. This is subtly
4028 // different from gcc, we follow the intent which was that it should be set
4029 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004030 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4031 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004032 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004033 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004034
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004035 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4036 Opts.ShortWChar ? "2" : "4");
4037
4038 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4039 Opts.ShortEnums ? "1" : "4");
4040
Bernard Ogden18b57012013-10-29 09:47:51 +00004041 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004042 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004043
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004044 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004045 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4046 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4047 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4048 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4049 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004050 }
4051 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4052 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004053 Records = BuiltinInfo;
4054 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004055 }
Bob Wilsona7a61e22012-01-26 22:14:27 +00004056 virtual bool isCLZForZeroUndef() const { return false; }
Meador Inge5d3fb222012-06-16 03:34:49 +00004057 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Logan Chien57086ce2012-10-10 06:56:20 +00004058 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004059 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004060 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004061 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004062 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004063 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004064 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004065 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004066 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004067 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004068 case 'l': // r0-r7
4069 case 'h': // r8-r15
4070 case 'w': // VFP Floating point register single precision
4071 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004072 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004073 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004074 case 'Q': // A memory address that is a single base register.
4075 Info.setAllowsMemory();
4076 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004077 case 'U': // a memory reference...
4078 switch (Name[1]) {
4079 case 'q': // ...ARMV4 ldrsb
4080 case 'v': // ...VFP load/store (reg+constant offset)
4081 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004082 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004083 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004084 case 'n': // valid address for Neon doubleword vector load/store
4085 case 'm': // valid address for Neon element and structure load/store
4086 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004087 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004088 Info.setAllowsMemory();
4089 Name++;
4090 return true;
4091 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004092 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004093 return false;
4094 }
Evan Chengd863adb2011-06-16 19:13:15 +00004095 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004096 std::string R;
4097 switch (*Constraint) {
4098 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004099 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004100 Constraint++;
4101 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004102 case 'p': // 'p' should be translated to 'r' by default.
4103 R = std::string("r");
4104 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004105 default:
4106 return std::string(1, *Constraint);
4107 }
4108 return R;
4109 }
Bill Wendling9d1ee112012-10-25 23:28:48 +00004110 virtual bool validateConstraintModifier(StringRef Constraint,
4111 const char Modifier,
4112 unsigned Size) const {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004113 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004114 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004115
Bill Wendling9d1ee112012-10-25 23:28:48 +00004116 // Strip off constraint modifiers.
4117 while (Constraint[0] == '=' ||
4118 Constraint[0] == '+' ||
4119 Constraint[0] == '&')
4120 Constraint = Constraint.substr(1);
4121
4122 switch (Constraint[0]) {
4123 default: break;
4124 case 'r': {
4125 switch (Modifier) {
4126 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004127 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004128 case 'q':
4129 // A register of size 32 cannot fit a vector type.
4130 return false;
4131 }
4132 }
4133 }
4134
4135 return true;
4136 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004137 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004138 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004139 return "";
4140 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004141
4142 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
4143 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4144 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004145
4146 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4147 if (RegNo == 0) return 0;
4148 if (RegNo == 1) return 1;
4149 return -1;
4150 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004151};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004152
Rafael Espindolaeb265472013-08-21 21:59:03 +00004153bool ARMTargetInfo::setFPMath(StringRef Name) {
4154 if (Name == "neon") {
4155 FPMath = FP_Neon;
4156 return true;
4157 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4158 Name == "vfp4") {
4159 FPMath = FP_VFP;
4160 return true;
4161 }
4162 return false;
4163}
4164
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004165const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004166 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004167 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004168 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4169
4170 // Float registers
4171 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4172 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4173 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004174 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004175
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004176 // Double registers
4177 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4178 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004179 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4180 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004181
4182 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004183 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4184 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004185};
4186
4187void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004188 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004189 Names = GCCRegNames;
4190 NumNames = llvm::array_lengthof(GCCRegNames);
4191}
4192
4193const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004194 { { "a1" }, "r0" },
4195 { { "a2" }, "r1" },
4196 { { "a3" }, "r2" },
4197 { { "a4" }, "r3" },
4198 { { "v1" }, "r4" },
4199 { { "v2" }, "r5" },
4200 { { "v3" }, "r6" },
4201 { { "v4" }, "r7" },
4202 { { "v5" }, "r8" },
4203 { { "v6", "rfp" }, "r9" },
4204 { { "sl" }, "r10" },
4205 { { "fp" }, "r11" },
4206 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004207 { { "r13" }, "sp" },
4208 { { "r14" }, "lr" },
4209 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004210 // The S, D and Q registers overlap, but aren't really aliases; we
4211 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004212};
4213
4214void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4215 unsigned &NumAliases) const {
4216 Aliases = GCCRegAliases;
4217 NumAliases = llvm::array_lengthof(GCCRegAliases);
4218}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004219
4220const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004221#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004222#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004223 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004224#include "clang/Basic/BuiltinsARM.def"
4225};
Chris Lattner17df24e2008-04-21 18:56:49 +00004226} // end anonymous namespace.
4227
Eli Friedmanf05b7722008-08-20 07:44:10 +00004228namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004229class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00004230 public DarwinTargetInfo<ARMTargetInfo> {
4231protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00004232 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004233 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004234 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004235 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004236
Torok Edwinb2b37c62009-06-30 17:10:35 +00004237public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004238 DarwinARMTargetInfo(const llvm::Triple &Triple)
4239 : DarwinTargetInfo<ARMTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004240 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004241 // iOS always has 64-bit atomic instructions.
4242 // FIXME: This should be based off of the target features in ARMTargetInfo.
4243 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004244
4245 // Darwin on iOS uses a variant of the ARM C++ ABI.
4246 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004247 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004248};
4249} // end anonymous namespace.
4250
Tony Linthicum76329bf2011-12-12 21:14:55 +00004251
4252namespace {
4253// Hexagon abstract base class
4254class HexagonTargetInfo : public TargetInfo {
4255 static const Builtin::Info BuiltinInfo[];
4256 static const char * const GCCRegNames[];
4257 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4258 std::string CPU;
4259public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004260 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004261 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004262 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004263
4264 // {} in inline assembly are packet specifiers, not assembly variant
4265 // specifiers.
4266 NoAsmVariants = true;
4267 }
4268
4269 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4270 unsigned &NumRecords) const {
4271 Records = BuiltinInfo;
4272 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4273 }
4274
4275 virtual bool validateAsmConstraint(const char *&Name,
4276 TargetInfo::ConstraintInfo &Info) const {
4277 return true;
4278 }
4279
4280 virtual void getTargetDefines(const LangOptions &Opts,
4281 MacroBuilder &Builder) const;
4282
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004283 virtual bool hasFeature(StringRef Feature) const {
4284 return Feature == "hexagon";
4285 }
4286
Meador Inge5d3fb222012-06-16 03:34:49 +00004287 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4288 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004289 }
4290 virtual void getGCCRegNames(const char * const *&Names,
4291 unsigned &NumNames) const;
4292 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4293 unsigned &NumAliases) const;
4294 virtual const char *getClobbers() const {
4295 return "";
4296 }
Sebastian Pop86500282012-01-13 20:37:10 +00004297
4298 static const char *getHexagonCPUSuffix(StringRef Name) {
4299 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004300 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004301 .Case("hexagonv5", "5")
Sebastian Pop86500282012-01-13 20:37:10 +00004302 .Default(0);
4303 }
4304
Tony Linthicum76329bf2011-12-12 21:14:55 +00004305 virtual bool setCPU(const std::string &Name) {
Sebastian Pop86500282012-01-13 20:37:10 +00004306 if (!getHexagonCPUSuffix(Name))
4307 return false;
4308
Tony Linthicum76329bf2011-12-12 21:14:55 +00004309 CPU = Name;
4310 return true;
4311 }
4312};
4313
4314void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4315 MacroBuilder &Builder) const {
4316 Builder.defineMacro("qdsp6");
4317 Builder.defineMacro("__qdsp6", "1");
4318 Builder.defineMacro("__qdsp6__", "1");
4319
4320 Builder.defineMacro("hexagon");
4321 Builder.defineMacro("__hexagon", "1");
4322 Builder.defineMacro("__hexagon__", "1");
4323
4324 if(CPU == "hexagonv1") {
4325 Builder.defineMacro("__HEXAGON_V1__");
4326 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4327 if(Opts.HexagonQdsp6Compat) {
4328 Builder.defineMacro("__QDSP6_V1__");
4329 Builder.defineMacro("__QDSP6_ARCH__", "1");
4330 }
4331 }
4332 else if(CPU == "hexagonv2") {
4333 Builder.defineMacro("__HEXAGON_V2__");
4334 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4335 if(Opts.HexagonQdsp6Compat) {
4336 Builder.defineMacro("__QDSP6_V2__");
4337 Builder.defineMacro("__QDSP6_ARCH__", "2");
4338 }
4339 }
4340 else if(CPU == "hexagonv3") {
4341 Builder.defineMacro("__HEXAGON_V3__");
4342 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4343 if(Opts.HexagonQdsp6Compat) {
4344 Builder.defineMacro("__QDSP6_V3__");
4345 Builder.defineMacro("__QDSP6_ARCH__", "3");
4346 }
4347 }
4348 else if(CPU == "hexagonv4") {
4349 Builder.defineMacro("__HEXAGON_V4__");
4350 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4351 if(Opts.HexagonQdsp6Compat) {
4352 Builder.defineMacro("__QDSP6_V4__");
4353 Builder.defineMacro("__QDSP6_ARCH__", "4");
4354 }
4355 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004356 else if(CPU == "hexagonv5") {
4357 Builder.defineMacro("__HEXAGON_V5__");
4358 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4359 if(Opts.HexagonQdsp6Compat) {
4360 Builder.defineMacro("__QDSP6_V5__");
4361 Builder.defineMacro("__QDSP6_ARCH__", "5");
4362 }
4363 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004364}
4365
4366const char * const HexagonTargetInfo::GCCRegNames[] = {
4367 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4368 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4369 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4370 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4371 "p0", "p1", "p2", "p3",
4372 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4373};
4374
4375void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4376 unsigned &NumNames) const {
4377 Names = GCCRegNames;
4378 NumNames = llvm::array_lengthof(GCCRegNames);
4379}
4380
4381
4382const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4383 { { "sp" }, "r29" },
4384 { { "fp" }, "r30" },
4385 { { "lr" }, "r31" },
4386 };
4387
4388void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4389 unsigned &NumAliases) const {
4390 Aliases = GCCRegAliases;
4391 NumAliases = llvm::array_lengthof(GCCRegAliases);
4392}
4393
4394
4395const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4396#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4397#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4398 ALL_LANGUAGES },
4399#include "clang/Basic/BuiltinsHexagon.def"
4400};
4401}
4402
4403
Chris Lattner5ba61f02006-10-14 07:39:34 +00004404namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004405// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4406class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004407 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4408 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004409 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004410public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004411 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004412
Eric Christopher3ff21b32013-10-16 21:26:26 +00004413 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00004414 DiagnosticsEngine &Diags) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004415 SoftFloat = false;
4416 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4417 if (Features[i] == "+soft-float")
4418 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004419 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004420 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00004421 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004422 MacroBuilder &Builder) const {
4423 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004424 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004425
4426 if (SoftFloat)
4427 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004428 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004429
4430 virtual bool hasFeature(StringRef Feature) const {
4431 return llvm::StringSwitch<bool>(Feature)
4432 .Case("softfloat", SoftFloat)
4433 .Case("sparc", true)
4434 .Default(false);
4435 }
4436
Gabor Greif49991682008-02-21 16:29:08 +00004437 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4438 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004439 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00004440 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004441 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4442 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00004443 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004444 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00004445 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004446 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00004447 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004448 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00004449 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004450 // FIXME: Implement!
4451 return false;
Gabor Greif49991682008-02-21 16:29:08 +00004452 }
4453 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004454 // FIXME: Implement!
4455 return "";
Gabor Greif49991682008-02-21 16:29:08 +00004456 }
4457};
4458
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004459const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00004460 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4461 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4462 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4463 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4464};
4465
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004466void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4467 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004468 Names = GCCRegNames;
4469 NumNames = llvm::array_lengthof(GCCRegNames);
4470}
4471
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004472const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004473 { { "g0" }, "r0" },
4474 { { "g1" }, "r1" },
4475 { { "g2" }, "r2" },
4476 { { "g3" }, "r3" },
4477 { { "g4" }, "r4" },
4478 { { "g5" }, "r5" },
4479 { { "g6" }, "r6" },
4480 { { "g7" }, "r7" },
4481 { { "o0" }, "r8" },
4482 { { "o1" }, "r9" },
4483 { { "o2" }, "r10" },
4484 { { "o3" }, "r11" },
4485 { { "o4" }, "r12" },
4486 { { "o5" }, "r13" },
4487 { { "o6", "sp" }, "r14" },
4488 { { "o7" }, "r15" },
4489 { { "l0" }, "r16" },
4490 { { "l1" }, "r17" },
4491 { { "l2" }, "r18" },
4492 { { "l3" }, "r19" },
4493 { { "l4" }, "r20" },
4494 { { "l5" }, "r21" },
4495 { { "l6" }, "r22" },
4496 { { "l7" }, "r23" },
4497 { { "i0" }, "r24" },
4498 { { "i1" }, "r25" },
4499 { { "i2" }, "r26" },
4500 { { "i3" }, "r27" },
4501 { { "i4" }, "r28" },
4502 { { "i5" }, "r29" },
4503 { { "i6", "fp" }, "r30" },
4504 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00004505};
4506
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004507void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4508 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004509 Aliases = GCCRegAliases;
4510 NumAliases = llvm::array_lengthof(GCCRegAliases);
4511}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004512
4513// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4514class SparcV8TargetInfo : public SparcTargetInfo {
4515public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004516 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004517 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004518 }
4519
4520 virtual void getTargetDefines(const LangOptions &Opts,
4521 MacroBuilder &Builder) const {
4522 SparcTargetInfo::getTargetDefines(Opts, Builder);
4523 Builder.defineMacro("__sparcv8");
4524 }
4525};
4526
4527// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4528class SparcV9TargetInfo : public SparcTargetInfo {
4529public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004530 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004531 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00004532 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00004533 // This is an LP64 platform.
4534 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004535
4536 // OpenBSD uses long long for int64_t and intmax_t.
4537 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
4538 IntMaxType = SignedLongLong;
4539 UIntMaxType = UnsignedLongLong;
4540 } else {
4541 IntMaxType = SignedLong;
4542 UIntMaxType = UnsignedLong;
4543 }
4544 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00004545
4546 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
4547 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
4548 LongDoubleWidth = 128;
4549 LongDoubleAlign = 128;
4550 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004551 }
4552
4553 virtual void getTargetDefines(const LangOptions &Opts,
4554 MacroBuilder &Builder) const {
4555 SparcTargetInfo::getTargetDefines(Opts, Builder);
4556 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00004557 Builder.defineMacro("__arch64__");
4558 // Solaris and its derivative AuroraUX don't need these variants, but the
4559 // BSDs do.
4560 if (getTriple().getOS() != llvm::Triple::Solaris &&
4561 getTriple().getOS() != llvm::Triple::AuroraUX) {
4562 Builder.defineMacro("__sparc64__");
4563 Builder.defineMacro("__sparc_v9__");
4564 Builder.defineMacro("__sparcv9__");
4565 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004566 }
4567};
4568
Gabor Greif49991682008-02-21 16:29:08 +00004569} // end anonymous namespace.
4570
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004571namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004572class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4573public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004574 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
4575 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004576 SizeType = UnsignedInt;
4577 PtrDiffType = SignedInt;
4578 }
4579};
Torok Edwinb2b37c62009-06-30 17:10:35 +00004580class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004581public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004582 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
4583 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00004584 SizeType = UnsignedInt;
4585 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004586 }
4587};
4588} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00004589
Chris Lattnerb781dc792008-05-08 05:58:21 +00004590namespace {
Ulrich Weigand47445072013-05-06 16:26:41 +00004591 class SystemZTargetInfo : public TargetInfo {
4592 static const char *const GCCRegNames[];
4593
4594 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004595 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Ulrich Weigand47445072013-05-06 16:26:41 +00004596 TLSSupported = true;
4597 IntWidth = IntAlign = 32;
4598 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
4599 PointerWidth = PointerAlign = 64;
4600 LongDoubleWidth = 128;
4601 LongDoubleAlign = 64;
4602 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4603 MinGlobalAlign = 16;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004604 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 +00004605 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4606 }
4607 virtual void getTargetDefines(const LangOptions &Opts,
4608 MacroBuilder &Builder) const {
4609 Builder.defineMacro("__s390__");
4610 Builder.defineMacro("__s390x__");
4611 Builder.defineMacro("__zarch__");
4612 Builder.defineMacro("__LONG_DOUBLE_128__");
4613 }
4614 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4615 unsigned &NumRecords) const {
4616 // FIXME: Implement.
4617 Records = 0;
4618 NumRecords = 0;
4619 }
4620
4621 virtual void getGCCRegNames(const char *const *&Names,
4622 unsigned &NumNames) const;
4623 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4624 unsigned &NumAliases) const {
4625 // No aliases.
4626 Aliases = 0;
4627 NumAliases = 0;
4628 }
4629 virtual bool validateAsmConstraint(const char *&Name,
4630 TargetInfo::ConstraintInfo &info) const;
4631 virtual const char *getClobbers() const {
4632 // FIXME: Is this really right?
4633 return "";
4634 }
4635 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4636 return TargetInfo::SystemZBuiltinVaList;
4637 }
Richard Sandiford4652d892013-07-19 16:51:51 +00004638 virtual bool setCPU(const std::string &Name) {
4639 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4640 .Case("z10", true)
4641 .Case("z196", true)
4642 .Case("zEC12", true)
4643 .Default(false);
4644
4645 // No need to store the CPU yet. There aren't any CPU-specific
4646 // macros to define.
4647 return CPUKnown;
4648 }
Ulrich Weigand47445072013-05-06 16:26:41 +00004649 };
4650
4651 const char *const SystemZTargetInfo::GCCRegNames[] = {
4652 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4653 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4654 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
4655 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
4656 };
4657
4658 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
4659 unsigned &NumNames) const {
4660 Names = GCCRegNames;
4661 NumNames = llvm::array_lengthof(GCCRegNames);
4662 }
4663
4664 bool SystemZTargetInfo::
4665 validateAsmConstraint(const char *&Name,
4666 TargetInfo::ConstraintInfo &Info) const {
4667 switch (*Name) {
4668 default:
4669 return false;
4670
4671 case 'a': // Address register
4672 case 'd': // Data register (equivalent to 'r')
4673 case 'f': // Floating-point register
4674 Info.setAllowsRegister();
4675 return true;
4676
4677 case 'I': // Unsigned 8-bit constant
4678 case 'J': // Unsigned 12-bit constant
4679 case 'K': // Signed 16-bit constant
4680 case 'L': // Signed 20-bit displacement (on all targets we support)
4681 case 'M': // 0x7fffffff
4682 return true;
4683
4684 case 'Q': // Memory with base and unsigned 12-bit displacement
4685 case 'R': // Likewise, plus an index
4686 case 'S': // Memory with base and signed 20-bit displacement
4687 case 'T': // Likewise, plus an index
4688 Info.setAllowsMemory();
4689 return true;
4690 }
4691 }
4692}
4693
4694namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004695 class MSP430TargetInfo : public TargetInfo {
4696 static const char * const GCCRegNames[];
4697 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004698 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004699 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004700 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00004701 IntWidth = 16; IntAlign = 16;
4702 LongWidth = 32; LongLongWidth = 64;
4703 LongAlign = LongLongAlign = 16;
4704 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004705 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004706 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00004707 IntMaxType = SignedLongLong;
4708 UIntMaxType = UnsignedLongLong;
4709 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004710 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00004711 SigAtomicType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004712 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004713 }
4714 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004715 MacroBuilder &Builder) const {
4716 Builder.defineMacro("MSP430");
4717 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004718 // FIXME: defines for different 'flavours' of MCU
4719 }
4720 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4721 unsigned &NumRecords) const {
4722 // FIXME: Implement.
4723 Records = 0;
4724 NumRecords = 0;
4725 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004726 virtual bool hasFeature(StringRef Feature) const {
4727 return Feature == "msp430";
4728 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004729 virtual void getGCCRegNames(const char * const *&Names,
4730 unsigned &NumNames) const;
4731 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4732 unsigned &NumAliases) const {
4733 // No aliases.
4734 Aliases = 0;
4735 NumAliases = 0;
4736 }
4737 virtual bool validateAsmConstraint(const char *&Name,
4738 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00004739 // No target constraints for now.
4740 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004741 }
4742 virtual const char *getClobbers() const {
4743 // FIXME: Is this really right?
4744 return "";
4745 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004746 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004747 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00004748 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004749 }
4750 };
4751
4752 const char * const MSP430TargetInfo::GCCRegNames[] = {
4753 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4754 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4755 };
4756
4757 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4758 unsigned &NumNames) const {
4759 Names = GCCRegNames;
4760 NumNames = llvm::array_lengthof(GCCRegNames);
4761 }
4762}
4763
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00004764namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004765
Mike Stump11289f42009-09-09 15:08:12 +00004766 // LLVM and Clang cannot be used directly to output native binaries for
4767 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00004768 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00004769 //
4770 // TCE uses the llvm bitcode as input and uses it for generating customized
4771 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00004772 // publicly available in http://tce.cs.tut.fi
4773
Eli Friedman1f191002011-10-07 19:51:42 +00004774 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4775 3, // opencl_global
4776 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00004777 5, // opencl_constant
4778 0, // cuda_device
4779 0, // cuda_constant
4780 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00004781 };
4782
Eli Friedmana9c3d712009-08-19 20:47:07 +00004783 class TCETargetInfo : public TargetInfo{
4784 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004785 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004786 TLSSupported = false;
4787 IntWidth = 32;
4788 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004789 PointerWidth = 32;
4790 IntAlign = 32;
4791 LongAlign = LongLongAlign = 32;
4792 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004793 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004794 SizeType = UnsignedInt;
4795 IntMaxType = SignedLong;
4796 UIntMaxType = UnsignedLong;
4797 IntPtrType = SignedInt;
4798 PtrDiffType = SignedInt;
4799 FloatWidth = 32;
4800 FloatAlign = 32;
4801 DoubleWidth = 32;
4802 DoubleAlign = 32;
4803 LongDoubleWidth = 32;
4804 LongDoubleAlign = 32;
4805 FloatFormat = &llvm::APFloat::IEEEsingle;
4806 DoubleFormat = &llvm::APFloat::IEEEsingle;
4807 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00004808 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
4809 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00004810 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00004811 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004812 }
4813
4814 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004815 MacroBuilder &Builder) const {
4816 DefineStd(Builder, "tce", Opts);
4817 Builder.defineMacro("__TCE__");
4818 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00004819 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004820 virtual bool hasFeature(StringRef Feature) const {
4821 return Feature == "tce";
4822 }
4823
Eli Friedmana9c3d712009-08-19 20:47:07 +00004824 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4825 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00004826 virtual const char *getClobbers() const {
4827 return "";
4828 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004829 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4830 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004831 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00004832 virtual void getGCCRegNames(const char * const *&Names,
4833 unsigned &NumNames) const {}
4834 virtual bool validateAsmConstraint(const char *&Name,
4835 TargetInfo::ConstraintInfo &info) const {
4836 return true;
4837 }
4838 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4839 unsigned &NumAliases) const {}
4840 };
4841}
4842
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004843namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004844class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00004845 virtual void setDescriptionString() = 0;
4846
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004847 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004848 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00004849 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00004850 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004851 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00004852 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004853 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00004854 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004855 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004856 enum DspRevEnum {
4857 NoDSP, DSP1, DSP2
4858 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00004859 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004860
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004861protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00004862 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004863 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004864
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004865public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004866 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
4867 const std::string &CPUStr)
4868 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004869 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004870 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004871
Eric Christopher0b26a612010-03-02 02:41:08 +00004872 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004873 virtual bool setABI(const std::string &Name) = 0;
Eric Christopher0b26a612010-03-02 02:41:08 +00004874 virtual bool setCPU(const std::string &Name) {
4875 CPU = Name;
4876 return true;
4877 }
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00004878 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christopher0b26a612010-03-02 02:41:08 +00004879 Features[ABI] = true;
4880 Features[CPU] = true;
4881 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004882
Simon Atanasyan16ee0052012-08-29 19:59:32 +00004883 virtual void getTargetDefines(const LangOptions &Opts,
4884 MacroBuilder &Builder) const {
Simon Atanasyan683535b2012-08-29 19:14:58 +00004885 DefineStd(Builder, "mips", Opts);
4886 Builder.defineMacro("_mips");
4887 Builder.defineMacro("__REGISTER_PREFIX__", "");
4888
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004889 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004890 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004891 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004892 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004893 case SoftFloat:
4894 Builder.defineMacro("__mips_soft_float", Twine(1));
4895 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004896 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00004897
Simon Atanasyan16071912013-04-14 14:07:30 +00004898 if (IsSingleFloat)
4899 Builder.defineMacro("__mips_single_float", Twine(1));
4900
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004901 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
4902 Builder.defineMacro("_MIPS_FPSET",
4903 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
4904
Simon Atanasyan72244b62012-07-05 16:06:06 +00004905 if (IsMips16)
4906 Builder.defineMacro("__mips16", Twine(1));
4907
Simon Atanasyan60777612013-04-14 14:07:51 +00004908 if (IsMicromips)
4909 Builder.defineMacro("__mips_micromips", Twine(1));
4910
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004911 if (IsNan2008)
4912 Builder.defineMacro("__mips_nan2008", Twine(1));
4913
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004914 switch (DspRev) {
4915 default:
4916 break;
4917 case DSP1:
4918 Builder.defineMacro("__mips_dsp_rev", Twine(1));
4919 Builder.defineMacro("__mips_dsp", Twine(1));
4920 break;
4921 case DSP2:
4922 Builder.defineMacro("__mips_dsp_rev", Twine(2));
4923 Builder.defineMacro("__mips_dspr2", Twine(1));
4924 Builder.defineMacro("__mips_dsp", Twine(1));
4925 break;
4926 }
4927
Jack Carter44ff1e52013-08-12 17:20:29 +00004928 if (HasMSA)
4929 Builder.defineMacro("__mips_msa", Twine(1));
4930
Simon Atanasyan26f19672012-04-05 19:28:31 +00004931 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
4932 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
4933 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00004934
4935 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
4936 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004937 }
4938
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004939 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4940 unsigned &NumRecords) const {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004941 Records = BuiltinInfo;
4942 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004943 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004944 virtual bool hasFeature(StringRef Feature) const {
Akira Hatanaka618b2982013-10-29 19:00:35 +00004945 return llvm::StringSwitch<bool>(Feature)
4946 .Case("mips", true)
4947 .Case("fp64", HasFP64)
4948 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004949 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004950 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4951 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004952 }
4953 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004954 unsigned &NumNames) const {
Daniel Sanders8b59af12013-11-12 12:56:01 +00004955 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00004956 // CPU register names
4957 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004958 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
4959 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
4960 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00004961 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
4962 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004963 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
4964 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
4965 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
4966 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00004967 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004968 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00004969 "$fcc5","$fcc6","$fcc7",
4970 // MSA register names
4971 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
4972 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
4973 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
4974 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
4975 // MSA control register names
4976 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
4977 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004978 };
4979 Names = GCCRegNames;
4980 NumNames = llvm::array_lengthof(GCCRegNames);
4981 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004982 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004983 unsigned &NumAliases) const = 0;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004984 virtual bool validateAsmConstraint(const char *&Name,
4985 TargetInfo::ConstraintInfo &Info) const {
4986 switch (*Name) {
4987 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00004988 return false;
4989
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004990 case 'r': // CPU registers.
4991 case 'd': // Equivalent to "r" unless generating MIPS16 code.
4992 case 'y': // Equivalent to "r", backwards compatibility only.
4993 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00004994 case 'c': // $25 for indirect jumps
4995 case 'l': // lo register
4996 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004997 Info.setAllowsRegister();
4998 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00004999 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005000 Info.setAllowsMemory();
5001 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005002 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005003 }
5004
5005 virtual const char *getClobbers() const {
5006 // FIXME: Implement!
5007 return "";
5008 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005009
Eric Christopher3ff21b32013-10-16 21:26:26 +00005010 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00005011 DiagnosticsEngine &Diags) {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005012 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005013 IsMicromips = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005014 IsNan2008 = false;
Simon Atanasyan16071912013-04-14 14:07:30 +00005015 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005016 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005017 DspRev = NoDSP;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005018 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005019
5020 for (std::vector<std::string>::iterator it = Features.begin(),
5021 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005022 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005023 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005024 else if (*it == "+soft-float")
5025 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005026 else if (*it == "+mips16")
5027 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005028 else if (*it == "+micromips")
5029 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005030 else if (*it == "+dsp")
5031 DspRev = std::max(DspRev, DSP1);
5032 else if (*it == "+dspr2")
5033 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005034 else if (*it == "+msa")
5035 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005036 else if (*it == "+fp64")
5037 HasFP64 = true;
5038 else if (*it == "-fp64")
5039 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005040 else if (*it == "+nan2008")
5041 IsNan2008 = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005042 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005043
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005044 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005045 std::vector<std::string>::iterator it =
5046 std::find(Features.begin(), Features.end(), "+soft-float");
5047 if (it != Features.end())
5048 Features.erase(it);
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005049 it = std::find(Features.begin(), Features.end(), "+nan2008");
5050 if (it != Features.end())
5051 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005052
Akira Hatanaka9064e362013-10-29 18:30:33 +00005053 setDescriptionString();
5054
Rafael Espindolaeb265472013-08-21 21:59:03 +00005055 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005056 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005057
5058 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
5059 if (RegNo == 0) return 4;
5060 if (RegNo == 1) return 5;
5061 return -1;
5062 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005063};
5064
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005065const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5066#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5067#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5068 ALL_LANGUAGES },
5069#include "clang/Basic/BuiltinsMips.def"
5070};
5071
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005072class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005073public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005074 Mips32TargetInfoBase(const llvm::Triple &Triple)
5075 : MipsTargetInfoBase(Triple, "o32", "mips32") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005076 SizeType = UnsignedInt;
5077 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005078 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005079 }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005080 virtual bool setABI(const std::string &Name) {
5081 if ((Name == "o32") || (Name == "eabi")) {
5082 ABI = Name;
5083 return true;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005084 } else if (Name == "32") {
5085 ABI = "o32";
5086 return true;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005087 } else
5088 return false;
5089 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005090 virtual void getTargetDefines(const LangOptions &Opts,
5091 MacroBuilder &Builder) const {
5092 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005093
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005094 if (ABI == "o32") {
5095 Builder.defineMacro("__mips_o32");
5096 Builder.defineMacro("_ABIO32", "1");
5097 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5098 }
5099 else if (ABI == "eabi")
5100 Builder.defineMacro("__mips_eabi");
5101 else
David Blaikie83d382b2011-09-23 05:06:16 +00005102 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005103 }
5104 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5105 unsigned &NumAliases) const {
5106 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5107 { { "at" }, "$1" },
5108 { { "v0" }, "$2" },
5109 { { "v1" }, "$3" },
5110 { { "a0" }, "$4" },
5111 { { "a1" }, "$5" },
5112 { { "a2" }, "$6" },
5113 { { "a3" }, "$7" },
5114 { { "t0" }, "$8" },
5115 { { "t1" }, "$9" },
5116 { { "t2" }, "$10" },
5117 { { "t3" }, "$11" },
5118 { { "t4" }, "$12" },
5119 { { "t5" }, "$13" },
5120 { { "t6" }, "$14" },
5121 { { "t7" }, "$15" },
5122 { { "s0" }, "$16" },
5123 { { "s1" }, "$17" },
5124 { { "s2" }, "$18" },
5125 { { "s3" }, "$19" },
5126 { { "s4" }, "$20" },
5127 { { "s5" }, "$21" },
5128 { { "s6" }, "$22" },
5129 { { "s7" }, "$23" },
5130 { { "t8" }, "$24" },
5131 { { "t9" }, "$25" },
5132 { { "k0" }, "$26" },
5133 { { "k1" }, "$27" },
5134 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005135 { { "sp","$sp" }, "$29" },
5136 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005137 { { "ra" }, "$31" }
5138 };
5139 Aliases = GCCRegAliases;
5140 NumAliases = llvm::array_lengthof(GCCRegAliases);
5141 }
5142};
5143
5144class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005145 virtual void setDescriptionString() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005146 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005147 }
5148
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005149public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005150 Mips32EBTargetInfo(const llvm::Triple &Triple)
5151 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005152 }
5153 virtual void getTargetDefines(const LangOptions &Opts,
5154 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005155 DefineStd(Builder, "MIPSEB", Opts);
5156 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005157 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005158 }
5159};
5160
5161class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005162 virtual void setDescriptionString() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005163 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005164 }
5165
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005166public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005167 Mips32ELTargetInfo(const llvm::Triple &Triple)
5168 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005169 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005170 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005171 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005172 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005173 DefineStd(Builder, "MIPSEL", Opts);
5174 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005175 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005176 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005177};
Akira Hatanakabef17452011-09-20 19:21:49 +00005178
5179class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005180public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005181 Mips64TargetInfoBase(const llvm::Triple &Triple)
5182 : MipsTargetInfoBase(Triple, "n64", "mips64") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005183 LongWidth = LongAlign = 64;
5184 PointerWidth = PointerAlign = 64;
5185 LongDoubleWidth = LongDoubleAlign = 128;
5186 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005187 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5188 LongDoubleWidth = LongDoubleAlign = 64;
5189 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5190 }
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005191 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005192 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005193 }
Akira Hatanakabef17452011-09-20 19:21:49 +00005194 virtual bool setABI(const std::string &Name) {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005195 if (Name == "n32") {
5196 LongWidth = LongAlign = 32;
5197 PointerWidth = PointerAlign = 32;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005198 ABI = Name;
5199 return true;
5200 } else if (Name == "n64") {
5201 ABI = Name;
5202 return true;
5203 } else if (Name == "64") {
5204 ABI = "n64";
5205 return true;
5206 } else
5207 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005208 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005209 virtual void getTargetDefines(const LangOptions &Opts,
5210 MacroBuilder &Builder) const {
5211 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005212
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005213 Builder.defineMacro("__mips64");
5214 Builder.defineMacro("__mips64__");
5215
Akira Hatanakabef17452011-09-20 19:21:49 +00005216 if (ABI == "n32") {
5217 Builder.defineMacro("__mips_n32");
5218 Builder.defineMacro("_ABIN32", "2");
5219 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5220 }
5221 else if (ABI == "n64") {
5222 Builder.defineMacro("__mips_n64");
5223 Builder.defineMacro("_ABI64", "3");
5224 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5225 }
5226 else
David Blaikie83d382b2011-09-23 05:06:16 +00005227 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005228 }
5229 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5230 unsigned &NumAliases) const {
5231 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5232 { { "at" }, "$1" },
5233 { { "v0" }, "$2" },
5234 { { "v1" }, "$3" },
5235 { { "a0" }, "$4" },
5236 { { "a1" }, "$5" },
5237 { { "a2" }, "$6" },
5238 { { "a3" }, "$7" },
5239 { { "a4" }, "$8" },
5240 { { "a5" }, "$9" },
5241 { { "a6" }, "$10" },
5242 { { "a7" }, "$11" },
5243 { { "t0" }, "$12" },
5244 { { "t1" }, "$13" },
5245 { { "t2" }, "$14" },
5246 { { "t3" }, "$15" },
5247 { { "s0" }, "$16" },
5248 { { "s1" }, "$17" },
5249 { { "s2" }, "$18" },
5250 { { "s3" }, "$19" },
5251 { { "s4" }, "$20" },
5252 { { "s5" }, "$21" },
5253 { { "s6" }, "$22" },
5254 { { "s7" }, "$23" },
5255 { { "t8" }, "$24" },
5256 { { "t9" }, "$25" },
5257 { { "k0" }, "$26" },
5258 { { "k1" }, "$27" },
5259 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005260 { { "sp","$sp" }, "$29" },
5261 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005262 { { "ra" }, "$31" }
5263 };
5264 Aliases = GCCRegAliases;
5265 NumAliases = llvm::array_lengthof(GCCRegAliases);
5266 }
5267};
5268
5269class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005270 virtual void setDescriptionString() {
5271 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005272 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 +00005273 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005274 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005275
Akira Hatanakabef17452011-09-20 19:21:49 +00005276 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005277
Akira Hatanakabef17452011-09-20 19:21:49 +00005278public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005279 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005280 : Mips64TargetInfoBase(Triple) {}
Akira Hatanakabef17452011-09-20 19:21:49 +00005281 virtual void getTargetDefines(const LangOptions &Opts,
5282 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00005283 DefineStd(Builder, "MIPSEB", Opts);
5284 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005285 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005286 }
5287};
5288
5289class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005290 virtual void setDescriptionString() {
5291 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005292 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 +00005293 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005294 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005295 }
5296public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005297 Mips64ELTargetInfo(const llvm::Triple &Triple)
5298 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005299 // Default ABI is n64.
5300 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005301 }
5302 virtual void getTargetDefines(const LangOptions &Opts,
5303 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00005304 DefineStd(Builder, "MIPSEL", Opts);
5305 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005306 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005307 }
5308};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005309} // end anonymous namespace.
5310
Ivan Krasindd7403e2011-08-24 20:22:22 +00005311namespace {
5312class PNaClTargetInfo : public TargetInfo {
5313public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005314 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005315 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005316 this->UserLabelPrefix = "";
5317 this->LongAlign = 32;
5318 this->LongWidth = 32;
5319 this->PointerAlign = 32;
5320 this->PointerWidth = 32;
5321 this->IntMaxType = TargetInfo::SignedLongLong;
5322 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5323 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005324 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005325 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005326 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005327 this->SizeType = TargetInfo::UnsignedInt;
5328 this->PtrDiffType = TargetInfo::SignedInt;
5329 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005330 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005331 }
5332
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005333 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005334 }
5335 virtual void getArchDefines(const LangOptions &Opts,
5336 MacroBuilder &Builder) const {
5337 Builder.defineMacro("__le32__");
5338 Builder.defineMacro("__pnacl__");
5339 }
5340 virtual void getTargetDefines(const LangOptions &Opts,
5341 MacroBuilder &Builder) const {
Jan Wen Voung1d4c2d92012-03-29 00:05:59 +00005342 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasindd7403e2011-08-24 20:22:22 +00005343 getArchDefines(Opts, Builder);
5344 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005345 virtual bool hasFeature(StringRef Feature) const {
5346 return Feature == "pnacl";
5347 }
Ivan Krasindd7403e2011-08-24 20:22:22 +00005348 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5349 unsigned &NumRecords) const {
5350 }
Meador Inge5d3fb222012-06-16 03:34:49 +00005351 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5352 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005353 }
5354 virtual void getGCCRegNames(const char * const *&Names,
5355 unsigned &NumNames) const;
5356 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5357 unsigned &NumAliases) const;
5358 virtual bool validateAsmConstraint(const char *&Name,
5359 TargetInfo::ConstraintInfo &Info) const {
5360 return false;
5361 }
5362
5363 virtual const char *getClobbers() const {
5364 return "";
5365 }
5366};
5367
5368void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5369 unsigned &NumNames) const {
5370 Names = NULL;
5371 NumNames = 0;
5372}
5373
5374void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5375 unsigned &NumAliases) const {
5376 Aliases = NULL;
5377 NumAliases = 0;
5378}
5379} // end anonymous namespace.
5380
Guy Benyeib798fc92012-12-11 21:38:14 +00005381namespace {
5382 static const unsigned SPIRAddrSpaceMap[] = {
5383 1, // opencl_global
5384 3, // opencl_local
5385 2, // opencl_constant
5386 0, // cuda_device
5387 0, // cuda_constant
5388 0 // cuda_shared
5389 };
5390 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00005391 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005392 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005393 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5394 "SPIR target must use unknown OS");
5395 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5396 "SPIR target must use unknown environment type");
5397 BigEndian = false;
5398 TLSSupported = false;
5399 LongWidth = LongAlign = 64;
5400 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005401 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00005402 // Define available target features
5403 // These must be defined in sorted order!
5404 NoAsmVariants = true;
5405 }
5406 virtual void getTargetDefines(const LangOptions &Opts,
5407 MacroBuilder &Builder) const {
5408 DefineStd(Builder, "SPIR", Opts);
5409 }
5410 virtual bool hasFeature(StringRef Feature) const {
5411 return Feature == "spir";
5412 }
5413
5414 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5415 unsigned &NumRecords) const {}
5416 virtual const char *getClobbers() const {
5417 return "";
5418 }
5419 virtual void getGCCRegNames(const char * const *&Names,
5420 unsigned &NumNames) const {}
5421 virtual bool validateAsmConstraint(const char *&Name,
5422 TargetInfo::ConstraintInfo &info) const {
5423 return true;
5424 }
5425 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5426 unsigned &NumAliases) const {}
5427 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5428 return TargetInfo::VoidPtrBuiltinVaList;
5429 }
5430 };
5431
5432
5433 class SPIR32TargetInfo : public SPIRTargetInfo {
5434 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005435 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005436 PointerWidth = PointerAlign = 32;
5437 SizeType = TargetInfo::UnsignedInt;
5438 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5439 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00005440 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
5441 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005442 }
5443 virtual void getTargetDefines(const LangOptions &Opts,
5444 MacroBuilder &Builder) const {
5445 DefineStd(Builder, "SPIR32", Opts);
5446 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005447 };
5448
5449 class SPIR64TargetInfo : public SPIRTargetInfo {
5450 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005451 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005452 PointerWidth = PointerAlign = 64;
5453 SizeType = TargetInfo::UnsignedLong;
5454 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005455 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
5456 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005457 }
5458 virtual void getTargetDefines(const LangOptions &Opts,
5459 MacroBuilder &Builder) const {
5460 DefineStd(Builder, "SPIR64", Opts);
5461 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005462 };
5463}
5464
Robert Lytton0e076492013-08-13 09:43:10 +00005465namespace {
5466class XCoreTargetInfo : public TargetInfo {
5467 static const Builtin::Info BuiltinInfo[];
5468public:
5469 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5470 BigEndian = false;
5471 NoAsmVariants = true;
5472 LongLongAlign = 32;
5473 SuitableAlign = 32;
5474 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00005475 SizeType = UnsignedInt;
5476 PtrDiffType = SignedInt;
5477 IntPtrType = SignedInt;
5478 WCharType = UnsignedChar;
5479 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00005480 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005481 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 +00005482 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00005483 }
5484 virtual void getTargetDefines(const LangOptions &Opts,
5485 MacroBuilder &Builder) const {
5486 Builder.defineMacro("__XS1B__");
5487 }
5488 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5489 unsigned &NumRecords) const {
5490 Records = BuiltinInfo;
5491 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5492 }
5493 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5494 return TargetInfo::VoidPtrBuiltinVaList;
5495 }
5496 virtual const char *getClobbers() const {
5497 return "";
5498 }
5499 virtual void getGCCRegNames(const char * const *&Names,
5500 unsigned &NumNames) const {
5501 static const char * const GCCRegNames[] = {
5502 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5503 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
5504 };
5505 Names = GCCRegNames;
5506 NumNames = llvm::array_lengthof(GCCRegNames);
5507 }
5508 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5509 unsigned &NumAliases) const {
5510 Aliases = NULL;
5511 NumAliases = 0;
5512 }
5513 virtual bool validateAsmConstraint(const char *&Name,
5514 TargetInfo::ConstraintInfo &Info) const {
5515 return false;
5516 }
5517};
5518
5519const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
5520#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5521#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5522 ALL_LANGUAGES },
5523#include "clang/Basic/BuiltinsXCore.def"
5524};
5525} // end anonymous namespace.
5526
Ivan Krasindd7403e2011-08-24 20:22:22 +00005527
Chris Lattner5ba61f02006-10-14 07:39:34 +00005528//===----------------------------------------------------------------------===//
5529// Driver code
5530//===----------------------------------------------------------------------===//
5531
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005532static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00005533 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00005534
Daniel Dunbar52322032009-08-18 05:47:58 +00005535 switch (Triple.getArch()) {
5536 default:
5537 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00005538
Robert Lytton0e076492013-08-13 09:43:10 +00005539 case llvm::Triple::xcore:
5540 return new XCoreTargetInfo(Triple);
5541
Tony Linthicum76329bf2011-12-12 21:14:55 +00005542 case llvm::Triple::hexagon:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005543 return new HexagonTargetInfo(Triple);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005544
Tim Northover9bb857a2013-01-31 12:13:10 +00005545 case llvm::Triple::aarch64:
5546 switch (os) {
5547 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005548 return new LinuxTargetInfo<AArch64TargetInfo>(Triple);
Joerg Sonnenberger98534392014-01-13 18:25:15 +00005549 case llvm::Triple::NetBSD:
5550 return new NetBSDTargetInfo<AArch64TargetInfo>(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005551 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005552 return new AArch64TargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005553 }
5554
Daniel Dunbar52322032009-08-18 05:47:58 +00005555 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00005556 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00005557 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005558 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005559
Daniel Dunbar52322032009-08-18 05:47:58 +00005560 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00005561 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005562 return new LinuxTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005563 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005564 return new FreeBSDTargetInfo<ARMTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005565 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005566 return new NetBSDTargetInfo<ARMTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005567 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005568 return new OpenBSDTargetInfo<ARMTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005569 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005570 return new BitrigTargetInfo<ARMTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005571 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005572 return new RTEMSTargetInfo<ARMTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005573 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005574 return new NaClTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005575 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005576 return new ARMTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005577 }
Eli Friedmanb5366062008-05-20 14:21:01 +00005578
Daniel Dunbar52322032009-08-18 05:47:58 +00005579 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005580 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00005581
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005582 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005583 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005584 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005585 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005586 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005587 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005588 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005589 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005590 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005591 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005592 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005593 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005594 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005595
5596 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005597 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005598 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005599 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005600 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005601 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005602 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005603 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005604 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005605 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00005606 case llvm::Triple::NaCl:
5607 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005608 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005609 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005610 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005611
Akira Hatanakabef17452011-09-20 19:21:49 +00005612 case llvm::Triple::mips64:
5613 switch (os) {
5614 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005615 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005616 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005617 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005618 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005619 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005620 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005621 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005622 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005623 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005624 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005625 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005626 }
5627
5628 case llvm::Triple::mips64el:
5629 switch (os) {
5630 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005631 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005632 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005633 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005634 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005635 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005636 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005637 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005638 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005639 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005640 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005641 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005642 }
5643
Ivan Krasindd7403e2011-08-24 20:22:22 +00005644 case llvm::Triple::le32:
5645 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00005646 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005647 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00005648 default:
5649 return NULL;
5650 }
5651
Daniel Dunbar52322032009-08-18 05:47:58 +00005652 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005653 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005654 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005655 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005656 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005657 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005658 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005659 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005660 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005661 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005662 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005663 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005664 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005665 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005666 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005667 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005668 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005669
5670 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005671 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005672 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005673 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005674 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005675 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005676 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005677 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005678 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005679 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005680 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005681 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005682 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005683 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005684 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005685
Bill Schmidt778d3872013-07-26 01:36:11 +00005686 case llvm::Triple::ppc64le:
5687 switch (os) {
5688 case llvm::Triple::Linux:
5689 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
5690 default:
5691 return new PPC64TargetInfo(Triple);
5692 }
5693
Peter Collingbournec947aae2012-05-20 23:28:41 +00005694 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005695 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005696 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005697 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005698
Eli Friedmand13b41e2012-10-12 23:32:00 +00005699 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005700 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00005701
Daniel Dunbar52322032009-08-18 05:47:58 +00005702 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005703 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005704 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005705 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005706 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005707 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005708 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005709 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005710 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005711 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005712 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005713 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005714 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005715 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005716 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005717 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005718 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005719
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005720 case llvm::Triple::sparcv9:
5721 switch (os) {
5722 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005723 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005724 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005725 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005726 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005727 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005728 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005729 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005730 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005731 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005732 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005733 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005734 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005735 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005736 }
5737
Ulrich Weigand47445072013-05-06 16:26:41 +00005738 case llvm::Triple::systemz:
5739 switch (os) {
5740 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005741 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005742 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005743 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005744 }
5745
Eli Friedmana9c3d712009-08-19 20:47:07 +00005746 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005747 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00005748
Daniel Dunbar52322032009-08-18 05:47:58 +00005749 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005750 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005751 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005752
Daniel Dunbar52322032009-08-18 05:47:58 +00005753 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005754 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005755 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005756 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005757 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005758 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005759 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005760 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005761 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005762 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005763 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005764 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005765 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005766 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005767 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005768 case llvm::Triple::KFreeBSD:
5769 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005770 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005771 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005772 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005773 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005774 case llvm::Triple::Cygwin:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005775 return new CygwinX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005776 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005777 return new MinGWX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005778 case llvm::Triple::Win32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005779 return new VisualStudioWindowsX86_32TargetInfo(Triple);
Chris Lattnerb986aba2010-04-11 19:29:39 +00005780 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005781 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005782 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005783 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005784 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005785 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005786 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005787 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005788 }
5789
5790 case llvm::Triple::x86_64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005791 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005792 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005793
Daniel Dunbar52322032009-08-18 05:47:58 +00005794 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005795 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005796 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005797 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005798 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00005799 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005800 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005801 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005802 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005803 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005804 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005805 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005806 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005807 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005808 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005809 case llvm::Triple::KFreeBSD:
5810 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005811 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005812 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00005813 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005814 return new MinGWX86_64TargetInfo(Triple);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00005815 case llvm::Triple::Win32: // This is what Triple.h supports now.
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005816 return new VisualStudioWindowsX86_64TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005817 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005818 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005819 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005820 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005821 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005822
5823 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005824 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005825 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005826 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005827 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005828 }
5829 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005830 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005831 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005832 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005833 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005834 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005835 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00005836}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005837
5838/// CreateTargetInfo - Return the target info object for the specified target
5839/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00005840TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregorf8715de2012-11-16 04:24:59 +00005841 TargetOptions *Opts) {
5842 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005843
5844 // Construct the target
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005845 OwningPtr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005846 if (!Target) {
5847 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5848 return 0;
5849 }
Douglas Gregorbc10b9f2012-10-15 16:45:32 +00005850 Target->setTargetOpts(Opts);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005851
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005852 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005853 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5854 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005855 return 0;
5856 }
5857
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005858 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005859 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5860 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005861 return 0;
5862 }
5863
Rafael Espindolaeb265472013-08-21 21:59:03 +00005864 // Set the fp math unit.
5865 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
5866 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
5867 return 0;
5868 }
5869
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005870 // Compute the default target features, we need the target to handle this
5871 // because features may have dependencies on one another.
5872 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005873 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005874
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005875 // Apply the user specified deltas.
5876 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
5877 I < N; ++I) {
5878 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00005879 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005880 bool Enabled = Name[0] == '+';
5881 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005882 }
5883
5884 // Add the features to the compile options.
5885 //
5886 // FIXME: If we are completely confident that we have the right set, we only
5887 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005888 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005889 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5890 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00005891 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00005892 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Rafael Espindolaeb265472013-08-21 21:59:03 +00005893 return 0;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005894
5895 return Target.take();
5896}