blob: 3c7592f6a93de693c69488a079648d8b285de4a8 [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__");
93 Builder.defineMacro("__MACH__");
94 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000095 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
Will Dietzf54319c2013-01-18 11:30:38 +000097 if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000098
John McCall5d36a8c2011-06-16 00:03:19 +000099 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000100 // __weak is always defined, for use in blocks and with objc pointers.
101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000102
John McCall31168b02011-06-15 23:02:42 +0000103 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000104 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
106 else
107 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000108
John McCall31168b02011-06-15 23:02:42 +0000109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
110 // allow this in C, since one might have block pointers in structs that
111 // are used in pure C code and in Objective-C ARC.
112 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000113 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000114
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000115 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000116 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000117 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000119
120 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000121 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000122
Daniel Dunbarecf13562011-04-19 21:40:34 +0000123 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000124 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000125 if (Triple.isMacOSX()) {
126 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000127 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000129 Triple.getOSVersion(Maj, Min, Rev);
130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000131 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000132
Sebastian Pop422377c2012-01-20 22:01:23 +0000133 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000134 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
136 if (PlatformName == "win32") {
137 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138 return;
139 }
140
Jim Grosbache2bfac42013-11-19 20:18:39 +0000141 // If there's an environment specified in the triple, that means we're dealing
142 // with an embedded variant of some sort and don't want the platform
143 // version-min defines, so only add them if there's not one.
144 if (Triple.getEnvironmentName().empty()) {
145 // Set the appropriate OS version define.
146 if (Triple.isiOS()) {
147 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
148 char Str[6];
149 Str[0] = '0' + Maj;
150 Str[1] = '0' + (Min / 10);
151 Str[2] = '0' + (Min % 10);
152 Str[3] = '0' + (Rev / 10);
153 Str[4] = '0' + (Rev % 10);
154 Str[5] = '\0';
155 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
156 Str);
157 } else {
158 // Note that the Driver allows versions which aren't representable in the
159 // define (because we only get a single digit for the minor and micro
160 // revision numbers). So, we limit them to the maximum representable
161 // version.
162 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
163 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
164 char Str[5];
165 Str[0] = '0' + (Maj / 10);
166 Str[1] = '0' + (Maj % 10);
167 Str[2] = '0' + std::min(Min, 9U);
168 Str[3] = '0' + std::min(Rev, 9U);
169 Str[4] = '\0';
170 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
171 }
Daniel Dunbar497ff132009-04-10 19:52:24 +0000172 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000173
174 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000175}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000176
Chris Lattner30ba6742009-08-10 19:03:04 +0000177namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000178template<typename Target>
179class DarwinTargetInfo : public OSTargetInfo<Target> {
180protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000181 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000182 MacroBuilder &Builder) const {
Eric Christopher0c912c52011-07-07 22:55:26 +0000183 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000184 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000185 }
Mike Stump11289f42009-09-09 15:08:12 +0000186
Torok Edwinb2b37c62009-06-30 17:10:35 +0000187public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000188 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
189 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
190 this->MCountName = "\01mcount";
191 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000192
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000193 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner30ba6742009-08-10 19:03:04 +0000194 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000195 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000196 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000197 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000198 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000199 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000200 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000201
Anders Carlsson851318a2010-06-08 22:47:50 +0000202 virtual const char *getStaticInitSectionSpecifier() const {
203 // FIXME: We should return 0 when building kexts.
204 return "__TEXT,__StaticInit,regular,pure_instructions";
205 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000206
John McCalleed64c72012-01-29 01:20:30 +0000207 /// Darwin does not support protected visibility. Darwin's "default"
208 /// is very similar to ELF's "protected"; Darwin requires a "weak"
209 /// attribute on declarations that can be dynamically replaced.
210 virtual bool hasProtectedVisibility() const {
211 return false;
212 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000213};
214
Chris Lattner30ba6742009-08-10 19:03:04 +0000215
Torok Edwinb2b37c62009-06-30 17:10:35 +0000216// DragonFlyBSD Target
217template<typename Target>
218class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
219protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000220 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000221 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000223 Builder.defineMacro("__DragonFly__");
224 Builder.defineMacro("__DragonFly_cc_version", "100001");
225 Builder.defineMacro("__ELF__");
226 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
227 Builder.defineMacro("__tune_i386__");
228 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000229 }
230public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000231 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
232 : OSTargetInfo<Target>(Triple) {
233 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000234
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000235 switch (Triple.getArch()) {
236 default:
237 case llvm::Triple::x86:
238 case llvm::Triple::x86_64:
239 this->MCountName = ".mcount";
240 break;
241 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000242 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243};
244
245// FreeBSD Target
246template<typename Target>
247class FreeBSDTargetInfo : public OSTargetInfo<Target> {
248protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000249 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000250 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000251 // FreeBSD defines; list based off of gcc output
252
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000253 unsigned Release = Triple.getOSMajorVersion();
254 if (Release == 0U)
255 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000256
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000257 Builder.defineMacro("__FreeBSD__", Twine(Release));
258 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000259 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
260 DefineStd(Builder, "unix", Opts);
261 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000262
263 // On FreeBSD, wchar_t contains the number of the code point as
264 // used by the character set of the locale. These character sets are
265 // not necessarily a superset of ASCII.
266 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000267 }
268public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000269 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
270 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000271
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000272 switch (Triple.getArch()) {
273 default:
274 case llvm::Triple::x86:
275 case llvm::Triple::x86_64:
276 this->MCountName = ".mcount";
277 break;
278 case llvm::Triple::mips:
279 case llvm::Triple::mipsel:
280 case llvm::Triple::ppc:
281 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000282 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000283 this->MCountName = "_mcount";
284 break;
285 case llvm::Triple::arm:
286 this->MCountName = "__mcount";
287 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000288 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000289 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000290};
291
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000292// GNU/kFreeBSD Target
293template<typename Target>
294class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
295protected:
296 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
297 MacroBuilder &Builder) const {
298 // GNU/kFreeBSD defines; list based off of gcc output
299
300 DefineStd(Builder, "unix", Opts);
301 Builder.defineMacro("__FreeBSD_kernel__");
302 Builder.defineMacro("__GLIBC__");
303 Builder.defineMacro("__ELF__");
304 if (Opts.POSIXThreads)
305 Builder.defineMacro("_REENTRANT");
306 if (Opts.CPlusPlus)
307 Builder.defineMacro("_GNU_SOURCE");
308 }
309public:
Sylvestre Ledru15832282013-09-05 13:58:07 +0000310 KFreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000311 this->UserLabelPrefix = "";
312 }
313};
314
Chris Lattner3e2ee142010-07-07 16:01:42 +0000315// Minix Target
316template<typename Target>
317class MinixTargetInfo : public OSTargetInfo<Target> {
318protected:
319 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
320 MacroBuilder &Builder) const {
321 // Minix defines
322
323 Builder.defineMacro("__minix", "3");
324 Builder.defineMacro("_EM_WSIZE", "4");
325 Builder.defineMacro("_EM_PSIZE", "4");
326 Builder.defineMacro("_EM_SSIZE", "2");
327 Builder.defineMacro("_EM_LSIZE", "4");
328 Builder.defineMacro("_EM_FSIZE", "4");
329 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000330 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000331 DefineStd(Builder, "unix", Opts);
332 }
333public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000334 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
335 this->UserLabelPrefix = "";
336 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000337};
338
Torok Edwinb2b37c62009-06-30 17:10:35 +0000339// Linux target
340template<typename Target>
341class LinuxTargetInfo : public OSTargetInfo<Target> {
342protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000343 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000344 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000345 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000346 DefineStd(Builder, "unix", Opts);
347 DefineStd(Builder, "linux", Opts);
348 Builder.defineMacro("__gnu_linux__");
349 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000350 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000351 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000352 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000353 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000354 if (Opts.CPlusPlus)
355 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000356 }
357public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000358 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000360 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000361 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000362
363 virtual const char *getStaticInitSectionSpecifier() const {
364 return ".text.startup";
365 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000366};
367
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000368// NetBSD Target
369template<typename Target>
370class NetBSDTargetInfo : public OSTargetInfo<Target> {
371protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000372 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000373 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000374 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000375 Builder.defineMacro("__NetBSD__");
376 Builder.defineMacro("__unix__");
377 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000378 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000379 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000380 }
381public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000382 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
383 this->UserLabelPrefix = "";
384 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000385};
386
Torok Edwinb2b37c62009-06-30 17:10:35 +0000387// OpenBSD Target
388template<typename Target>
389class OpenBSDTargetInfo : public OSTargetInfo<Target> {
390protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000391 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000392 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000393 // OpenBSD defines; list based off of gcc output
394
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000395 Builder.defineMacro("__OpenBSD__");
396 DefineStd(Builder, "unix", Opts);
397 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000398 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000399 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000400 }
401public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000402 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
403 this->UserLabelPrefix = "";
404 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000405
Eli Friedman3715d1f2011-12-15 02:15:56 +0000406 switch (Triple.getArch()) {
407 default:
408 case llvm::Triple::x86:
409 case llvm::Triple::x86_64:
410 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000411 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000412 this->MCountName = "__mcount";
413 break;
414 case llvm::Triple::mips64:
415 case llvm::Triple::mips64el:
416 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000417 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000418 this->MCountName = "_mcount";
419 break;
420 }
421 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000422};
423
Eli Friedman9fa28852012-08-08 23:57:20 +0000424// Bitrig Target
425template<typename Target>
426class BitrigTargetInfo : public OSTargetInfo<Target> {
427protected:
428 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
429 MacroBuilder &Builder) const {
430 // Bitrig defines; list based off of gcc output
431
432 Builder.defineMacro("__Bitrig__");
433 DefineStd(Builder, "unix", Opts);
434 Builder.defineMacro("__ELF__");
435 if (Opts.POSIXThreads)
436 Builder.defineMacro("_REENTRANT");
437 }
438public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000439 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
440 this->UserLabelPrefix = "";
441 this->TLSSupported = false;
442 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000443 }
444};
445
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000446// PSP Target
447template<typename Target>
448class PSPTargetInfo : public OSTargetInfo<Target> {
449protected:
450 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000451 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000452 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000453 Builder.defineMacro("PSP");
454 Builder.defineMacro("_PSP");
455 Builder.defineMacro("__psp__");
456 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000457 }
458public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000459 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000460 this->UserLabelPrefix = "";
461 }
462};
463
John Thompsone467e192009-11-19 17:18:50 +0000464// PS3 PPU Target
465template<typename Target>
466class PS3PPUTargetInfo : public OSTargetInfo<Target> {
467protected:
468 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000469 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000470 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000471 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000472 Builder.defineMacro("__PPU__");
473 Builder.defineMacro("__CELLOS_LV2__");
474 Builder.defineMacro("__ELF__");
475 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000476 Builder.defineMacro("_ARCH_PPC64");
477 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000478 }
479public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000480 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000481 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000482 this->LongWidth = this->LongAlign = 32;
483 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000484 this->IntMaxType = TargetInfo::SignedLongLong;
485 this->UIntMaxType = TargetInfo::UnsignedLongLong;
486 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000487 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindola12256302013-12-17 15:40:00 +0000488 this->DescriptionString = "E-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000489 }
490};
491
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000492// AuroraUX target
493template<typename Target>
494class AuroraUXTargetInfo : public OSTargetInfo<Target> {
495protected:
496 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000497 MacroBuilder &Builder) const {
498 DefineStd(Builder, "sun", Opts);
499 DefineStd(Builder, "unix", Opts);
500 Builder.defineMacro("__ELF__");
501 Builder.defineMacro("__svr4__");
502 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000503 }
504public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000505 AuroraUXTargetInfo(const llvm::Triple &Triple)
506 : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000507 this->UserLabelPrefix = "";
508 this->WCharType = this->SignedLong;
509 // FIXME: WIntType should be SignedLong
510 }
511};
512
Torok Edwinb2b37c62009-06-30 17:10:35 +0000513// Solaris target
514template<typename Target>
515class SolarisTargetInfo : public OSTargetInfo<Target> {
516protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000517 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000518 MacroBuilder &Builder) const {
519 DefineStd(Builder, "sun", Opts);
520 DefineStd(Builder, "unix", Opts);
521 Builder.defineMacro("__ELF__");
522 Builder.defineMacro("__svr4__");
523 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000524 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
525 // newer, but to 500 for everything else. feature_test.h has a check to
526 // ensure that you are not using C99 with an old version of X/Open or C89
527 // with a new version.
528 if (Opts.C99 || Opts.C11)
529 Builder.defineMacro("_XOPEN_SOURCE", "600");
530 else
531 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000532 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000533 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000534 Builder.defineMacro("_LARGEFILE_SOURCE");
535 Builder.defineMacro("_LARGEFILE64_SOURCE");
536 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000537 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000538 }
539public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000540 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000541 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000542 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000543 // FIXME: WIntType should be SignedLong
544 }
545};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000546
547// Windows target
548template<typename Target>
549class WindowsTargetInfo : public OSTargetInfo<Target> {
550protected:
551 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
552 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000553 Builder.defineMacro("_WIN32");
554 }
555 void getVisualStudioDefines(const LangOptions &Opts,
556 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000557 if (Opts.CPlusPlus) {
558 if (Opts.RTTI)
559 Builder.defineMacro("_CPPRTTI");
560
561 if (Opts.Exceptions)
562 Builder.defineMacro("_CPPUNWIND");
563 }
564
565 if (!Opts.CharIsSigned)
566 Builder.defineMacro("_CHAR_UNSIGNED");
567
568 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
569 // but it works for now.
570 if (Opts.POSIXThreads)
571 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000572
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000573 if (Opts.MSCVersion != 0)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000574 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000575
Francois Pichet0706d202011-09-17 17:15:52 +0000576 if (Opts.MicrosoftExt) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000577 Builder.defineMacro("_MSC_EXTENSIONS");
578
Richard Smith2bf7fdb2013-01-02 11:42:31 +0000579 if (Opts.CPlusPlus11) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000580 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
581 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
582 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
583 }
584 }
585
586 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000587 }
588
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000589public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000590 WindowsTargetInfo(const llvm::Triple &Triple)
591 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000592};
593
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000594template <typename Target>
595class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000596protected:
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000597 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
598 MacroBuilder &Builder) const {
599 if (Opts.POSIXThreads)
600 Builder.defineMacro("_REENTRANT");
601 if (Opts.CPlusPlus)
602 Builder.defineMacro("_GNU_SOURCE");
603
604 DefineStd(Builder, "unix", Opts);
605 Builder.defineMacro("__ELF__");
606 Builder.defineMacro("__native_client__");
607 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000608
609public:
610 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000611 this->UserLabelPrefix = "";
612 this->LongAlign = 32;
613 this->LongWidth = 32;
614 this->PointerAlign = 32;
615 this->PointerWidth = 32;
616 this->IntMaxType = TargetInfo::SignedLongLong;
617 this->UIntMaxType = TargetInfo::UnsignedLongLong;
618 this->Int64Type = TargetInfo::SignedLongLong;
619 this->DoubleAlign = 64;
620 this->LongDoubleWidth = 64;
621 this->LongDoubleAlign = 64;
622 this->SizeType = TargetInfo::UnsignedInt;
623 this->PtrDiffType = TargetInfo::SignedInt;
624 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000625 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000626 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola2da35322013-12-16 23:27:41 +0000627 this->DescriptionString = "e-i64:64"
628 "-p:32:32-v128:32";
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000629 }
Derek Schuffa2020962012-10-16 22:30:41 +0000630 virtual typename Target::CallingConvCheckResult checkCallingConvention(
631 CallingConv CC) const {
632 return CC == CC_PnaclCall ? Target::CCCR_OK :
633 Target::checkCallingConvention(CC);
634 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000635};
Mike Stump11289f42009-09-09 15:08:12 +0000636} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000637
Chris Lattner09d98f52008-10-05 21:50:58 +0000638//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000639// Specific target implementations.
640//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000641
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000642namespace {
643// PPC abstract base class
644class PPCTargetInfo : public TargetInfo {
645 static const Builtin::Info BuiltinInfo[];
646 static const char * const GCCRegNames[];
647 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000648 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000649
650 // Target cpu features.
651 bool HasVSX;
652
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000653public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000654 PPCTargetInfo(const llvm::Triple &Triple)
655 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000656 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000657 LongDoubleWidth = LongDoubleAlign = 128;
658 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
659 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000660
Hal Finkel6b984f02012-07-03 16:51:04 +0000661 /// \brief Flags for architecture specific defines.
662 typedef enum {
663 ArchDefineNone = 0,
664 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
665 ArchDefinePpcgr = 1 << 1,
666 ArchDefinePpcsq = 1 << 2,
667 ArchDefine440 = 1 << 3,
668 ArchDefine603 = 1 << 4,
669 ArchDefine604 = 1 << 5,
670 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000671 ArchDefinePwr5 = 1 << 7,
672 ArchDefinePwr5x = 1 << 8,
673 ArchDefinePwr6 = 1 << 9,
674 ArchDefinePwr6x = 1 << 10,
675 ArchDefinePwr7 = 1 << 11,
676 ArchDefineA2 = 1 << 12,
677 ArchDefineA2q = 1 << 13
Hal Finkel6b984f02012-07-03 16:51:04 +0000678 } ArchDefineTypes;
679
Bill Schmidt38378a02013-02-01 20:23:10 +0000680 // Note: GCC recognizes the following additional cpus:
681 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
682 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
683 // titan, rs64.
Hal Finkel8eb59282012-06-11 22:35:19 +0000684 virtual bool setCPU(const std::string &Name) {
685 bool CPUKnown = llvm::StringSwitch<bool>(Name)
686 .Case("generic", true)
687 .Case("440", true)
688 .Case("450", true)
689 .Case("601", true)
690 .Case("602", true)
691 .Case("603", true)
692 .Case("603e", true)
693 .Case("603ev", true)
694 .Case("604", true)
695 .Case("604e", true)
696 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000697 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000698 .Case("g3", true)
699 .Case("7400", true)
700 .Case("g4", true)
701 .Case("7450", true)
702 .Case("g4+", true)
703 .Case("750", true)
704 .Case("970", true)
705 .Case("g5", true)
706 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000707 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000708 .Case("e500mc", true)
709 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000710 .Case("power3", true)
711 .Case("pwr3", true)
712 .Case("power4", true)
713 .Case("pwr4", true)
714 .Case("power5", true)
715 .Case("pwr5", true)
716 .Case("power5x", true)
717 .Case("pwr5x", true)
718 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000719 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000720 .Case("power6x", true)
721 .Case("pwr6x", true)
722 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000723 .Case("pwr7", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000724 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000725 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000726 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000727 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000728 .Case("powerpc64le", true)
729 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000730 .Default(false);
731
732 if (CPUKnown)
733 CPU = Name;
734
735 return CPUKnown;
736 }
737
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000738 virtual void getTargetBuiltins(const Builtin::Info *&Records,
739 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000740 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000741 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000742 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000743
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000744 virtual bool isCLZForZeroUndef() const { return false; }
745
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000746 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000747 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000748
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000749 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
750
Eric Christopher3ff21b32013-10-16 21:26:26 +0000751 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000752 DiagnosticsEngine &Diags);
Douglas Gregor0070c0b2012-01-30 06:38:25 +0000753 virtual bool hasFeature(StringRef Feature) const;
754
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000755 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000756 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000757 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000758 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000759 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000760 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000761 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000762 default: return false;
763 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000764 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000765 case 'b': // Base register
766 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000767 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000768 break;
769 // FIXME: The following are added to allow parsing.
770 // I just took a guess at what the actions should be.
771 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000772 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000773 case 'v': // Altivec vector register
774 Info.setAllowsRegister();
775 break;
776 case 'w':
777 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000778 case 'd':// VSX vector register to hold vector double data
779 case 'f':// VSX vector register to hold vector float data
780 case 's':// VSX vector register to hold scalar float data
781 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000782 break;
783 default:
784 return false;
785 }
786 Info.setAllowsRegister();
787 Name++; // Skip over 'w'.
788 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000789 case 'h': // `MQ', `CTR', or `LINK' register
790 case 'q': // `MQ' register
791 case 'c': // `CTR' register
792 case 'l': // `LINK' register
793 case 'x': // `CR' register (condition register) number 0
794 case 'y': // `CR' register (condition register)
795 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000796 Info.setAllowsRegister();
797 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000798 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000799 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000800 // (use `L' instead for SImode constants)
801 case 'K': // Unsigned 16-bit constant
802 case 'L': // Signed 16-bit constant shifted left 16 bits
803 case 'M': // Constant larger than 31
804 case 'N': // Exact power of 2
805 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000806 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000807 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000808 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000809 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000810 break;
811 case 'm': // Memory operand. Note that on PowerPC targets, m can
812 // include addresses that update the base register. It
813 // is therefore only safe to use `m' in an asm statement
814 // if that asm statement accesses the operand exactly once.
815 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000816 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000817 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000818 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000819 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000820 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
821 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000822 // register to be updated.
823 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000824 if (Name[1] != 's')
825 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000826 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000827 // include any automodification of the base register. Unlike
828 // `m', this constraint can be used in asm statements that
829 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000830 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000831 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000832 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000833 break;
834 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000835 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000836 case 'Z': // Memory operand that is an indexed or indirect from a
837 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000838 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000839 Info.setAllowsMemory();
840 Info.setAllowsRegister();
841 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000842 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000843 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000844 // register (`p' is preferable for asm statements)
845 case 'S': // Constant suitable as a 64-bit mask operand
846 case 'T': // Constant suitable as a 32-bit mask operand
847 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000848 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000849 // instructions
850 case 'W': // Vector constant that does not require memory
851 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000852 break;
853 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000854 }
John Thompson07a61a42010-06-24 22:44:13 +0000855 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000856 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000857 virtual const char *getClobbers() const {
858 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000859 }
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000860 int getEHDataRegisterNumber(unsigned RegNo) const {
861 if (RegNo == 0) return 3;
862 if (RegNo == 1) return 4;
863 return -1;
864 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000865};
Anders Carlssonf511f642007-11-27 04:11:28 +0000866
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000867const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000868#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000869#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000870 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000871#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000872};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000873
Eric Christopher3ff21b32013-10-16 21:26:26 +0000874 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000875/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000876bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000877 DiagnosticsEngine &Diags) {
878 // Remember the maximum enabled sselevel.
879 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
880 // Ignore disabled features.
881 if (Features[i][0] == '-')
882 continue;
883
884 StringRef Feature = StringRef(Features[i]).substr(1);
885
886 if (Feature == "vsx") {
887 HasVSX = true;
888 continue;
889 }
890
891 // TODO: Finish this list and add an assert that we've handled them
892 // all.
893 }
894
895 return true;
896}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000897
Chris Lattnerecd49032009-03-02 22:27:17 +0000898/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
899/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000900void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000901 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000902 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000903 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000904 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000905 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000906 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000907 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000908 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000909 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000910 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000911 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000912 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000913 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000914
Chris Lattnerecd49032009-03-02 22:27:17 +0000915 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000916 if (getTriple().getArch() == llvm::Triple::ppc64le) {
917 Builder.defineMacro("_LITTLE_ENDIAN");
918 Builder.defineMacro("__LITTLE_ENDIAN__");
919 } else {
920 if (getTriple().getOS() != llvm::Triple::NetBSD &&
921 getTriple().getOS() != llvm::Triple::OpenBSD)
922 Builder.defineMacro("_BIG_ENDIAN");
923 Builder.defineMacro("__BIG_ENDIAN__");
924 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000925
Chris Lattnerecd49032009-03-02 22:27:17 +0000926 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000927 Builder.defineMacro("__NATURAL_ALIGNMENT__");
928 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000929
Chris Lattnerecd49032009-03-02 22:27:17 +0000930 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000931 if (LongDoubleWidth == 128)
932 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000933
John Thompsone467e192009-11-19 17:18:50 +0000934 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000935 Builder.defineMacro("__VEC__", "10206");
936 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000937 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000938
939 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000940 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
941 .Case("440", ArchDefineName)
942 .Case("450", ArchDefineName | ArchDefine440)
943 .Case("601", ArchDefineName)
944 .Case("602", ArchDefineName | ArchDefinePpcgr)
945 .Case("603", ArchDefineName | ArchDefinePpcgr)
946 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
947 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
948 .Case("604", ArchDefineName | ArchDefinePpcgr)
949 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
950 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +0000951 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +0000952 .Case("7400", ArchDefineName | ArchDefinePpcgr)
953 .Case("7450", ArchDefineName | ArchDefinePpcgr)
954 .Case("750", ArchDefineName | ArchDefinePpcgr)
955 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
956 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000957 .Case("a2", ArchDefineA2)
958 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +0000959 .Case("pwr3", ArchDefinePpcgr)
960 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
961 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
962 | ArchDefinePpcsq)
963 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
964 | ArchDefinePpcgr | ArchDefinePpcsq)
965 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
966 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
967 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
968 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
969 | ArchDefinePpcsq)
970 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
971 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
972 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
973 .Case("power3", ArchDefinePpcgr)
974 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
975 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
976 | ArchDefinePpcsq)
977 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
978 | ArchDefinePpcgr | ArchDefinePpcsq)
979 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
980 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
981 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
982 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
983 | ArchDefinePpcsq)
984 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
985 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
986 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +0000987 .Default(ArchDefineNone);
988
989 if (defs & ArchDefineName)
990 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
991 if (defs & ArchDefinePpcgr)
992 Builder.defineMacro("_ARCH_PPCGR");
993 if (defs & ArchDefinePpcsq)
994 Builder.defineMacro("_ARCH_PPCSQ");
995 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +0000996 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +0000997 if (defs & ArchDefine603)
998 Builder.defineMacro("_ARCH_603");
999 if (defs & ArchDefine604)
1000 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001001 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001002 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001003 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001004 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001005 if (defs & ArchDefinePwr5x)
1006 Builder.defineMacro("_ARCH_PWR5X");
1007 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001008 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001009 if (defs & ArchDefinePwr6x)
1010 Builder.defineMacro("_ARCH_PWR6X");
1011 if (defs & ArchDefinePwr7)
1012 Builder.defineMacro("_ARCH_PWR7");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001013 if (defs & ArchDefineA2)
1014 Builder.defineMacro("_ARCH_A2");
1015 if (defs & ArchDefineA2q) {
1016 Builder.defineMacro("_ARCH_A2Q");
1017 Builder.defineMacro("_ARCH_QP");
1018 }
1019
1020 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1021 Builder.defineMacro("__bg__");
1022 Builder.defineMacro("__THW_BLUEGENE__");
1023 Builder.defineMacro("__bgq__");
1024 Builder.defineMacro("__TOS_BGQ__");
1025 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001026
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001027 if (HasVSX)
1028 Builder.defineMacro("__VSX__");
1029
Bill Schmidt38378a02013-02-01 20:23:10 +00001030 // FIXME: The following are not yet generated here by Clang, but are
1031 // generated by GCC:
1032 //
1033 // _SOFT_FLOAT_
1034 // __RECIP_PRECISION__
1035 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001036 // __RECIP__
1037 // __RECIPF__
1038 // __RSQRTE__
1039 // __RSQRTEF__
1040 // _SOFT_DOUBLE_
1041 // __NO_LWSYNC__
1042 // __HAVE_BSWAP__
1043 // __LONGDOUBLE128
1044 // __CMODEL_MEDIUM__
1045 // __CMODEL_LARGE__
1046 // _CALL_SYSV
1047 // _CALL_DARWIN
1048 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001049}
1050
1051void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1052 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1053 .Case("7400", true)
1054 .Case("g4", true)
1055 .Case("7450", true)
1056 .Case("g4+", true)
1057 .Case("970", true)
1058 .Case("g5", true)
1059 .Case("pwr6", true)
1060 .Case("pwr7", true)
1061 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001062 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001063 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001064
1065 Features["qpx"] = (CPU == "a2q");
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001066}
1067
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001068bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1069 return Feature == "powerpc";
1070}
Chris Lattner17df24e2008-04-21 18:56:49 +00001071
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001072
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001073const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001074 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1075 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1076 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1077 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1078 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1079 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1080 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1081 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001082 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001083 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001084 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001085 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1086 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1087 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1088 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001089 "vrsave", "vscr",
1090 "spe_acc", "spefscr",
1091 "sfp"
1092};
Chris Lattner10a5b382007-01-29 05:24:35 +00001093
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001094void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001095 unsigned &NumNames) const {
1096 Names = GCCRegNames;
1097 NumNames = llvm::array_lengthof(GCCRegNames);
1098}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001099
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001100const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1101 // While some of these aliases do map to different registers
1102 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001103 { { "0" }, "r0" },
1104 { { "1"}, "r1" },
1105 { { "2" }, "r2" },
1106 { { "3" }, "r3" },
1107 { { "4" }, "r4" },
1108 { { "5" }, "r5" },
1109 { { "6" }, "r6" },
1110 { { "7" }, "r7" },
1111 { { "8" }, "r8" },
1112 { { "9" }, "r9" },
1113 { { "10" }, "r10" },
1114 { { "11" }, "r11" },
1115 { { "12" }, "r12" },
1116 { { "13" }, "r13" },
1117 { { "14" }, "r14" },
1118 { { "15" }, "r15" },
1119 { { "16" }, "r16" },
1120 { { "17" }, "r17" },
1121 { { "18" }, "r18" },
1122 { { "19" }, "r19" },
1123 { { "20" }, "r20" },
1124 { { "21" }, "r21" },
1125 { { "22" }, "r22" },
1126 { { "23" }, "r23" },
1127 { { "24" }, "r24" },
1128 { { "25" }, "r25" },
1129 { { "26" }, "r26" },
1130 { { "27" }, "r27" },
1131 { { "28" }, "r28" },
1132 { { "29" }, "r29" },
1133 { { "30" }, "r30" },
1134 { { "31" }, "r31" },
1135 { { "fr0" }, "f0" },
1136 { { "fr1" }, "f1" },
1137 { { "fr2" }, "f2" },
1138 { { "fr3" }, "f3" },
1139 { { "fr4" }, "f4" },
1140 { { "fr5" }, "f5" },
1141 { { "fr6" }, "f6" },
1142 { { "fr7" }, "f7" },
1143 { { "fr8" }, "f8" },
1144 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001145 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001146 { { "fr11" }, "f11" },
1147 { { "fr12" }, "f12" },
1148 { { "fr13" }, "f13" },
1149 { { "fr14" }, "f14" },
1150 { { "fr15" }, "f15" },
1151 { { "fr16" }, "f16" },
1152 { { "fr17" }, "f17" },
1153 { { "fr18" }, "f18" },
1154 { { "fr19" }, "f19" },
1155 { { "fr20" }, "f20" },
1156 { { "fr21" }, "f21" },
1157 { { "fr22" }, "f22" },
1158 { { "fr23" }, "f23" },
1159 { { "fr24" }, "f24" },
1160 { { "fr25" }, "f25" },
1161 { { "fr26" }, "f26" },
1162 { { "fr27" }, "f27" },
1163 { { "fr28" }, "f28" },
1164 { { "fr29" }, "f29" },
1165 { { "fr30" }, "f30" },
1166 { { "fr31" }, "f31" },
1167 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001168};
1169
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001170void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001171 unsigned &NumAliases) const {
1172 Aliases = GCCRegAliases;
1173 NumAliases = llvm::array_lengthof(GCCRegAliases);
1174}
1175} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001176
Chris Lattner5ba61f02006-10-14 07:39:34 +00001177namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001178class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001179public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001180 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindola2da35322013-12-16 23:27:41 +00001181 DescriptionString = "E-p:32:32-"
1182 "i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001183
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001184 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001185 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001186 case llvm::Triple::FreeBSD:
1187 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001188 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001189 PtrDiffType = SignedInt;
1190 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001191 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001192 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001193 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001194 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001195
Roman Divacky3ffe7462012-03-13 19:20:17 +00001196 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1197 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001198 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001199 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001200
1201 // PPC32 supports atomics up to 4 bytes.
1202 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001203 }
1204
Meador Inge5d3fb222012-06-16 03:34:49 +00001205 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Roman Divacky965b0b72011-01-06 08:27:10 +00001206 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001207 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001208 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001209};
1210} // end anonymous namespace.
1211
Bill Schmidt778d3872013-07-26 01:36:11 +00001212// Note: ABI differences may eventually require us to have a separate
1213// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001214namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001215class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001216public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001217 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001218 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001219 IntMaxType = SignedLong;
1220 UIntMaxType = UnsignedLong;
1221 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001222
Roman Divacky3ffe7462012-03-13 19:20:17 +00001223 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1224 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001225 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola47debc02013-12-16 21:59:14 +00001226 DescriptionString = "E-"
Rafael Espindola2da35322013-12-16 23:27:41 +00001227 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00001228 "n32:64";
Bill Schmidtcec4cb12012-10-29 14:59:24 +00001229 } else
Rafael Espindola47debc02013-12-16 21:59:14 +00001230 DescriptionString = "E-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00001231 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00001232 "n32:64";
Benjamin Kramer37196de2012-11-17 17:30:55 +00001233
1234 // PPC64 supports atomics up to 8 bytes.
1235 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001236 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001237 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1238 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001239 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001240};
1241} // end anonymous namespace.
1242
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001243
1244namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001245class DarwinPPC32TargetInfo :
1246 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001247public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001248 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1249 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001250 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001251 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherc04fe092013-10-16 21:19:19 +00001252 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001253 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001254 SuitableAlign = 128;
Rafael Espindola2da35322013-12-16 23:27:41 +00001255 DescriptionString = "E-p:32:32"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00001256 "-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001257 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001258 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1259 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001260 }
1261};
1262
1263class DarwinPPC64TargetInfo :
1264 public DarwinTargetInfo<PPC64TargetInfo> {
1265public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001266 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1267 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001268 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001269 SuitableAlign = 128;
Rafael Espindola47debc02013-12-16 21:59:14 +00001270 DescriptionString = "E-"
Rafael Espindola2da35322013-12-16 23:27:41 +00001271 "i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001272 }
1273};
1274} // end anonymous namespace.
1275
Chris Lattner5ba61f02006-10-14 07:39:34 +00001276namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001277 static const unsigned NVPTXAddrSpaceMap[] = {
1278 1, // opencl_global
1279 3, // opencl_local
1280 4, // opencl_constant
1281 1, // cuda_device
1282 4, // cuda_constant
1283 3, // cuda_shared
1284 };
1285 class NVPTXTargetInfo : public TargetInfo {
1286 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001287 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001288 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001289 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001290 BigEndian = false;
1291 TLSSupported = false;
1292 LongWidth = LongAlign = 64;
1293 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001294 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001295 // Define available target features
1296 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001297 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001298 }
1299 virtual void getTargetDefines(const LangOptions &Opts,
1300 MacroBuilder &Builder) const {
1301 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001302 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001303 }
1304 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1305 unsigned &NumRecords) const {
Justin Holewinski83e96682012-05-24 17:43:12 +00001306 Records = BuiltinInfo;
1307 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001308 }
1309 virtual bool hasFeature(StringRef Feature) const {
Justin Holewinski83e96682012-05-24 17:43:12 +00001310 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001311 }
1312
1313 virtual void getGCCRegNames(const char * const *&Names,
1314 unsigned &NumNames) const;
1315 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1316 unsigned &NumAliases) const {
1317 // No aliases.
1318 Aliases = 0;
1319 NumAliases = 0;
1320 }
1321 virtual bool validateAsmConstraint(const char *&Name,
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001322 TargetInfo::ConstraintInfo &Info) const {
1323 switch (*Name) {
1324 default: return false;
1325 case 'c':
1326 case 'h':
1327 case 'r':
1328 case 'l':
1329 case 'f':
1330 case 'd':
1331 Info.setAllowsRegister();
1332 return true;
1333 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001334 }
1335 virtual const char *getClobbers() const {
1336 // FIXME: Is this really right?
1337 return "";
1338 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001339 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001340 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001341 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001342 }
1343 virtual bool setCPU(const std::string &Name) {
Justin Holewinski91203e82013-03-30 14:38:26 +00001344 bool Valid = llvm::StringSwitch<bool>(Name)
1345 .Case("sm_20", true)
1346 .Case("sm_21", true)
1347 .Case("sm_30", true)
1348 .Case("sm_35", true)
1349 .Default(false);
1350
1351 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001352 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001353 };
1354
1355 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1356#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1357#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1358 ALL_LANGUAGES },
1359#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001360 };
1361
1362 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1363 "r0"
1364 };
1365
1366 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1367 unsigned &NumNames) const {
1368 Names = GCCRegNames;
1369 NumNames = llvm::array_lengthof(GCCRegNames);
1370 }
1371
1372 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1373 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001374 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001375 PointerWidth = PointerAlign = 32;
Justin Holewinski83e96682012-05-24 17:43:12 +00001376 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001377 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00001378 = "e-p:32:32-i64:64"
1379 "-v16:16-v32:32-"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001380 "n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001381 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001382 };
1383
1384 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1385 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001386 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001387 PointerWidth = PointerAlign = 64;
Justin Holewinski83e96682012-05-24 17:43:12 +00001388 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001389 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00001390 = "e-i64:64"
1391 "-v16:16-v32:32-"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001392 "n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001393 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001394 };
1395}
1396
1397namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001398
1399static const unsigned R600AddrSpaceMap[] = {
1400 1, // opencl_global
1401 3, // opencl_local
1402 2, // opencl_constant
1403 1, // cuda_device
1404 2, // cuda_constant
1405 3 // cuda_shared
1406};
1407
Tom Stellardc74b1e02013-03-04 17:40:53 +00001408static const char *DescriptionStringR600 =
1409 "e"
Rafael Espindola2da35322013-12-16 23:27:41 +00001410 "-p:32:32"
1411 "-i64:64"
1412 "-v16:16-v24:32-v32:32-v48:64-v96:128"
1413 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048"
Tom Stellardc74b1e02013-03-04 17:40:53 +00001414 "-n32:64";
1415
1416static const char *DescriptionStringR600DoubleOps =
1417 "e"
Rafael Espindola2da35322013-12-16 23:27:41 +00001418 "-p:32:32"
1419 "-i64:64"
1420 "-v16:16-v24:32-v32:32-v48:64-v96:128"
1421 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048"
Tom Stellardc74b1e02013-03-04 17:40:53 +00001422 "-n32:64";
1423
1424static const char *DescriptionStringSI =
1425 "e"
Rafael Espindola47debc02013-12-16 21:59:14 +00001426 ""
Rafael Espindola2da35322013-12-16 23:27:41 +00001427 "-p3:32:32"
1428 "-i64:64"
1429 "-v16:16-v24:32-v32:32-v48:64-v96:128"
1430 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048"
Tom Stellardc74b1e02013-03-04 17:40:53 +00001431 "-n32:64";
1432
Eli Friedmand13b41e2012-10-12 23:32:00 +00001433class R600TargetInfo : public TargetInfo {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001434 /// \brief The GPU profiles supported by the R600 target.
1435 enum GPUKind {
1436 GK_NONE,
1437 GK_R600,
1438 GK_R600_DOUBLE_OPS,
1439 GK_R700,
1440 GK_R700_DOUBLE_OPS,
1441 GK_EVERGREEN,
1442 GK_EVERGREEN_DOUBLE_OPS,
1443 GK_NORTHERN_ISLANDS,
1444 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001445 GK_SOUTHERN_ISLANDS,
1446 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001447 } GPU;
1448
Eli Friedmand13b41e2012-10-12 23:32:00 +00001449public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001450 R600TargetInfo(const llvm::Triple &Triple)
1451 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001452 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001453 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001454 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001455 }
1456
1457 virtual const char * getClobbers() const {
1458 return "";
1459 }
1460
1461 virtual void getGCCRegNames(const char * const *&Names,
1462 unsigned &numNames) const {
1463 Names = NULL;
1464 numNames = 0;
1465 }
1466
1467 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1468 unsigned &NumAliases) const {
1469 Aliases = NULL;
1470 NumAliases = 0;
1471 }
1472
1473 virtual bool validateAsmConstraint(const char *&Name,
1474 TargetInfo::ConstraintInfo &info) const {
1475 return true;
1476 }
1477
1478 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1479 unsigned &NumRecords) const {
1480 Records = NULL;
1481 NumRecords = 0;
1482 }
1483
1484
1485 virtual void getTargetDefines(const LangOptions &Opts,
1486 MacroBuilder &Builder) const {
1487 Builder.defineMacro("__R600__");
1488 }
1489
1490 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1491 return TargetInfo::CharPtrBuiltinVaList;
1492 }
1493
Tom Stellardc74b1e02013-03-04 17:40:53 +00001494 virtual bool setCPU(const std::string &Name) {
1495 GPU = llvm::StringSwitch<GPUKind>(Name)
1496 .Case("r600" , GK_R600)
1497 .Case("rv610", GK_R600)
1498 .Case("rv620", GK_R600)
1499 .Case("rv630", GK_R600)
1500 .Case("rv635", GK_R600)
1501 .Case("rs780", GK_R600)
1502 .Case("rs880", GK_R600)
1503 .Case("rv670", GK_R600_DOUBLE_OPS)
1504 .Case("rv710", GK_R700)
1505 .Case("rv730", GK_R700)
1506 .Case("rv740", GK_R700_DOUBLE_OPS)
1507 .Case("rv770", GK_R700_DOUBLE_OPS)
1508 .Case("palm", GK_EVERGREEN)
1509 .Case("cedar", GK_EVERGREEN)
1510 .Case("sumo", GK_EVERGREEN)
1511 .Case("sumo2", GK_EVERGREEN)
1512 .Case("redwood", GK_EVERGREEN)
1513 .Case("juniper", GK_EVERGREEN)
1514 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1515 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1516 .Case("barts", GK_NORTHERN_ISLANDS)
1517 .Case("turks", GK_NORTHERN_ISLANDS)
1518 .Case("caicos", GK_NORTHERN_ISLANDS)
1519 .Case("cayman", GK_CAYMAN)
1520 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001521 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001522 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1523 .Case("verde", GK_SOUTHERN_ISLANDS)
1524 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001525 .Case("bonaire", GK_SEA_ISLANDS)
1526 .Case("kabini", GK_SEA_ISLANDS)
1527 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001528 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001529 .Default(GK_NONE);
1530
1531 if (GPU == GK_NONE) {
1532 return false;
1533 }
1534
1535 // Set the correct data layout
1536 switch (GPU) {
1537 case GK_NONE:
1538 case GK_R600:
1539 case GK_R700:
1540 case GK_EVERGREEN:
1541 case GK_NORTHERN_ISLANDS:
1542 DescriptionString = DescriptionStringR600;
1543 break;
1544 case GK_R600_DOUBLE_OPS:
1545 case GK_R700_DOUBLE_OPS:
1546 case GK_EVERGREEN_DOUBLE_OPS:
1547 case GK_CAYMAN:
1548 DescriptionString = DescriptionStringR600DoubleOps;
1549 break;
1550 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001551 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001552 DescriptionString = DescriptionStringSI;
1553 break;
1554 }
1555
1556 return true;
1557 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001558};
1559
1560} // end anonymous namespace
1561
1562namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001563// Namespace for x86 abstract base class
1564const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001565#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001566#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001567 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001568#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001569};
Eli Friedmanb5366062008-05-20 14:21:01 +00001570
Nuno Lopescfca1f02009-12-23 17:49:57 +00001571static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001572 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1573 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001574 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001575 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1576 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1577 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001578 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001579 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1580 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001581};
1582
Eric Christophercdd36352011-06-21 00:05:20 +00001583const TargetInfo::AddlRegName AddlRegNames[] = {
1584 { { "al", "ah", "eax", "rax" }, 0 },
1585 { { "bl", "bh", "ebx", "rbx" }, 3 },
1586 { { "cl", "ch", "ecx", "rcx" }, 2 },
1587 { { "dl", "dh", "edx", "rdx" }, 1 },
1588 { { "esi", "rsi" }, 4 },
1589 { { "edi", "rdi" }, 5 },
1590 { { "esp", "rsp" }, 7 },
1591 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001592};
1593
1594// X86 target abstract base class; x86-32 and x86-64 are very close, so
1595// most of the implementation can be shared.
1596class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001597 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001598 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001599 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001600 enum MMX3DNowEnum {
1601 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1602 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001603 enum XOPEnum {
1604 NoXOP,
1605 SSE4A,
1606 FMA4,
1607 XOP
1608 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001609
Eric Christophere1ddaf92010-04-02 23:50:19 +00001610 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001611 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001612 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001613 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001614 bool HasBMI;
1615 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001616 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001617 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001618 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001619 bool HasRDSEED;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001620 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001621 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001622 bool HasF16C;
Craig Topper679b53a2013-08-21 05:29:10 +00001623 bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
Ben Langmuir58078d02013-09-19 13:22:04 +00001624 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001625 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001626
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001627 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1628 ///
1629 /// Each enumeration represents a particular CPU supported by Clang. These
1630 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1631 enum CPUKind {
1632 CK_Generic,
1633
1634 /// \name i386
1635 /// i386-generation processors.
1636 //@{
1637 CK_i386,
1638 //@}
1639
1640 /// \name i486
1641 /// i486-generation processors.
1642 //@{
1643 CK_i486,
1644 CK_WinChipC6,
1645 CK_WinChip2,
1646 CK_C3,
1647 //@}
1648
1649 /// \name i586
1650 /// i586-generation processors, P5 microarchitecture based.
1651 //@{
1652 CK_i586,
1653 CK_Pentium,
1654 CK_PentiumMMX,
1655 //@}
1656
1657 /// \name i686
1658 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1659 //@{
1660 CK_i686,
1661 CK_PentiumPro,
1662 CK_Pentium2,
1663 CK_Pentium3,
1664 CK_Pentium3M,
1665 CK_PentiumM,
1666 CK_C3_2,
1667
1668 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1669 /// Clang however has some logic to suport this.
1670 // FIXME: Warn, deprecate, and potentially remove this.
1671 CK_Yonah,
1672 //@}
1673
1674 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001675 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001676 //@{
1677 CK_Pentium4,
1678 CK_Pentium4M,
1679 CK_Prescott,
1680 CK_Nocona,
1681 //@}
1682
1683 /// \name Core
1684 /// Core microarchitecture based processors.
1685 //@{
1686 CK_Core2,
1687
1688 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1689 /// codename which GCC no longer accepts as an option to -march, but Clang
1690 /// has some logic for recognizing it.
1691 // FIXME: Warn, deprecate, and potentially remove this.
1692 CK_Penryn,
1693 //@}
1694
1695 /// \name Atom
1696 /// Atom processors
1697 //@{
1698 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001699 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001700 //@}
1701
1702 /// \name Nehalem
1703 /// Nehalem microarchitecture based processors.
1704 //@{
1705 CK_Corei7,
1706 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001707 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001708 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001709 //@}
1710
Craig Topper449314e2013-08-20 07:09:39 +00001711 /// \name Knights Landing
1712 /// Knights Landing processor.
1713 CK_KNL,
1714
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001715 /// \name K6
1716 /// K6 architecture processors.
1717 //@{
1718 CK_K6,
1719 CK_K6_2,
1720 CK_K6_3,
1721 //@}
1722
1723 /// \name K7
1724 /// K7 architecture processors.
1725 //@{
1726 CK_Athlon,
1727 CK_AthlonThunderbird,
1728 CK_Athlon4,
1729 CK_AthlonXP,
1730 CK_AthlonMP,
1731 //@}
1732
1733 /// \name K8
1734 /// K8 architecture processors.
1735 //@{
1736 CK_Athlon64,
1737 CK_Athlon64SSE3,
1738 CK_AthlonFX,
1739 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001740 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001741 CK_Opteron,
1742 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001743 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001744 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001745
Benjamin Kramer569f2152012-01-10 11:50:18 +00001746 /// \name Bobcat
1747 /// Bobcat architecture processors.
1748 //@{
1749 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001750 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001751 //@}
1752
1753 /// \name Bulldozer
1754 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001755 //@{
1756 CK_BDVER1,
1757 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001758 CK_BDVER3,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001759 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001760
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001761 /// This specification is deprecated and will be removed in the future.
1762 /// Users should prefer \see CK_K8.
1763 // FIXME: Warn on this when the CPU is set to it.
1764 CK_x86_64,
1765 //@}
1766
1767 /// \name Geode
1768 /// Geode processors.
1769 //@{
1770 CK_Geode
1771 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001772 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001773
Rafael Espindolaeb265472013-08-21 21:59:03 +00001774 enum FPMathKind {
1775 FP_Default,
1776 FP_SSE,
1777 FP_387
1778 } FPMath;
1779
Eli Friedman3fd920a2008-08-20 02:34:37 +00001780public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001781 X86TargetInfo(const llvm::Triple &Triple)
1782 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001783 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1784 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001785 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1786 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001787 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1788 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001789 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001790 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001791 }
Benjamin Kramercf501472011-12-28 15:47:06 +00001792 virtual unsigned getFloatEvalMethod() const {
1793 // X87 evaluates with 80 bits "long double" precision.
1794 return SSELevel == NoSSE ? 2 : 0;
1795 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001796 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1797 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001798 Records = BuiltinInfo;
1799 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001800 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001801 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001802 unsigned &NumNames) const {
1803 Names = GCCRegNames;
1804 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001805 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001806 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001807 unsigned &NumAliases) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001808 Aliases = 0;
1809 NumAliases = 0;
1810 }
1811 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
Eric Christopherfd081ca2012-11-14 22:08:59 +00001812 unsigned &NumNames) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001813 Names = AddlRegNames;
1814 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001815 }
Anders Carlsson58436352009-02-28 17:11:49 +00001816 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001817 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001818 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001819 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001820 return "~{dirflag},~{fpsr},~{flags}";
1821 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001822 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001823 MacroBuilder &Builder) const;
Craig Topper13f61a62013-09-17 04:12:55 +00001824 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1825 bool Enabled);
1826 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1827 bool Enabled);
1828 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1829 bool Enabled);
Rafael Espindolaa38ce292013-08-20 15:30:32 +00001830 virtual void setFeatureEnabled(llvm::StringMap<bool> &Features,
Craig Topper86d79ef2013-09-17 04:51:29 +00001831 StringRef Name, bool Enabled) const {
1832 setFeatureEnabledImpl(Features, Name, Enabled);
1833 }
1834 // This exists purely to cut down on the number of virtual calls in
1835 // getDefaultFeatures which calls this repeatedly.
1836 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1837 StringRef Name, bool Enabled);
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00001838 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001839 virtual bool hasFeature(StringRef Feature) const;
Eric Christopher3ff21b32013-10-16 21:26:26 +00001840 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00001841 DiagnosticsEngine &Diags);
Eli Friedman33465822011-07-08 23:31:17 +00001842 virtual const char* getABI() const {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001843 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001844 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001845 else if (getTriple().getArch() == llvm::Triple::x86 &&
1846 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001847 return "no-mmx";
1848 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001849 }
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001850 virtual bool setCPU(const std::string &Name) {
Chandler Carruth212334f2011-09-28 08:55:37 +00001851 CPU = llvm::StringSwitch<CPUKind>(Name)
1852 .Case("i386", CK_i386)
1853 .Case("i486", CK_i486)
1854 .Case("winchip-c6", CK_WinChipC6)
1855 .Case("winchip2", CK_WinChip2)
1856 .Case("c3", CK_C3)
1857 .Case("i586", CK_i586)
1858 .Case("pentium", CK_Pentium)
1859 .Case("pentium-mmx", CK_PentiumMMX)
1860 .Case("i686", CK_i686)
1861 .Case("pentiumpro", CK_PentiumPro)
1862 .Case("pentium2", CK_Pentium2)
1863 .Case("pentium3", CK_Pentium3)
1864 .Case("pentium3m", CK_Pentium3M)
1865 .Case("pentium-m", CK_PentiumM)
1866 .Case("c3-2", CK_C3_2)
1867 .Case("yonah", CK_Yonah)
1868 .Case("pentium4", CK_Pentium4)
1869 .Case("pentium4m", CK_Pentium4M)
1870 .Case("prescott", CK_Prescott)
1871 .Case("nocona", CK_Nocona)
1872 .Case("core2", CK_Core2)
1873 .Case("penryn", CK_Penryn)
1874 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001875 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001876 .Case("corei7", CK_Corei7)
1877 .Case("corei7-avx", CK_Corei7AVX)
1878 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001879 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001880 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00001881 .Case("k6", CK_K6)
1882 .Case("k6-2", CK_K6_2)
1883 .Case("k6-3", CK_K6_3)
1884 .Case("athlon", CK_Athlon)
1885 .Case("athlon-tbird", CK_AthlonThunderbird)
1886 .Case("athlon-4", CK_Athlon4)
1887 .Case("athlon-xp", CK_AthlonXP)
1888 .Case("athlon-mp", CK_AthlonMP)
1889 .Case("athlon64", CK_Athlon64)
1890 .Case("athlon64-sse3", CK_Athlon64SSE3)
1891 .Case("athlon-fx", CK_AthlonFX)
1892 .Case("k8", CK_K8)
1893 .Case("k8-sse3", CK_K8SSE3)
1894 .Case("opteron", CK_Opteron)
1895 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001896 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001897 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001898 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001899 .Case("bdver1", CK_BDVER1)
1900 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001901 .Case("bdver3", CK_BDVER3)
Chandler Carruth212334f2011-09-28 08:55:37 +00001902 .Case("x86-64", CK_x86_64)
1903 .Case("geode", CK_Geode)
1904 .Default(CK_Generic);
1905
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001906 // Perform any per-CPU checks necessary to determine if this CPU is
1907 // acceptable.
1908 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1909 // invalid without explaining *why*.
1910 switch (CPU) {
1911 case CK_Generic:
1912 // No processor selected!
1913 return false;
1914
1915 case CK_i386:
1916 case CK_i486:
1917 case CK_WinChipC6:
1918 case CK_WinChip2:
1919 case CK_C3:
1920 case CK_i586:
1921 case CK_Pentium:
1922 case CK_PentiumMMX:
1923 case CK_i686:
1924 case CK_PentiumPro:
1925 case CK_Pentium2:
1926 case CK_Pentium3:
1927 case CK_Pentium3M:
1928 case CK_PentiumM:
1929 case CK_Yonah:
1930 case CK_C3_2:
1931 case CK_Pentium4:
1932 case CK_Pentium4M:
1933 case CK_Prescott:
1934 case CK_K6:
1935 case CK_K6_2:
1936 case CK_K6_3:
1937 case CK_Athlon:
1938 case CK_AthlonThunderbird:
1939 case CK_Athlon4:
1940 case CK_AthlonXP:
1941 case CK_AthlonMP:
1942 case CK_Geode:
1943 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00001944 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001945 return false;
1946
1947 // Fallthrough
1948 case CK_Nocona:
1949 case CK_Core2:
1950 case CK_Penryn:
1951 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00001952 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001953 case CK_Corei7:
1954 case CK_Corei7AVX:
1955 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00001956 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00001957 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001958 case CK_Athlon64:
1959 case CK_Athlon64SSE3:
1960 case CK_AthlonFX:
1961 case CK_K8:
1962 case CK_K8SSE3:
1963 case CK_Opteron:
1964 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00001965 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00001966 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001967 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001968 case CK_BDVER1:
1969 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001970 case CK_BDVER3:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001971 case CK_x86_64:
1972 return true;
1973 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00001974 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001975 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001976
Rafael Espindolaeb265472013-08-21 21:59:03 +00001977 virtual bool setFPMath(StringRef Name);
1978
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001979 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
1980 // We accept all non-ARM calling conventions
1981 return (CC == CC_X86ThisCall ||
1982 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00001983 CC == CC_X86StdCall ||
1984 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00001985 CC == CC_X86Pascal ||
1986 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001987 }
1988
Aaron Ballman02df2e02012-12-09 17:45:41 +00001989 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
1990 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001991 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001992};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001993
Rafael Espindolaeb265472013-08-21 21:59:03 +00001994bool X86TargetInfo::setFPMath(StringRef Name) {
1995 if (Name == "387") {
1996 FPMath = FP_387;
1997 return true;
1998 }
1999 if (Name == "sse") {
2000 FPMath = FP_SSE;
2001 return true;
2002 }
2003 return false;
2004}
2005
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002006void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002007 // FIXME: This *really* should not be here.
2008
2009 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002010 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002011 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002012
Chandler Carruth212334f2011-09-28 08:55:37 +00002013 switch (CPU) {
2014 case CK_Generic:
2015 case CK_i386:
2016 case CK_i486:
2017 case CK_i586:
2018 case CK_Pentium:
2019 case CK_i686:
2020 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002021 break;
2022 case CK_PentiumMMX:
2023 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002024 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002025 break;
2026 case CK_Pentium3:
2027 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002028 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002029 break;
2030 case CK_PentiumM:
2031 case CK_Pentium4:
2032 case CK_Pentium4M:
2033 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002034 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002035 break;
2036 case CK_Yonah:
2037 case CK_Prescott:
2038 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002039 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002040 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002041 break;
2042 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002043 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002044 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002045 break;
2046 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002047 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002048 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002049 break;
2050 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002051 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002052 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002053 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002054 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002055 setFeatureEnabledImpl(Features, "sse4.2", 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);
Preston Gurda3c58c02013-09-13 19:27:17 +00002059 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002060 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002061 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002062 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002063 break;
2064 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002065 setFeatureEnabledImpl(Features, "avx", true);
2066 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002067 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002068 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002069 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002070 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002071 setFeatureEnabledImpl(Features, "avx", true);
2072 setFeatureEnabledImpl(Features, "aes", true);
2073 setFeatureEnabledImpl(Features, "pclmul", true);
2074 setFeatureEnabledImpl(Features, "rdrnd", true);
2075 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002076 break;
Craig Topper865fff52011-12-17 19:55:21 +00002077 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002078 setFeatureEnabledImpl(Features, "avx2", true);
2079 setFeatureEnabledImpl(Features, "aes", true);
2080 setFeatureEnabledImpl(Features, "pclmul", true);
2081 setFeatureEnabledImpl(Features, "lzcnt", true);
2082 setFeatureEnabledImpl(Features, "rdrnd", true);
2083 setFeatureEnabledImpl(Features, "f16c", true);
2084 setFeatureEnabledImpl(Features, "bmi", true);
2085 setFeatureEnabledImpl(Features, "bmi2", true);
2086 setFeatureEnabledImpl(Features, "rtm", true);
2087 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002088 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002089 break;
Craig Topper449314e2013-08-20 07:09:39 +00002090 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002091 setFeatureEnabledImpl(Features, "avx512f", true);
2092 setFeatureEnabledImpl(Features, "avx512cd", true);
2093 setFeatureEnabledImpl(Features, "avx512er", true);
2094 setFeatureEnabledImpl(Features, "avx512pf", true);
2095 setFeatureEnabledImpl(Features, "aes", true);
2096 setFeatureEnabledImpl(Features, "pclmul", true);
2097 setFeatureEnabledImpl(Features, "lzcnt", true);
2098 setFeatureEnabledImpl(Features, "rdrnd", true);
2099 setFeatureEnabledImpl(Features, "f16c", true);
2100 setFeatureEnabledImpl(Features, "bmi", true);
2101 setFeatureEnabledImpl(Features, "bmi2", true);
2102 setFeatureEnabledImpl(Features, "rtm", true);
2103 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002104 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002105 case CK_K6:
2106 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002107 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002108 break;
2109 case CK_K6_2:
2110 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002111 case CK_WinChip2:
2112 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002113 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002114 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002115 case CK_Athlon:
2116 case CK_AthlonThunderbird:
2117 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002118 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002119 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002120 case CK_Athlon4:
2121 case CK_AthlonXP:
2122 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002123 setFeatureEnabledImpl(Features, "sse", true);
2124 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002125 break;
2126 case CK_K8:
2127 case CK_Opteron:
2128 case CK_Athlon64:
2129 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002130 setFeatureEnabledImpl(Features, "sse2", true);
2131 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002132 break;
2133 case CK_K8SSE3:
2134 case CK_OpteronSSE3:
2135 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002136 setFeatureEnabledImpl(Features, "sse3", true);
2137 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002138 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002139 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002140 setFeatureEnabledImpl(Features, "sse3", true);
2141 setFeatureEnabledImpl(Features, "sse4a", true);
2142 setFeatureEnabledImpl(Features, "3dnowa", true);
2143 setFeatureEnabledImpl(Features, "lzcnt", true);
2144 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002145 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002146 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002147 setFeatureEnabledImpl(Features, "ssse3", true);
2148 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002149 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002150 setFeatureEnabledImpl(Features, "lzcnt", true);
2151 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002152 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002153 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002154 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002155 setFeatureEnabledImpl(Features, "avx", true);
2156 setFeatureEnabledImpl(Features, "sse4a", 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);
Craig Topper86d79ef2013-09-17 04:51:29 +00002161 setFeatureEnabledImpl(Features, "bmi", true);
2162 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002163 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002164 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002165 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002166 setFeatureEnabledImpl(Features, "xop", true);
2167 setFeatureEnabledImpl(Features, "lzcnt", true);
2168 setFeatureEnabledImpl(Features, "aes", true);
2169 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002170 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002171 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002172 break;
Eli Friedman3e94f572012-11-17 01:43:10 +00002173 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002174 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002175 setFeatureEnabledImpl(Features, "xop", true);
2176 setFeatureEnabledImpl(Features, "lzcnt", true);
2177 setFeatureEnabledImpl(Features, "aes", true);
2178 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002179 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002180 setFeatureEnabledImpl(Features, "bmi", true);
2181 setFeatureEnabledImpl(Features, "fma", true);
2182 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002183 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002184 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002185 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002186 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002187 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002188 break;
Eli Friedman33465822011-07-08 23:31:17 +00002189 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002190}
2191
Rafael Espindolae62e2792013-08-20 13:44:29 +00002192void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002193 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002194 if (Enabled) {
2195 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002196 case AVX512F:
2197 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002198 case AVX2:
2199 Features["avx2"] = true;
2200 case AVX:
2201 Features["avx"] = true;
2202 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002203 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002204 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002205 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002206 case SSSE3:
2207 Features["ssse3"] = true;
2208 case SSE3:
2209 Features["sse3"] = true;
2210 case SSE2:
2211 Features["sse2"] = true;
2212 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002213 Features["sse"] = true;
2214 case NoSSE:
2215 break;
2216 }
2217 return;
2218 }
2219
2220 switch (Level) {
2221 case NoSSE:
2222 case SSE1:
2223 Features["sse"] = false;
2224 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002225 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2226 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002227 case SSE3:
2228 Features["sse3"] = false;
2229 setXOPLevel(Features, NoXOP, false);
2230 case SSSE3:
2231 Features["ssse3"] = false;
2232 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002233 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002234 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002235 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002236 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002237 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002238 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002239 case AVX2:
2240 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002241 case AVX512F:
Craig Topper679b53a2013-08-21 05:29:10 +00002242 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2243 Features["avx512pf"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002244 }
2245}
2246
2247void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002248 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002249 if (Enabled) {
2250 switch (Level) {
2251 case AMD3DNowAthlon:
2252 Features["3dnowa"] = true;
2253 case AMD3DNow:
2254 Features["3dnow"] = true;
2255 case MMX:
2256 Features["mmx"] = true;
2257 case NoMMX3DNow:
2258 break;
2259 }
2260 return;
2261 }
2262
2263 switch (Level) {
2264 case NoMMX3DNow:
2265 case MMX:
2266 Features["mmx"] = false;
2267 case AMD3DNow:
2268 Features["3dnow"] = false;
2269 case AMD3DNowAthlon:
2270 Features["3dnowa"] = false;
2271 }
2272}
2273
2274void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002275 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002276 if (Enabled) {
2277 switch (Level) {
2278 case XOP:
2279 Features["xop"] = true;
2280 case FMA4:
2281 Features["fma4"] = true;
2282 setSSELevel(Features, AVX, true);
2283 case SSE4A:
2284 Features["sse4a"] = true;
2285 setSSELevel(Features, SSE3, true);
2286 case NoXOP:
2287 break;
2288 }
2289 return;
2290 }
2291
2292 switch (Level) {
2293 case NoXOP:
2294 case SSE4A:
2295 Features["sse4a"] = false;
2296 case FMA4:
2297 Features["fma4"] = false;
2298 case XOP:
2299 Features["xop"] = false;
2300 }
2301}
2302
Craig Topper86d79ef2013-09-17 04:51:29 +00002303void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2304 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002305 // FIXME: This *really* should not be here. We need some way of translating
2306 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002307 if (Name == "sse4")
2308 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002309
Rafael Espindolae62e2792013-08-20 13:44:29 +00002310 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002311
Craig Topper29561122013-09-19 01:13:07 +00002312 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002313 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002314 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002315 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002316 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002317 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002318 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002319 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002320 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002321 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002322 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002323 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002324 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002325 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002326 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002327 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002328 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002329 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002330 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002331 if (Enabled)
2332 setSSELevel(Features, SSE2, Enabled);
2333 } else if (Name == "pclmul") {
2334 if (Enabled)
2335 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002336 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002337 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002338 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002339 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002340 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002341 setSSELevel(Features, AVX512F, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002342 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002343 if (Enabled)
2344 setSSELevel(Features, AVX512F, Enabled);
2345 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002346 if (Enabled)
2347 setSSELevel(Features, AVX, Enabled);
2348 } else if (Name == "fma4") {
2349 setXOPLevel(Features, FMA4, Enabled);
2350 } else if (Name == "xop") {
2351 setXOPLevel(Features, XOP, Enabled);
2352 } else if (Name == "sse4a") {
2353 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002354 } else if (Name == "f16c") {
2355 if (Enabled)
2356 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002357 } else if (Name == "sha") {
2358 if (Enabled)
2359 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002360 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002361}
2362
Eric Christopher3ff21b32013-10-16 21:26:26 +00002363/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002364/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002365bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002366 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002367 // Remember the maximum enabled sselevel.
2368 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2369 // Ignore disabled features.
2370 if (Features[i][0] == '-')
2371 continue;
2372
Benjamin Kramer27402c62012-03-05 15:10:44 +00002373 StringRef Feature = StringRef(Features[i]).substr(1);
2374
2375 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002376 HasAES = true;
2377 continue;
2378 }
2379
Craig Topper3f122a72012-05-31 05:18:48 +00002380 if (Feature == "pclmul") {
2381 HasPCLMUL = true;
2382 continue;
2383 }
2384
Benjamin Kramer27402c62012-03-05 15:10:44 +00002385 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002386 HasLZCNT = true;
2387 continue;
2388 }
2389
Rafael Espindola89049822013-08-23 20:21:37 +00002390 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002391 HasRDRND = true;
2392 continue;
2393 }
2394
Benjamin Kramer27402c62012-03-05 15:10:44 +00002395 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002396 HasBMI = true;
2397 continue;
2398 }
2399
Benjamin Kramer27402c62012-03-05 15:10:44 +00002400 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002401 HasBMI2 = true;
2402 continue;
2403 }
2404
Benjamin Kramer27402c62012-03-05 15:10:44 +00002405 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002406 HasPOPCNT = true;
2407 continue;
2408 }
2409
Michael Liao625a8752012-11-10 05:17:46 +00002410 if (Feature == "rtm") {
2411 HasRTM = true;
2412 continue;
2413 }
2414
Michael Liao74f4eaf2013-03-26 17:52:08 +00002415 if (Feature == "prfchw") {
2416 HasPRFCHW = true;
2417 continue;
2418 }
2419
Michael Liaoffaae352013-03-29 05:17:55 +00002420 if (Feature == "rdseed") {
2421 HasRDSEED = true;
2422 continue;
2423 }
2424
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002425 if (Feature == "tbm") {
2426 HasTBM = true;
2427 continue;
2428 }
2429
Craig Topperbba778b2012-06-03 21:46:30 +00002430 if (Feature == "fma") {
2431 HasFMA = true;
2432 continue;
2433 }
2434
Manman Rena45358c2012-10-11 00:59:55 +00002435 if (Feature == "f16c") {
2436 HasF16C = true;
2437 continue;
2438 }
2439
Craig Topper679b53a2013-08-21 05:29:10 +00002440 if (Feature == "avx512cd") {
2441 HasAVX512CD = true;
2442 continue;
2443 }
2444
2445 if (Feature == "avx512er") {
2446 HasAVX512ER = true;
2447 continue;
2448 }
2449
2450 if (Feature == "avx512pf") {
2451 HasAVX512PF = true;
2452 continue;
2453 }
2454
Ben Langmuir58078d02013-09-19 13:22:04 +00002455 if (Feature == "sha") {
2456 HasSHA = true;
2457 continue;
2458 }
2459
Nick Lewycky50e8f482013-10-05 20:14:27 +00002460 if (Feature == "cx16") {
2461 HasCX16 = true;
2462 continue;
2463 }
2464
Daniel Dunbar979586e2009-11-11 09:38:56 +00002465 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002466 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002467 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002468 .Case("avx2", AVX2)
2469 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002470 .Case("sse4.2", SSE42)
2471 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002472 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002473 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002474 .Case("sse2", SSE2)
2475 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002476 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002477 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002478
Eli Friedman33465822011-07-08 23:31:17 +00002479 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002480 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002481 .Case("3dnowa", AMD3DNowAthlon)
2482 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002483 .Case("mmx", MMX)
2484 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002485 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002486
2487 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2488 .Case("xop", XOP)
2489 .Case("fma4", FMA4)
2490 .Case("sse4a", SSE4A)
2491 .Default(NoXOP);
2492 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002493 }
Eli Friedman33465822011-07-08 23:31:17 +00002494
Craig Topper7481d8a2013-09-10 06:55:47 +00002495 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2496 // Can't do this earlier because we need to be able to explicitly enable
2497 // popcnt and still disable sse4.2.
2498 if (!HasPOPCNT && SSELevel >= SSE42 &&
2499 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2500 HasPOPCNT = true;
2501 Features.push_back("+popcnt");
2502 }
2503
Yunzhong Gao61089362013-10-16 19:07:02 +00002504 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2505 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2506 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2507 HasPRFCHW = true;
2508 Features.push_back("+prfchw");
2509 }
2510
Rafael Espindolaeb265472013-08-21 21:59:03 +00002511 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2512 // matches the selected sse level.
2513 if (FPMath == FP_SSE && SSELevel < SSE1) {
2514 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2515 return false;
2516 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2517 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2518 return false;
2519 }
2520
Eli Friedman33465822011-07-08 23:31:17 +00002521 // Don't tell the backend if we're turning off mmx; it will end up disabling
2522 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002523 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2524 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002525 std::vector<std::string>::iterator it;
2526 it = std::find(Features.begin(), Features.end(), "-mmx");
2527 if (it != Features.end())
2528 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002529 else if (SSELevel > NoSSE)
2530 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002531 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002532}
Chris Lattnerecd49032009-03-02 22:27:17 +00002533
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002534/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2535/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002536void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002537 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002538 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002539 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002540 Builder.defineMacro("__amd64__");
2541 Builder.defineMacro("__amd64");
2542 Builder.defineMacro("__x86_64");
2543 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002544 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002545 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002546 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002547
Chris Lattnerecd49032009-03-02 22:27:17 +00002548 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002549 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2550 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002551 switch (CPU) {
2552 case CK_Generic:
2553 break;
2554 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002555 // The rest are coming from the i386 define above.
2556 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002557 break;
2558 case CK_i486:
2559 case CK_WinChipC6:
2560 case CK_WinChip2:
2561 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002562 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002563 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002564 case CK_PentiumMMX:
2565 Builder.defineMacro("__pentium_mmx__");
2566 Builder.defineMacro("__tune_pentium_mmx__");
2567 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002568 case CK_i586:
2569 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002570 defineCPUMacros(Builder, "i586");
2571 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002572 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002573 case CK_Pentium3:
2574 case CK_Pentium3M:
2575 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002576 Builder.defineMacro("__tune_pentium3__");
2577 // Fallthrough
2578 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002579 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002580 Builder.defineMacro("__tune_pentium2__");
2581 // Fallthrough
2582 case CK_PentiumPro:
2583 Builder.defineMacro("__tune_i686__");
2584 Builder.defineMacro("__tune_pentiumpro__");
2585 // Fallthrough
2586 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002587 Builder.defineMacro("__i686");
2588 Builder.defineMacro("__i686__");
2589 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2590 Builder.defineMacro("__pentiumpro");
2591 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002592 break;
2593 case CK_Pentium4:
2594 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002595 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002596 break;
2597 case CK_Yonah:
2598 case CK_Prescott:
2599 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002600 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002601 break;
2602 case CK_Core2:
2603 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002604 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002605 break;
2606 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002607 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002608 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002609 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002610 defineCPUMacros(Builder, "slm");
2611 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002612 case CK_Corei7:
2613 case CK_Corei7AVX:
2614 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002615 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002616 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002617 break;
Craig Topper449314e2013-08-20 07:09:39 +00002618 case CK_KNL:
2619 defineCPUMacros(Builder, "knl");
2620 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002621 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002622 Builder.defineMacro("__k6_2__");
2623 Builder.defineMacro("__tune_k6_2__");
2624 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002625 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002626 if (CPU != CK_K6_2) { // In case of fallthrough
2627 // FIXME: GCC may be enabling these in cases where some other k6
2628 // architecture is specified but -m3dnow is explicitly provided. The
2629 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002630 Builder.defineMacro("__k6_3__");
2631 Builder.defineMacro("__tune_k6_3__");
2632 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002633 // Fallthrough
2634 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002635 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002636 break;
2637 case CK_Athlon:
2638 case CK_AthlonThunderbird:
2639 case CK_Athlon4:
2640 case CK_AthlonXP:
2641 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002642 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002643 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002644 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002645 Builder.defineMacro("__tune_athlon_sse__");
2646 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002647 break;
2648 case CK_K8:
2649 case CK_K8SSE3:
2650 case CK_x86_64:
2651 case CK_Opteron:
2652 case CK_OpteronSSE3:
2653 case CK_Athlon64:
2654 case CK_Athlon64SSE3:
2655 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002656 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002657 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002658 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002659 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002660 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002661 case CK_BTVER1:
2662 defineCPUMacros(Builder, "btver1");
2663 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002664 case CK_BTVER2:
2665 defineCPUMacros(Builder, "btver2");
2666 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002667 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002668 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002669 break;
2670 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002671 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002672 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002673 case CK_BDVER3:
2674 defineCPUMacros(Builder, "bdver3");
2675 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002676 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002677 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002678 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002679 }
Chris Lattner96e43572009-03-02 22:40:39 +00002680
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002681 // Target properties.
2682 Builder.defineMacro("__LITTLE_ENDIAN__");
2683 Builder.defineMacro("__REGISTER_PREFIX__", "");
2684
Chris Lattner6df41af2009-04-19 17:32:33 +00002685 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2686 // functions in glibc header files that use FP Stack inline asm which the
2687 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002688 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002689
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002690 if (HasAES)
2691 Builder.defineMacro("__AES__");
2692
Craig Topper3f122a72012-05-31 05:18:48 +00002693 if (HasPCLMUL)
2694 Builder.defineMacro("__PCLMUL__");
2695
Craig Topper22967d42011-12-25 05:06:45 +00002696 if (HasLZCNT)
2697 Builder.defineMacro("__LZCNT__");
2698
Benjamin Kramer1e250392012-07-07 09:39:18 +00002699 if (HasRDRND)
2700 Builder.defineMacro("__RDRND__");
2701
Craig Topper22967d42011-12-25 05:06:45 +00002702 if (HasBMI)
2703 Builder.defineMacro("__BMI__");
2704
2705 if (HasBMI2)
2706 Builder.defineMacro("__BMI2__");
2707
Craig Topper1de83482011-12-29 16:10:46 +00002708 if (HasPOPCNT)
2709 Builder.defineMacro("__POPCNT__");
2710
Michael Liao625a8752012-11-10 05:17:46 +00002711 if (HasRTM)
2712 Builder.defineMacro("__RTM__");
2713
Michael Liao74f4eaf2013-03-26 17:52:08 +00002714 if (HasPRFCHW)
2715 Builder.defineMacro("__PRFCHW__");
2716
Michael Liaoffaae352013-03-29 05:17:55 +00002717 if (HasRDSEED)
2718 Builder.defineMacro("__RDSEED__");
2719
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002720 if (HasTBM)
2721 Builder.defineMacro("__TBM__");
2722
Rafael Espindolae62e2792013-08-20 13:44:29 +00002723 switch (XOPLevel) {
2724 case XOP:
2725 Builder.defineMacro("__XOP__");
2726 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002727 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002728 case SSE4A:
2729 Builder.defineMacro("__SSE4A__");
2730 case NoXOP:
2731 break;
2732 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002733
Craig Topperbba778b2012-06-03 21:46:30 +00002734 if (HasFMA)
2735 Builder.defineMacro("__FMA__");
2736
Manman Rena45358c2012-10-11 00:59:55 +00002737 if (HasF16C)
2738 Builder.defineMacro("__F16C__");
2739
Craig Topper679b53a2013-08-21 05:29:10 +00002740 if (HasAVX512CD)
2741 Builder.defineMacro("__AVX512CD__");
2742 if (HasAVX512ER)
2743 Builder.defineMacro("__AVX512ER__");
2744 if (HasAVX512PF)
2745 Builder.defineMacro("__AVX512PF__");
2746
Ben Langmuir58078d02013-09-19 13:22:04 +00002747 if (HasSHA)
2748 Builder.defineMacro("__SHA__");
2749
Nick Lewycky50e8f482013-10-05 20:14:27 +00002750 if (HasCX16)
2751 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2752
Chris Lattner96e43572009-03-02 22:40:39 +00002753 // Each case falls through to the previous one here.
2754 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002755 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002756 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002757 case AVX2:
2758 Builder.defineMacro("__AVX2__");
2759 case AVX:
2760 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002761 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002762 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002763 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002764 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002765 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002766 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002767 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002768 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002769 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002770 Builder.defineMacro("__SSE2__");
2771 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002772 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002773 Builder.defineMacro("__SSE__");
2774 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002775 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002776 break;
2777 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002778
Derek Schuffc7dd7222012-10-11 15:52:22 +00002779 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002780 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002781 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002782 case AVX2:
2783 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002784 case SSE42:
2785 case SSE41:
2786 case SSSE3:
2787 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002788 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002789 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002790 break;
2791 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002792 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002793 break;
2794 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002795 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002796 }
2797 }
2798
Anders Carlssone437c682010-01-27 03:47:49 +00002799 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002800 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002801 case AMD3DNowAthlon:
2802 Builder.defineMacro("__3dNOW_A__");
2803 case AMD3DNow:
2804 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002805 case MMX:
2806 Builder.defineMacro("__MMX__");
2807 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002808 break;
2809 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002810
2811 if (CPU >= CK_i486) {
2812 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2813 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2814 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2815 }
2816 if (CPU >= CK_i586)
2817 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002818}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002819
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002820bool X86TargetInfo::hasFeature(StringRef Feature) const {
2821 return llvm::StringSwitch<bool>(Feature)
2822 .Case("aes", HasAES)
2823 .Case("avx", SSELevel >= AVX)
2824 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002825 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002826 .Case("avx512cd", HasAVX512CD)
2827 .Case("avx512er", HasAVX512ER)
2828 .Case("avx512pf", HasAVX512PF)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002829 .Case("bmi", HasBMI)
2830 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002831 .Case("cx16", HasCX16)
2832 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002833 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002834 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002835 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002836 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002837 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002838 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2839 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2840 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002841 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002842 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002843 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002844 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002845 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002846 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002847 .Case("sse", SSELevel >= SSE1)
2848 .Case("sse2", SSELevel >= SSE2)
2849 .Case("sse3", SSELevel >= SSE3)
2850 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002851 .Case("sse4.1", SSELevel >= SSE41)
2852 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002853 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002854 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002855 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2856 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002857 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002858 .Default(false);
2859}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002860
Eli Friedman3fd920a2008-08-20 02:34:37 +00002861bool
Anders Carlsson58436352009-02-28 17:11:49 +00002862X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002863 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002864 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002865 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002866 case 'Y': // first letter of a pair:
2867 switch (*(Name+1)) {
2868 default: return false;
2869 case '0': // First SSE register.
2870 case 't': // Any SSE register, when SSE2 is enabled.
2871 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2872 case 'm': // any MMX register, when inter-unit moves enabled.
2873 break; // falls through to setAllowsRegister.
2874 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002875 case 'a': // eax.
2876 case 'b': // ebx.
2877 case 'c': // ecx.
2878 case 'd': // edx.
2879 case 'S': // esi.
2880 case 'D': // edi.
2881 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00002882 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002883 case 't': // top of floating point stack.
2884 case 'u': // second from top of floating point stack.
2885 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002886 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002887 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002888 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002889 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2890 case 'l': // "Index" registers: any general register that can be used as an
2891 // index in a base+index memory access.
2892 Info.setAllowsRegister();
2893 return true;
2894 case 'C': // SSE floating point constant.
2895 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002896 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002897 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002898 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002899 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002900 return true;
2901 }
2902}
2903
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002904
Eli Friedman3fd920a2008-08-20 02:34:37 +00002905std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002906X86TargetInfo::convertConstraint(const char *&Constraint) const {
2907 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002908 case 'a': return std::string("{ax}");
2909 case 'b': return std::string("{bx}");
2910 case 'c': return std::string("{cx}");
2911 case 'd': return std::string("{dx}");
2912 case 'S': return std::string("{si}");
2913 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002914 case 'p': // address
2915 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002916 case 't': // top of floating point stack.
2917 return std::string("{st}");
2918 case 'u': // second from top of floating point stack.
2919 return std::string("{st(1)}"); // second from top of floating point stack.
2920 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002921 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002922 }
2923}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002924} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002925
2926namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002927// X86-32 generic target
2928class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002929public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002930 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002931 DoubleAlign = LongLongAlign = 32;
2932 LongDoubleWidth = 96;
2933 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002934 SuitableAlign = 128;
Rafael Espindola2da35322013-12-16 23:27:41 +00002935 DescriptionString = "e-p:32:32"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00002936 "-f64:32:64-"
Rafael Espindola2da35322013-12-16 23:27:41 +00002937 "f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002938 SizeType = UnsignedInt;
2939 PtrDiffType = SignedInt;
2940 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002941 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002942
2943 // Use fpret for all types.
2944 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2945 (1 << TargetInfo::Double) |
2946 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002947
2948 // x86-32 has atomics up to 8 bytes
2949 // FIXME: Check that we actually have cmpxchg8b before setting
2950 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2951 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002952 }
Meador Inge5d3fb222012-06-16 03:34:49 +00002953 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2954 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002955 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002956
Chris Lattnerd545ad12009-09-23 06:06:36 +00002957 int getEHDataRegisterNumber(unsigned RegNo) const {
2958 if (RegNo == 0) return 0;
2959 if (RegNo == 1) return 2;
2960 return -1;
2961 }
Bill Wendling887b4852012-11-12 06:42:51 +00002962 virtual bool validateInputSize(StringRef Constraint,
2963 unsigned Size) const {
2964 switch (Constraint[0]) {
2965 default: break;
2966 case 'a':
2967 case 'b':
2968 case 'c':
2969 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00002970 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00002971 }
2972
2973 return true;
2974 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002975};
2976} // end anonymous namespace
2977
2978namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002979class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2980public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002981 NetBSDI386TargetInfo(const llvm::Triple &Triple)
2982 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002983
2984 virtual unsigned getFloatEvalMethod() const {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00002985 unsigned Major, Minor, Micro;
2986 getTriple().getOSVersion(Major, Minor, Micro);
2987 // New NetBSD uses the default rounding mode.
2988 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
2989 return X86_32TargetInfo::getFloatEvalMethod();
2990 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002991 return 1;
2992 }
2993};
2994} // end anonymous namespace
2995
2996namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00002997class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2998public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002999 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3000 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003001 SizeType = UnsignedLong;
3002 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003003 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003004 }
3005};
3006} // end anonymous namespace
3007
3008namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003009class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3010public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003011 BitrigI386TargetInfo(const llvm::Triple &Triple)
3012 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003013 SizeType = UnsignedLong;
3014 IntPtrType = SignedLong;
3015 PtrDiffType = SignedLong;
3016 }
3017};
3018} // end anonymous namespace
3019
3020namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003021class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003022public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003023 DarwinI386TargetInfo(const llvm::Triple &Triple)
3024 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003025 LongDoubleWidth = 128;
3026 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003027 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003028 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003029 SizeType = UnsignedLong;
3030 IntPtrType = SignedLong;
Rafael Espindola2da35322013-12-16 23:27:41 +00003031 DescriptionString = "e-p:32:32"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00003032 "-f64:32:64-"
Rafael Espindola2da35322013-12-16 23:27:41 +00003033 "f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003034 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003035 }
3036
Eli Friedman3fd920a2008-08-20 02:34:37 +00003037};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003038} // end anonymous namespace
3039
3040namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003041// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003042class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003043public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003044 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3045 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00003046 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00003047 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003048 DoubleAlign = LongLongAlign = 64;
Rafael Espindola2da35322013-12-16 23:27:41 +00003049 DescriptionString = "e-p:32:32-"
3050 "i64:64-"
3051 "f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003052 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003053 virtual void getTargetDefines(const LangOptions &Opts,
3054 MacroBuilder &Builder) const {
3055 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3056 }
3057};
3058} // end anonymous namespace
3059
3060namespace {
3061
3062// x86-32 Windows Visual Studio target
3063class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
3064public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003065 VisualStudioWindowsX86_32TargetInfo(const llvm::Triple &Triple)
3066 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003067 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003068 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3069 }
3070 virtual void getTargetDefines(const LangOptions &Opts,
3071 MacroBuilder &Builder) const {
3072 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3073 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3074 // The value of the following reflects processor type.
3075 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3076 // We lost the original triple, so we use the default.
3077 Builder.defineMacro("_M_IX86", "600");
3078 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003079};
3080} // end anonymous namespace
3081
3082namespace {
3083// x86-32 MinGW target
3084class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3085public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003086 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3087 : WindowsX86_32TargetInfo(Triple) {}
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003088 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003089 MacroBuilder &Builder) const {
3090 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003091 DefineStd(Builder, "WIN32", Opts);
3092 DefineStd(Builder, "WINNT", Opts);
3093 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003094 Builder.defineMacro("__MSVCRT__");
3095 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003096
3097 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3098 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003099 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003100 // Provide "as-is" __declspec.
3101 Builder.defineMacro("__declspec", "__declspec");
3102 else
3103 // Provide alias of __attribute__ like mingw32-gcc.
3104 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003105 }
3106};
3107} // end anonymous namespace
3108
3109namespace {
3110// x86-32 Cygwin target
3111class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3112public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003113 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3114 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003115 TLSSupported = false;
3116 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003117 DoubleAlign = LongLongAlign = 64;
Rafael Espindola2da35322013-12-16 23:27:41 +00003118 DescriptionString = "e-p:32:32-"
3119 "i64:64-"
3120 "f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003121 }
3122 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003123 MacroBuilder &Builder) const {
3124 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003125 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003126 Builder.defineMacro("__CYGWIN__");
3127 Builder.defineMacro("__CYGWIN32__");
3128 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003129 if (Opts.CPlusPlus)
3130 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003131 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003132};
3133} // end anonymous namespace
3134
3135namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003136// x86-32 Haiku target
3137class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3138public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003139 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003140 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003141 IntPtrType = SignedLong;
3142 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003143 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003144 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003145 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003146 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00003147 virtual void getTargetDefines(const LangOptions &Opts,
3148 MacroBuilder &Builder) const {
3149 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3150 Builder.defineMacro("__INTEL__");
3151 Builder.defineMacro("__HAIKU__");
3152 }
3153};
3154} // end anonymous namespace
3155
Douglas Gregor9fabd852011-07-01 22:41:14 +00003156// RTEMS Target
3157template<typename Target>
3158class RTEMSTargetInfo : public OSTargetInfo<Target> {
3159protected:
3160 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3161 MacroBuilder &Builder) const {
3162 // RTEMS defines; list based off of gcc output
3163
Douglas Gregor9fabd852011-07-01 22:41:14 +00003164 Builder.defineMacro("__rtems__");
3165 Builder.defineMacro("__ELF__");
3166 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003167
Douglas Gregor9fabd852011-07-01 22:41:14 +00003168public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003169 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3170 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003171
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003172 switch (Triple.getArch()) {
3173 default:
3174 case llvm::Triple::x86:
3175 // this->MCountName = ".mcount";
3176 break;
3177 case llvm::Triple::mips:
3178 case llvm::Triple::mipsel:
3179 case llvm::Triple::ppc:
3180 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003181 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003182 // this->MCountName = "_mcount";
3183 break;
3184 case llvm::Triple::arm:
3185 // this->MCountName = "__mcount";
3186 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003187 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003188 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003189};
3190
3191namespace {
3192// x86-32 RTEMS target
3193class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3194public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003195 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003196 SizeType = UnsignedLong;
3197 IntPtrType = SignedLong;
3198 PtrDiffType = SignedLong;
3199 this->UserLabelPrefix = "";
3200 }
3201 virtual void getTargetDefines(const LangOptions &Opts,
3202 MacroBuilder &Builder) const {
3203 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3204 Builder.defineMacro("__INTEL__");
3205 Builder.defineMacro("__rtems__");
3206 }
3207};
3208} // end anonymous namespace
3209
Chris Lattnerb986aba2010-04-11 19:29:39 +00003210namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003211// x86-64 generic target
3212class X86_64TargetInfo : public X86TargetInfo {
3213public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003214 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00003215 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003216 LongDoubleWidth = 128;
3217 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003218 LargeArrayMinWidth = 128;
3219 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003220 SuitableAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003221 IntMaxType = SignedLong;
3222 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003223 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003224 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003225
Rafael Espindola8ddf8bc2013-12-17 00:04:48 +00003226 DescriptionString = "e-i64:64-f80:128-s:64-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003227
3228 // Use fpret only for long double.
3229 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003230
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003231 // Use fp2ret for _Complex long double.
3232 ComplexLongDoubleUsesFP2Ret = true;
3233
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003234 // x86-64 has atomics up to 16 bytes.
3235 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3236 // on CPUs with cmpxchg16b
3237 MaxAtomicPromoteWidth = 128;
3238 MaxAtomicInlineWidth = 64;
Chris Lattner10a5b382007-01-29 05:24:35 +00003239 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003240 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3241 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003242 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003243
Chris Lattnerd545ad12009-09-23 06:06:36 +00003244 int getEHDataRegisterNumber(unsigned RegNo) const {
3245 if (RegNo == 0) return 0;
3246 if (RegNo == 1) return 1;
3247 return -1;
3248 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003249
3250 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
Charles Davisb5a214e2013-08-30 04:39:01 +00003251 return (CC == CC_C ||
3252 CC == CC_IntelOclBicc ||
3253 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003254 }
3255
Aaron Ballman02df2e02012-12-09 17:45:41 +00003256 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
3257 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003258 }
3259
Eli Friedman3fd920a2008-08-20 02:34:37 +00003260};
3261} // end anonymous namespace
3262
3263namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003264// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003265class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003266public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003267 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3268 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003269 TLSSupported = false;
3270 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003271 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003272 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003273 IntMaxType = SignedLongLong;
3274 UIntMaxType = UnsignedLongLong;
3275 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003276 SizeType = UnsignedLongLong;
3277 PtrDiffType = SignedLongLong;
3278 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003279 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003280 }
3281 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003282 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003283 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003284 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003285 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003286 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3287 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003288 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003289 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3290 return (CC == CC_C ||
3291 CC == CC_IntelOclBicc ||
3292 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3293 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003294};
3295} // end anonymous namespace
3296
3297namespace {
3298// x86-64 Windows Visual Studio target
3299class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
3300public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003301 VisualStudioWindowsX86_64TargetInfo(const llvm::Triple &Triple)
3302 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003303 LongDoubleWidth = LongDoubleAlign = 64;
3304 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003305 }
3306 virtual void getTargetDefines(const LangOptions &Opts,
3307 MacroBuilder &Builder) const {
3308 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3309 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003310 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003311 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003312 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003313};
3314} // end anonymous namespace
3315
3316namespace {
3317// x86-64 MinGW target
3318class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3319public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003320 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3321 : WindowsX86_64TargetInfo(Triple) {}
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003322 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003323 MacroBuilder &Builder) const {
3324 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003325 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003326 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00003327 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003328 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003329
3330 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3331 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003332 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003333 // Provide "as-is" __declspec.
3334 Builder.defineMacro("__declspec", "__declspec");
3335 else
3336 // Provide alias of __attribute__ like mingw32-gcc.
3337 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003338 }
3339};
3340} // end anonymous namespace
3341
3342namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003343class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3344public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003345 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3346 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003347 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003348 MaxVectorAlign = 256;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003349 }
3350};
3351} // end anonymous namespace
3352
3353namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003354class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3355public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003356 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3357 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003358 IntMaxType = SignedLongLong;
3359 UIntMaxType = UnsignedLongLong;
3360 Int64Type = SignedLongLong;
3361 }
3362};
3363} // end anonymous namespace
3364
3365namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003366class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3367public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003368 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3369 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3370 IntMaxType = SignedLongLong;
3371 UIntMaxType = UnsignedLongLong;
3372 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003373 }
3374};
Tim Northover9bb857a2013-01-31 12:13:10 +00003375}
3376
3377namespace {
3378class AArch64TargetInfo : public TargetInfo {
3379 static const char * const GCCRegNames[];
3380 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003381
Tim Northover2fe823a2013-08-01 09:23:19 +00003382 enum FPUModeEnum {
3383 FPUMode,
3384 NeonMode
3385 };
3386
3387 unsigned FPU;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003388 unsigned Crypto;
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003389 static const Builtin::Info BuiltinInfo[];
Tim Northover2fe823a2013-08-01 09:23:19 +00003390
Tim Northover9bb857a2013-01-31 12:13:10 +00003391public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003392 AArch64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Tim Northover9bb857a2013-01-31 12:13:10 +00003393 BigEndian = false;
3394 LongWidth = LongAlign = 64;
3395 LongDoubleWidth = LongDoubleAlign = 128;
3396 PointerWidth = PointerAlign = 64;
3397 SuitableAlign = 128;
Rafael Espindolac2e60f52013-12-17 23:30:58 +00003398 DescriptionString = "e-i64:64-i128:128-s:32-n32:64-S128";
Tim Northover9bb857a2013-01-31 12:13:10 +00003399
3400 WCharType = UnsignedInt;
3401 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3402
Tim Northover847d2d42013-02-18 12:11:32 +00003403 // AArch64 backend supports 64-bit operations at the moment. In principle
3404 // 128-bit is possible if register-pairs are used.
3405 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3406
Tim Northover9bb857a2013-01-31 12:13:10 +00003407 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3408 }
3409 virtual void getTargetDefines(const LangOptions &Opts,
3410 MacroBuilder &Builder) const {
3411 // GCC defines theses currently
3412 Builder.defineMacro("__aarch64__");
3413 Builder.defineMacro("__AARCH64EL__");
3414
3415 // ACLE predefines. Many can only have one possible value on v8 AArch64.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003416 Builder.defineMacro("__ARM_ACLE", "200");
Tim Northoverb85654d2013-04-05 14:08:55 +00003417 Builder.defineMacro("__ARM_ARCH", "8");
3418 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
Tim Northover9bb857a2013-01-31 12:13:10 +00003419
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003420 Builder.defineMacro("__ARM_64BIT_STATE");
3421 Builder.defineMacro("__ARM_PCS_AAPCS64");
3422 Builder.defineMacro("__ARM_ARCH_ISA_A64");
3423
Tim Northoverb85654d2013-04-05 14:08:55 +00003424 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
3425 Builder.defineMacro("__ARM_FEATURE_CLZ");
3426 Builder.defineMacro("__ARM_FEATURE_FMA");
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003427 Builder.defineMacro("__ARM_FEATURE_DIV");
Tim Northover9bb857a2013-01-31 12:13:10 +00003428
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003429 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
Tim Northover9bb857a2013-01-31 12:13:10 +00003430
3431 // 0xe implies support for half, single and double precision operations.
Tim Northoverb85654d2013-04-05 14:08:55 +00003432 Builder.defineMacro("__ARM_FP", "0xe");
Tim Northover9bb857a2013-01-31 12:13:10 +00003433
3434 // PCS specifies this for SysV variants, which is all we support. Other ABIs
Tim Northoverb85654d2013-04-05 14:08:55 +00003435 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
3436 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
Tim Northover9bb857a2013-01-31 12:13:10 +00003437
3438 if (Opts.FastMath || Opts.FiniteMathOnly)
Tim Northoverb85654d2013-04-05 14:08:55 +00003439 Builder.defineMacro("__ARM_FP_FAST");
Tim Northover9bb857a2013-01-31 12:13:10 +00003440
3441 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
Tim Northoverb85654d2013-04-05 14:08:55 +00003442 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
Tim Northover9bb857a2013-01-31 12:13:10 +00003443
Tim Northoverb85654d2013-04-05 14:08:55 +00003444 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
Tim Northover9bb857a2013-01-31 12:13:10 +00003445 Opts.ShortWChar ? "2" : "4");
3446
Tim Northoverb85654d2013-04-05 14:08:55 +00003447 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
Tim Northover9bb857a2013-01-31 12:13:10 +00003448 Opts.ShortEnums ? "1" : "4");
3449
3450 if (BigEndian)
Tim Northover2fe823a2013-08-01 09:23:19 +00003451 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3452
3453 if (FPU == NeonMode) {
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003454 Builder.defineMacro("__ARM_NEON");
Tim Northover2fe823a2013-08-01 09:23:19 +00003455 // 64-bit NEON supports half, single and double precision operations.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003456 Builder.defineMacro("__ARM_NEON_FP", "7");
3457 }
3458
3459 if (Crypto) {
3460 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northover2fe823a2013-08-01 09:23:19 +00003461 }
Tim Northover9bb857a2013-01-31 12:13:10 +00003462 }
3463 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3464 unsigned &NumRecords) const {
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003465 Records = BuiltinInfo;
3466 NumRecords = clang::AArch64::LastTSBuiltin-Builtin::FirstTSBuiltin;
Tim Northover9bb857a2013-01-31 12:13:10 +00003467 }
3468 virtual bool hasFeature(StringRef Feature) const {
Tim Northover2fe823a2013-08-01 09:23:19 +00003469 return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode);
Tim Northover9bb857a2013-01-31 12:13:10 +00003470 }
Tim Northover2fe823a2013-08-01 09:23:19 +00003471
Amara Emerson703da2e2013-10-31 09:32:33 +00003472 virtual bool setCPU(const std::string &Name) {
3473 return llvm::StringSwitch<bool>(Name)
3474 .Case("generic", true)
3475 .Cases("cortex-a53", "cortex-a57", true)
3476 .Default(false);
3477 }
3478
Eric Christopher3ff21b32013-10-16 21:26:26 +00003479 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003480 DiagnosticsEngine &Diags) {
Tim Northover2fe823a2013-08-01 09:23:19 +00003481 FPU = FPUMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003482 Crypto = 0;
Tim Northover2fe823a2013-08-01 09:23:19 +00003483 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3484 if (Features[i] == "+neon")
3485 FPU = NeonMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003486 if (Features[i] == "+crypto")
3487 Crypto = 1;
Tim Northover2fe823a2013-08-01 09:23:19 +00003488 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00003489 return true;
Tim Northover2fe823a2013-08-01 09:23:19 +00003490 }
3491
3492 virtual void getGCCRegNames(const char *const *&Names,
Tim Northover9bb857a2013-01-31 12:13:10 +00003493 unsigned &NumNames) const;
3494 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3495 unsigned &NumAliases) const;
3496
3497 virtual bool isCLZForZeroUndef() const { return false; }
3498
3499 virtual bool validateAsmConstraint(const char *&Name,
3500 TargetInfo::ConstraintInfo &Info) const {
3501 switch (*Name) {
3502 default: return false;
3503 case 'w': // An FP/SIMD vector register
3504 Info.setAllowsRegister();
3505 return true;
3506 case 'I': // Constant that can be used with an ADD instruction
3507 case 'J': // Constant that can be used with a SUB instruction
3508 case 'K': // Constant that can be used with a 32-bit logical instruction
3509 case 'L': // Constant that can be used with a 64-bit logical instruction
3510 case 'M': // Constant that can be used as a 32-bit MOV immediate
3511 case 'N': // Constant that can be used as a 64-bit MOV immediate
3512 case 'Y': // Floating point constant zero
3513 case 'Z': // Integer constant zero
3514 return true;
3515 case 'Q': // A memory reference with base register and no offset
3516 Info.setAllowsMemory();
3517 return true;
3518 case 'S': // A symbolic address
3519 Info.setAllowsRegister();
3520 return true;
3521 case 'U':
3522 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3523 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3524 // Usa: An absolute symbolic address
3525 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3526 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3527 }
3528 }
3529
3530 virtual const char *getClobbers() const {
3531 // There are no AArch64 clobbers shared by all asm statements.
3532 return "";
3533 }
3534
3535 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3536 return TargetInfo::AArch64ABIBuiltinVaList;
3537 }
3538};
3539
3540const char * const AArch64TargetInfo::GCCRegNames[] = {
3541 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3542 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3543 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3544 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3545
3546 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3547 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3548 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3549 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3550
3551 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3552 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3553 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3554 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3555
3556 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3557 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3558 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3559 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3560
3561 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3562 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3563 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3564 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3565
3566 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3567 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3568 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3569 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3570
3571 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3572 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3573 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3574 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3575};
3576
3577void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3578 unsigned &NumNames) const {
3579 Names = GCCRegNames;
3580 NumNames = llvm::array_lengthof(GCCRegNames);
3581}
3582
3583const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3584 { { "x16" }, "ip0"},
3585 { { "x17" }, "ip1"},
3586 { { "x29" }, "fp" },
3587 { { "x30" }, "lr" }
3588};
3589
3590void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3591 unsigned &NumAliases) const {
3592 Aliases = GCCRegAliases;
3593 NumAliases = llvm::array_lengthof(GCCRegAliases);
3594
3595}
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003596
3597const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
3598#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3599#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3600 ALL_LANGUAGES },
3601#include "clang/Basic/BuiltinsAArch64.def"
3602};
3603
Eli Friedman9fa28852012-08-08 23:57:20 +00003604} // end anonymous namespace
3605
3606namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003607class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003608 // Possible FPU choices.
3609 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003610 VFP2FPU = (1 << 0),
3611 VFP3FPU = (1 << 1),
3612 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003613 NeonFPU = (1 << 3),
3614 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003615 };
3616
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003617 // Possible HWDiv features.
3618 enum HWDivMode {
3619 HWDivThumb = (1 << 0),
3620 HWDivARM = (1 << 1)
3621 };
3622
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003623 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003624 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003625 }
3626
3627 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3628 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003629
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003630 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003631
Rafael Espindolaeb265472013-08-21 21:59:03 +00003632 enum {
3633 FP_Default,
3634 FP_VFP,
3635 FP_Neon
3636 } FPMath;
3637
Bernard Ogdenda13af32013-10-24 18:32:51 +00003638 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003639
Logan Chien57086ce2012-10-10 06:56:20 +00003640 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003641 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003642 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003643
3644 // Initialized via features.
3645 unsigned SoftFloat : 1;
3646 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003647
Bernard Ogden18b57012013-10-29 09:47:51 +00003648 unsigned CRC : 1;
3649
Chris Lattner5cc15e02010-03-03 19:03:45 +00003650 static const Builtin::Info BuiltinInfo[];
3651
Rafael Espindola101d5b92013-05-13 20:09:47 +00003652 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3653 // On linux, binaries targeting old cpus call functions in libgcc to
3654 // perform atomic operations. The implementation in libgcc then calls into
3655 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3656 // is that if we assume the kernel is at least as recent as the hardware,
3657 // it is safe to use atomic instructions on armv6 and newer.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003658 if (!T.isOSLinux() &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003659 T.getOS() != llvm::Triple::FreeBSD &&
Joerg Sonnenbergerfbd51be2013-12-02 16:12:05 +00003660 T.getOS() != llvm::Triple::NetBSD &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003661 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten60afa2d2013-06-15 09:40:14 +00003662 return false;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003663 StringRef ArchName = T.getArchName();
Rafael Espindola92dbc312013-05-14 00:44:24 +00003664 if (T.getArch() == llvm::Triple::arm) {
3665 if (!ArchName.startswith("armv"))
3666 return false;
3667 StringRef VersionStr = ArchName.substr(4);
3668 unsigned Version;
3669 if (VersionStr.getAsInteger(10, Version))
3670 return false;
3671 return Version >= 6;
3672 }
3673 assert(T.getArch() == llvm::Triple::thumb);
3674 if (!ArchName.startswith("thumbv"))
3675 return false;
3676 StringRef VersionStr = ArchName.substr(6);
3677 unsigned Version;
3678 if (VersionStr.getAsInteger(10, Version))
3679 return false;
3680 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003681 }
3682
Chris Lattner17df24e2008-04-21 18:56:49 +00003683public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003684 ARMTargetInfo(const llvm::Triple &Triple)
3685 : TargetInfo(Triple), ABI("aapcs-linux"), CPU("arm1136j-s"),
Rafael Espindolaeb265472013-08-21 21:59:03 +00003686 FPMath(FP_Default), IsAAPCS(true) {
Eli Friedman803acb32011-12-22 03:51:45 +00003687 BigEndian = false;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003688 switch (getTriple().getOS()) {
3689 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003690 SizeType = UnsignedLong;
3691 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003692 WCharType = SignedInt;
3693 break;
3694 default:
3695 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3696 WCharType = UnsignedInt;
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003697 SizeType = UnsignedInt;
3698 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003699 break;
3700 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003701
Chris Lattner1a8f3942010-04-23 16:29:58 +00003702 // {} in inline assembly are neon specifiers, not assembly variant
3703 // specifiers.
3704 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003705
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003706 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003707 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar03184792009-09-22 21:44:58 +00003708 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00003709 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3710 // so set preferred for small types to 32.
Rafael Espindola2da35322013-12-16 23:27:41 +00003711 DescriptionString = ("e-p:32:32-i1:8:32-i8:8:32-i16:16:32-"
3712 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00003713 "v128:64:128-a:0:32-n32-S64");
Daniel Dunbar03184792009-09-22 21:44:58 +00003714 } else {
Rafael Espindola2da35322013-12-16 23:27:41 +00003715 DescriptionString = ("e-p:32:32-"
3716 "i64:64-"
Rafael Espindola61a69252013-12-16 21:51:30 +00003717 "v128:64:128-n32-S64");
Daniel Dunbar03184792009-09-22 21:44:58 +00003718 }
John McCall86353412010-08-21 22:46:04 +00003719
3720 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003721 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003722
3723 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003724 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003725 if (shouldUseInlineAtomic(getTriple()))
3726 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003727
3728 // Do force alignment of members that follow zero length bitfields. If
3729 // the alignment of the zero-length bitfield is greater than the member
3730 // that follows it, `bar', `bar' will be aligned as the type of the
3731 // zero length bitfield.
3732 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003733 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003734 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003735 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003736 ABI = Name;
3737
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003738 // The defaults (above) are for AAPCS, check if we need to change them.
3739 //
3740 // FIXME: We need support for -meabi... we could just mangle it into the
3741 // name.
3742 if (Name == "apcs-gnu") {
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003743 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003744 // size_t is unsigned int on FreeBSD.
3745 if (getTriple().getOS() != llvm::Triple::FreeBSD)
3746 SizeType = UnsignedLong;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003747
James Molloyc445be42011-11-23 13:35:08 +00003748 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3749 WCharType = SignedInt;
3750
Daniel Dunbarf8125062010-04-22 16:14:54 +00003751 // Do not respect the alignment of bit-field types when laying out
3752 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3753 UseBitFieldTypeAlignment = false;
3754
Chad Rosier18903ee2011-08-04 01:21:14 +00003755 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosiera336c6f2011-08-04 17:52:43 +00003756 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3757 /// gcc.
Chad Rosier18903ee2011-08-04 01:21:14 +00003758 ZeroLengthBitfieldBoundary = 32;
3759
Logan Chien57086ce2012-10-10 06:56:20 +00003760 IsAAPCS = false;
3761
Daniel Dunbar03184792009-09-22 21:44:58 +00003762 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00003763 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3764 // so set preferred for small types to 32.
Rafael Espindola2da35322013-12-16 23:27:41 +00003765 DescriptionString = ("e-p:32:32-i1:8:32-i8:8:32-i16:16:32"
Rafael Espindola20b0d922013-12-16 20:34:33 +00003766 "-f64:32:64"
Rafael Espindola32083d52013-12-16 20:21:07 +00003767 "-v64:32:64-v128:32:128-a:0:32-n32-S32");
Daniel Dunbar03184792009-09-22 21:44:58 +00003768 } else {
Rafael Espindola2da35322013-12-16 23:27:41 +00003769 DescriptionString = ("e-p:32:32"
Rafael Espindola20b0d922013-12-16 20:34:33 +00003770 "-f64:32:64"
Rafael Espindola32083d52013-12-16 20:21:07 +00003771 "-v64:32:64-v128:32:128-a:0:32-n32-S32");
Daniel Dunbar03184792009-09-22 21:44:58 +00003772 }
3773
Chad Rosier99ee7822011-07-26 07:03:04 +00003774 // FIXME: Override "preferred align" for double and long long.
David Tweed8f676532012-10-25 13:33:01 +00003775 } else if (Name == "aapcs" || Name == "aapcs-vfp") {
Bob Wilson87b3a182013-06-18 05:36:04 +00003776 // size_t is unsigned long on Darwin.
3777 if (getTriple().isOSDarwin())
3778 SizeType = UnsignedLong;
Logan Chien57086ce2012-10-10 06:56:20 +00003779 IsAAPCS = true;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003780 // FIXME: Enumerated types are variable width in straight AAPCS.
3781 } else if (Name == "aapcs-linux") {
Logan Chien57086ce2012-10-10 06:56:20 +00003782 IsAAPCS = true;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003783 } else
3784 return false;
3785
3786 return true;
3787 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003788
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00003789 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Silviu Barangae5690462013-10-21 10:59:33 +00003790 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003791 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3792 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003793 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3794 CPU == "cortex-a9-mp") {
3795 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003796 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003797 }
3798 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003799 Features["vfp4"] = true;
3800 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003801 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3802 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3803 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003804 Features["vfp4"] = true;
3805 Features["neon"] = true;
3806 Features["hwdiv"] = true;
3807 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003808 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3809 Features["fp-armv8"] = true;
3810 Features["neon"] = true;
3811 Features["hwdiv"] = true;
3812 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003813 Features["crc"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003814 } else if (CPU == "cortex-r5" || CPU == "cortex-m3" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003815 CPU == "cortex-m4" ||
3816 // Enable the hwdiv extension for all v8a AArch32 cores by
3817 // default.
3818 ArchName == "armv8a" || ArchName == "armv8" ||
3819 ArchName == "thumbv8a" || ArchName == "thumbv8") {
3820 Features["hwdiv"] = true;
3821 Features["hwdiv-arm"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003822 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003823 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003824
Eric Christopher3ff21b32013-10-16 21:26:26 +00003825 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003826 DiagnosticsEngine &Diags) {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003827 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003828 CRC = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003829 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003830 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003831 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3832 if (Features[i] == "+soft-float")
3833 SoftFloat = true;
3834 else if (Features[i] == "+soft-float-abi")
3835 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003836 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003837 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003838 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003839 FPU |= VFP3FPU;
3840 else if (Features[i] == "+vfp4")
3841 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003842 else if (Features[i] == "+fp-armv8")
3843 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003844 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003845 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003846 else if (Features[i] == "+hwdiv")
3847 HWDiv |= HWDivThumb;
3848 else if (Features[i] == "+hwdiv-arm")
3849 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00003850 else if (Features[i] == "+crc")
3851 CRC = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003852 }
3853
Rafael Espindolaeb265472013-08-21 21:59:03 +00003854 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3855 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3856 return false;
3857 }
3858
3859 if (FPMath == FP_Neon)
3860 Features.push_back("+neonfp");
3861 else if (FPMath == FP_VFP)
3862 Features.push_back("-neonfp");
3863
Daniel Dunbar893d4752009-12-19 04:15:38 +00003864 // Remove front-end specific options which the backend handles differently.
3865 std::vector<std::string>::iterator it;
3866 it = std::find(Features.begin(), Features.end(), "+soft-float");
3867 if (it != Features.end())
3868 Features.erase(it);
3869 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3870 if (it != Features.end())
3871 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00003872 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003873 }
3874
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003875 virtual bool hasFeature(StringRef Feature) const {
3876 return llvm::StringSwitch<bool>(Feature)
3877 .Case("arm", true)
3878 .Case("softfloat", SoftFloat)
3879 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003880 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003881 .Case("hwdiv", HWDiv & HWDivThumb)
3882 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003883 .Default(false);
3884 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003885 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003886 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003887 return llvm::StringSwitch<const char*>(Name)
3888 .Cases("arm8", "arm810", "4")
3889 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3890 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3891 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3892 .Case("ep9312", "4T")
3893 .Cases("arm10tdmi", "arm1020t", "5T")
3894 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3895 .Case("arm926ej-s", "5TEJ")
3896 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3897 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003898 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003899 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003900 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003901 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonf643afc2013-03-04 22:37:46 +00003902 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003903 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003904 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003905 .Case("cortex-a9-mp", "7F")
3906 .Case("swift", "7S")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003907 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003908 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003909 .Cases("cortex-a53", "cortex-a57", "8A")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003910 .Default(0);
3911 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003912 static const char *getCPUProfile(StringRef Name) {
3913 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003914 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003915 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003916 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003917 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00003918 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00003919 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003920 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003921 virtual bool setCPU(const std::string &Name) {
3922 if (!getCPUDefineSuffix(Name))
3923 return false;
3924
3925 CPU = Name;
3926 return true;
3927 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00003928 virtual bool setFPMath(StringRef Name);
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003929 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003930 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003931 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003932 Builder.defineMacro("__arm");
3933 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003934
Chris Lattnerecd49032009-03-02 22:27:17 +00003935 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003936 Builder.defineMacro("__ARMEL__");
3937 Builder.defineMacro("__LITTLE_ENDIAN__");
3938 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003939
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003940 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003941 unsigned int CPUArchVer;
3942 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
3943 llvm_unreachable("Invalid char for architecture version number");
3944 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003945 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003946 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3947 StringRef CPUProfile = getCPUProfile(CPU);
3948 if (!CPUProfile.empty())
3949 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3950
Mike Stump9d54bd72009-04-08 02:07:04 +00003951 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003952
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003953 // FIXME: It's more complicated than this and we don't really support
3954 // interworking.
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003955 if (5 <= CPUArchVer && CPUArchVer <= 7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003956 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003957
David Tweed8f676532012-10-25 13:33:01 +00003958 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00003959 // Embedded targets on Darwin follow AAPCS, but not EABI.
3960 if (!getTriple().isOSDarwin())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00003961 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003962 Builder.defineMacro("__ARM_PCS", "1");
3963
David Tweed8f676532012-10-25 13:33:01 +00003964 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003965 Builder.defineMacro("__ARM_PCS_VFP", "1");
3966 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003967
Daniel Dunbar893d4752009-12-19 04:15:38 +00003968 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003969 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003970
3971 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003972 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003973
3974 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003975 Builder.defineMacro("__THUMBEL__");
3976 Builder.defineMacro("__thumb__");
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003977 if (CPUArch == "6T2" || CPUArchVer == 7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003978 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003979 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003980 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
3981 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003982
3983 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003984 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003985
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003986 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003987 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003988 if (FPU & VFP2FPU)
3989 Builder.defineMacro("__ARM_VFPV2__");
3990 if (FPU & VFP3FPU)
3991 Builder.defineMacro("__ARM_VFPV3__");
3992 if (FPU & VFP4FPU)
3993 Builder.defineMacro("__ARM_VFPV4__");
3994 }
3995
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003996 // This only gets set when Neon instructions are actually available, unlike
3997 // the VFP define, hence the soft float and arch check. This is subtly
3998 // different from gcc, we follow the intent which was that it should be set
3999 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004000 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4001 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004002 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004003 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004004
Bernard Ogden18b57012013-10-29 09:47:51 +00004005 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004006 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004007
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004008 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004009 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4010 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4011 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4012 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4013 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004014 }
4015 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4016 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004017 Records = BuiltinInfo;
4018 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004019 }
Bob Wilsona7a61e22012-01-26 22:14:27 +00004020 virtual bool isCLZForZeroUndef() const { return false; }
Meador Inge5d3fb222012-06-16 03:34:49 +00004021 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Logan Chien57086ce2012-10-10 06:56:20 +00004022 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004023 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004024 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004025 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004026 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004027 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004028 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004029 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004030 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004031 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004032 case 'l': // r0-r7
4033 case 'h': // r8-r15
4034 case 'w': // VFP Floating point register single precision
4035 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004036 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004037 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004038 case 'Q': // A memory address that is a single base register.
4039 Info.setAllowsMemory();
4040 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004041 case 'U': // a memory reference...
4042 switch (Name[1]) {
4043 case 'q': // ...ARMV4 ldrsb
4044 case 'v': // ...VFP load/store (reg+constant offset)
4045 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004046 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004047 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004048 case 'n': // valid address for Neon doubleword vector load/store
4049 case 'm': // valid address for Neon element and structure load/store
4050 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004051 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004052 Info.setAllowsMemory();
4053 Name++;
4054 return true;
4055 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004056 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004057 return false;
4058 }
Evan Chengd863adb2011-06-16 19:13:15 +00004059 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004060 std::string R;
4061 switch (*Constraint) {
4062 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004063 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004064 Constraint++;
4065 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004066 case 'p': // 'p' should be translated to 'r' by default.
4067 R = std::string("r");
4068 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004069 default:
4070 return std::string(1, *Constraint);
4071 }
4072 return R;
4073 }
Bill Wendling9d1ee112012-10-25 23:28:48 +00004074 virtual bool validateConstraintModifier(StringRef Constraint,
4075 const char Modifier,
4076 unsigned Size) const {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004077 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004078 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004079
Bill Wendling9d1ee112012-10-25 23:28:48 +00004080 // Strip off constraint modifiers.
4081 while (Constraint[0] == '=' ||
4082 Constraint[0] == '+' ||
4083 Constraint[0] == '&')
4084 Constraint = Constraint.substr(1);
4085
4086 switch (Constraint[0]) {
4087 default: break;
4088 case 'r': {
4089 switch (Modifier) {
4090 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004091 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004092 case 'q':
4093 // A register of size 32 cannot fit a vector type.
4094 return false;
4095 }
4096 }
4097 }
4098
4099 return true;
4100 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004101 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004102 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004103 return "";
4104 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004105
4106 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
4107 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4108 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004109
4110 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4111 if (RegNo == 0) return 0;
4112 if (RegNo == 1) return 1;
4113 return -1;
4114 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004115};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004116
Rafael Espindolaeb265472013-08-21 21:59:03 +00004117bool ARMTargetInfo::setFPMath(StringRef Name) {
4118 if (Name == "neon") {
4119 FPMath = FP_Neon;
4120 return true;
4121 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4122 Name == "vfp4") {
4123 FPMath = FP_VFP;
4124 return true;
4125 }
4126 return false;
4127}
4128
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004129const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004130 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004131 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004132 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4133
4134 // Float registers
4135 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4136 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4137 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004138 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004139
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004140 // Double registers
4141 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4142 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004143 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4144 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004145
4146 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004147 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4148 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004149};
4150
4151void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004152 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004153 Names = GCCRegNames;
4154 NumNames = llvm::array_lengthof(GCCRegNames);
4155}
4156
4157const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004158 { { "a1" }, "r0" },
4159 { { "a2" }, "r1" },
4160 { { "a3" }, "r2" },
4161 { { "a4" }, "r3" },
4162 { { "v1" }, "r4" },
4163 { { "v2" }, "r5" },
4164 { { "v3" }, "r6" },
4165 { { "v4" }, "r7" },
4166 { { "v5" }, "r8" },
4167 { { "v6", "rfp" }, "r9" },
4168 { { "sl" }, "r10" },
4169 { { "fp" }, "r11" },
4170 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004171 { { "r13" }, "sp" },
4172 { { "r14" }, "lr" },
4173 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004174 // The S, D and Q registers overlap, but aren't really aliases; we
4175 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004176};
4177
4178void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4179 unsigned &NumAliases) const {
4180 Aliases = GCCRegAliases;
4181 NumAliases = llvm::array_lengthof(GCCRegAliases);
4182}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004183
4184const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004185#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004186#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004187 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004188#include "clang/Basic/BuiltinsARM.def"
4189};
Chris Lattner17df24e2008-04-21 18:56:49 +00004190} // end anonymous namespace.
4191
Eli Friedmanf05b7722008-08-20 07:44:10 +00004192namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004193class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00004194 public DarwinTargetInfo<ARMTargetInfo> {
4195protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00004196 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004197 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004198 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004199 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004200
Torok Edwinb2b37c62009-06-30 17:10:35 +00004201public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004202 DarwinARMTargetInfo(const llvm::Triple &Triple)
4203 : DarwinTargetInfo<ARMTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004204 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004205 // iOS always has 64-bit atomic instructions.
4206 // FIXME: This should be based off of the target features in ARMTargetInfo.
4207 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004208
4209 // Darwin on iOS uses a variant of the ARM C++ ABI.
4210 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004211 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004212};
4213} // end anonymous namespace.
4214
Tony Linthicum76329bf2011-12-12 21:14:55 +00004215
4216namespace {
4217// Hexagon abstract base class
4218class HexagonTargetInfo : public TargetInfo {
4219 static const Builtin::Info BuiltinInfo[];
4220 static const char * const GCCRegNames[];
4221 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4222 std::string CPU;
4223public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004224 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004225 BigEndian = false;
Rafael Espindola8ddf8bc2013-12-17 00:04:48 +00004226 DescriptionString = ("e-p:32:32-i1:32-i64:64-a:0-n32");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004227
4228 // {} in inline assembly are packet specifiers, not assembly variant
4229 // specifiers.
4230 NoAsmVariants = true;
4231 }
4232
4233 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4234 unsigned &NumRecords) const {
4235 Records = BuiltinInfo;
4236 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4237 }
4238
4239 virtual bool validateAsmConstraint(const char *&Name,
4240 TargetInfo::ConstraintInfo &Info) const {
4241 return true;
4242 }
4243
4244 virtual void getTargetDefines(const LangOptions &Opts,
4245 MacroBuilder &Builder) const;
4246
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004247 virtual bool hasFeature(StringRef Feature) const {
4248 return Feature == "hexagon";
4249 }
4250
Meador Inge5d3fb222012-06-16 03:34:49 +00004251 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4252 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004253 }
4254 virtual void getGCCRegNames(const char * const *&Names,
4255 unsigned &NumNames) const;
4256 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4257 unsigned &NumAliases) const;
4258 virtual const char *getClobbers() const {
4259 return "";
4260 }
Sebastian Pop86500282012-01-13 20:37:10 +00004261
4262 static const char *getHexagonCPUSuffix(StringRef Name) {
4263 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004264 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004265 .Case("hexagonv5", "5")
Sebastian Pop86500282012-01-13 20:37:10 +00004266 .Default(0);
4267 }
4268
Tony Linthicum76329bf2011-12-12 21:14:55 +00004269 virtual bool setCPU(const std::string &Name) {
Sebastian Pop86500282012-01-13 20:37:10 +00004270 if (!getHexagonCPUSuffix(Name))
4271 return false;
4272
Tony Linthicum76329bf2011-12-12 21:14:55 +00004273 CPU = Name;
4274 return true;
4275 }
4276};
4277
4278void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4279 MacroBuilder &Builder) const {
4280 Builder.defineMacro("qdsp6");
4281 Builder.defineMacro("__qdsp6", "1");
4282 Builder.defineMacro("__qdsp6__", "1");
4283
4284 Builder.defineMacro("hexagon");
4285 Builder.defineMacro("__hexagon", "1");
4286 Builder.defineMacro("__hexagon__", "1");
4287
4288 if(CPU == "hexagonv1") {
4289 Builder.defineMacro("__HEXAGON_V1__");
4290 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4291 if(Opts.HexagonQdsp6Compat) {
4292 Builder.defineMacro("__QDSP6_V1__");
4293 Builder.defineMacro("__QDSP6_ARCH__", "1");
4294 }
4295 }
4296 else if(CPU == "hexagonv2") {
4297 Builder.defineMacro("__HEXAGON_V2__");
4298 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4299 if(Opts.HexagonQdsp6Compat) {
4300 Builder.defineMacro("__QDSP6_V2__");
4301 Builder.defineMacro("__QDSP6_ARCH__", "2");
4302 }
4303 }
4304 else if(CPU == "hexagonv3") {
4305 Builder.defineMacro("__HEXAGON_V3__");
4306 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4307 if(Opts.HexagonQdsp6Compat) {
4308 Builder.defineMacro("__QDSP6_V3__");
4309 Builder.defineMacro("__QDSP6_ARCH__", "3");
4310 }
4311 }
4312 else if(CPU == "hexagonv4") {
4313 Builder.defineMacro("__HEXAGON_V4__");
4314 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4315 if(Opts.HexagonQdsp6Compat) {
4316 Builder.defineMacro("__QDSP6_V4__");
4317 Builder.defineMacro("__QDSP6_ARCH__", "4");
4318 }
4319 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004320 else if(CPU == "hexagonv5") {
4321 Builder.defineMacro("__HEXAGON_V5__");
4322 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4323 if(Opts.HexagonQdsp6Compat) {
4324 Builder.defineMacro("__QDSP6_V5__");
4325 Builder.defineMacro("__QDSP6_ARCH__", "5");
4326 }
4327 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004328}
4329
4330const char * const HexagonTargetInfo::GCCRegNames[] = {
4331 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4332 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4333 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4334 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4335 "p0", "p1", "p2", "p3",
4336 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4337};
4338
4339void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4340 unsigned &NumNames) const {
4341 Names = GCCRegNames;
4342 NumNames = llvm::array_lengthof(GCCRegNames);
4343}
4344
4345
4346const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4347 { { "sp" }, "r29" },
4348 { { "fp" }, "r30" },
4349 { { "lr" }, "r31" },
4350 };
4351
4352void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4353 unsigned &NumAliases) const {
4354 Aliases = GCCRegAliases;
4355 NumAliases = llvm::array_lengthof(GCCRegAliases);
4356}
4357
4358
4359const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4360#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4361#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4362 ALL_LANGUAGES },
4363#include "clang/Basic/BuiltinsHexagon.def"
4364};
4365}
4366
4367
Chris Lattner5ba61f02006-10-14 07:39:34 +00004368namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004369// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4370class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004371 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4372 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004373 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004374public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004375 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004376
Eric Christopher3ff21b32013-10-16 21:26:26 +00004377 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00004378 DiagnosticsEngine &Diags) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004379 SoftFloat = false;
4380 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4381 if (Features[i] == "+soft-float")
4382 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004383 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004384 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00004385 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004386 MacroBuilder &Builder) const {
4387 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004388 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004389
4390 if (SoftFloat)
4391 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004392 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004393
4394 virtual bool hasFeature(StringRef Feature) const {
4395 return llvm::StringSwitch<bool>(Feature)
4396 .Case("softfloat", SoftFloat)
4397 .Case("sparc", true)
4398 .Default(false);
4399 }
4400
Gabor Greif49991682008-02-21 16:29:08 +00004401 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4402 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004403 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00004404 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004405 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4406 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00004407 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004408 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00004409 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004410 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00004411 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004412 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00004413 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004414 // FIXME: Implement!
4415 return false;
Gabor Greif49991682008-02-21 16:29:08 +00004416 }
4417 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004418 // FIXME: Implement!
4419 return "";
Gabor Greif49991682008-02-21 16:29:08 +00004420 }
4421};
4422
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004423const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00004424 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4425 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4426 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4427 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4428};
4429
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004430void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4431 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004432 Names = GCCRegNames;
4433 NumNames = llvm::array_lengthof(GCCRegNames);
4434}
4435
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004436const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004437 { { "g0" }, "r0" },
4438 { { "g1" }, "r1" },
4439 { { "g2" }, "r2" },
4440 { { "g3" }, "r3" },
4441 { { "g4" }, "r4" },
4442 { { "g5" }, "r5" },
4443 { { "g6" }, "r6" },
4444 { { "g7" }, "r7" },
4445 { { "o0" }, "r8" },
4446 { { "o1" }, "r9" },
4447 { { "o2" }, "r10" },
4448 { { "o3" }, "r11" },
4449 { { "o4" }, "r12" },
4450 { { "o5" }, "r13" },
4451 { { "o6", "sp" }, "r14" },
4452 { { "o7" }, "r15" },
4453 { { "l0" }, "r16" },
4454 { { "l1" }, "r17" },
4455 { { "l2" }, "r18" },
4456 { { "l3" }, "r19" },
4457 { { "l4" }, "r20" },
4458 { { "l5" }, "r21" },
4459 { { "l6" }, "r22" },
4460 { { "l7" }, "r23" },
4461 { { "i0" }, "r24" },
4462 { { "i1" }, "r25" },
4463 { { "i2" }, "r26" },
4464 { { "i3" }, "r27" },
4465 { { "i4" }, "r28" },
4466 { { "i5" }, "r29" },
4467 { { "i6", "fp" }, "r30" },
4468 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00004469};
4470
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004471void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4472 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004473 Aliases = GCCRegAliases;
4474 NumAliases = llvm::array_lengthof(GCCRegAliases);
4475}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004476
4477// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4478class SparcV8TargetInfo : public SparcTargetInfo {
4479public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004480 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004481 // FIXME: Support Sparc quad-precision long double?
Rafael Espindola2da35322013-12-16 23:27:41 +00004482 DescriptionString = "E-p:32:32-"
4483 "i64:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004484 }
4485
4486 virtual void getTargetDefines(const LangOptions &Opts,
4487 MacroBuilder &Builder) const {
4488 SparcTargetInfo::getTargetDefines(Opts, Builder);
4489 Builder.defineMacro("__sparcv8");
4490 }
4491};
4492
4493// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4494class SparcV9TargetInfo : public SparcTargetInfo {
4495public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004496 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004497 // FIXME: Support Sparc quad-precision long double?
Rafael Espindola47debc02013-12-16 21:59:14 +00004498 DescriptionString = "E-"
Rafael Espindola2da35322013-12-16 23:27:41 +00004499 "i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00004500 // This is an LP64 platform.
4501 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004502
4503 // OpenBSD uses long long for int64_t and intmax_t.
4504 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
4505 IntMaxType = SignedLongLong;
4506 UIntMaxType = UnsignedLongLong;
4507 } else {
4508 IntMaxType = SignedLong;
4509 UIntMaxType = UnsignedLong;
4510 }
4511 Int64Type = IntMaxType;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004512 }
4513
4514 virtual void getTargetDefines(const LangOptions &Opts,
4515 MacroBuilder &Builder) const {
4516 SparcTargetInfo::getTargetDefines(Opts, Builder);
4517 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00004518 Builder.defineMacro("__arch64__");
4519 // Solaris and its derivative AuroraUX don't need these variants, but the
4520 // BSDs do.
4521 if (getTriple().getOS() != llvm::Triple::Solaris &&
4522 getTriple().getOS() != llvm::Triple::AuroraUX) {
4523 Builder.defineMacro("__sparc64__");
4524 Builder.defineMacro("__sparc_v9__");
4525 Builder.defineMacro("__sparcv9__");
4526 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004527 }
4528};
4529
Gabor Greif49991682008-02-21 16:29:08 +00004530} // end anonymous namespace.
4531
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004532namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004533class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4534public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004535 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
4536 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004537 SizeType = UnsignedInt;
4538 PtrDiffType = SignedInt;
4539 }
4540};
Torok Edwinb2b37c62009-06-30 17:10:35 +00004541class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004542public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004543 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
4544 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00004545 SizeType = UnsignedInt;
4546 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004547 }
4548};
4549} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00004550
Chris Lattnerb781dc792008-05-08 05:58:21 +00004551namespace {
Ulrich Weigand47445072013-05-06 16:26:41 +00004552 class SystemZTargetInfo : public TargetInfo {
4553 static const char *const GCCRegNames[];
4554
4555 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004556 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Ulrich Weigand47445072013-05-06 16:26:41 +00004557 TLSSupported = true;
4558 IntWidth = IntAlign = 32;
4559 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
4560 PointerWidth = PointerAlign = 64;
4561 LongDoubleWidth = 128;
4562 LongDoubleAlign = 64;
4563 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4564 MinGlobalAlign = 16;
Rafael Espindola04c685b2013-12-16 22:50:41 +00004565 DescriptionString = "E-i1:8:16-i8:8:16-i64:64"
4566 "-f128:64-a:8:16-n32:64";
Ulrich Weigand47445072013-05-06 16:26:41 +00004567 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4568 }
4569 virtual void getTargetDefines(const LangOptions &Opts,
4570 MacroBuilder &Builder) const {
4571 Builder.defineMacro("__s390__");
4572 Builder.defineMacro("__s390x__");
4573 Builder.defineMacro("__zarch__");
4574 Builder.defineMacro("__LONG_DOUBLE_128__");
4575 }
4576 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4577 unsigned &NumRecords) const {
4578 // FIXME: Implement.
4579 Records = 0;
4580 NumRecords = 0;
4581 }
4582
4583 virtual void getGCCRegNames(const char *const *&Names,
4584 unsigned &NumNames) const;
4585 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4586 unsigned &NumAliases) const {
4587 // No aliases.
4588 Aliases = 0;
4589 NumAliases = 0;
4590 }
4591 virtual bool validateAsmConstraint(const char *&Name,
4592 TargetInfo::ConstraintInfo &info) const;
4593 virtual const char *getClobbers() const {
4594 // FIXME: Is this really right?
4595 return "";
4596 }
4597 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4598 return TargetInfo::SystemZBuiltinVaList;
4599 }
Richard Sandiford4652d892013-07-19 16:51:51 +00004600 virtual bool setCPU(const std::string &Name) {
4601 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4602 .Case("z10", true)
4603 .Case("z196", true)
4604 .Case("zEC12", true)
4605 .Default(false);
4606
4607 // No need to store the CPU yet. There aren't any CPU-specific
4608 // macros to define.
4609 return CPUKnown;
4610 }
Ulrich Weigand47445072013-05-06 16:26:41 +00004611 };
4612
4613 const char *const SystemZTargetInfo::GCCRegNames[] = {
4614 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4615 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4616 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
4617 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
4618 };
4619
4620 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
4621 unsigned &NumNames) const {
4622 Names = GCCRegNames;
4623 NumNames = llvm::array_lengthof(GCCRegNames);
4624 }
4625
4626 bool SystemZTargetInfo::
4627 validateAsmConstraint(const char *&Name,
4628 TargetInfo::ConstraintInfo &Info) const {
4629 switch (*Name) {
4630 default:
4631 return false;
4632
4633 case 'a': // Address register
4634 case 'd': // Data register (equivalent to 'r')
4635 case 'f': // Floating-point register
4636 Info.setAllowsRegister();
4637 return true;
4638
4639 case 'I': // Unsigned 8-bit constant
4640 case 'J': // Unsigned 12-bit constant
4641 case 'K': // Signed 16-bit constant
4642 case 'L': // Signed 20-bit displacement (on all targets we support)
4643 case 'M': // 0x7fffffff
4644 return true;
4645
4646 case 'Q': // Memory with base and unsigned 12-bit displacement
4647 case 'R': // Likewise, plus an index
4648 case 'S': // Memory with base and signed 20-bit displacement
4649 case 'T': // Likewise, plus an index
4650 Info.setAllowsMemory();
4651 return true;
4652 }
4653 }
4654}
4655
4656namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004657 class MSP430TargetInfo : public TargetInfo {
4658 static const char * const GCCRegNames[];
4659 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004660 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004661 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004662 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00004663 IntWidth = 16; IntAlign = 16;
4664 LongWidth = 32; LongLongWidth = 64;
4665 LongAlign = LongLongAlign = 16;
4666 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004667 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004668 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00004669 IntMaxType = SignedLongLong;
4670 UIntMaxType = UnsignedLongLong;
4671 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004672 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00004673 SigAtomicType = SignedLong;
Rafael Espindola2da35322013-12-16 23:27:41 +00004674 DescriptionString = "e-p:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004675 }
4676 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004677 MacroBuilder &Builder) const {
4678 Builder.defineMacro("MSP430");
4679 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004680 // FIXME: defines for different 'flavours' of MCU
4681 }
4682 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4683 unsigned &NumRecords) const {
4684 // FIXME: Implement.
4685 Records = 0;
4686 NumRecords = 0;
4687 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004688 virtual bool hasFeature(StringRef Feature) const {
4689 return Feature == "msp430";
4690 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004691 virtual void getGCCRegNames(const char * const *&Names,
4692 unsigned &NumNames) const;
4693 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4694 unsigned &NumAliases) const {
4695 // No aliases.
4696 Aliases = 0;
4697 NumAliases = 0;
4698 }
4699 virtual bool validateAsmConstraint(const char *&Name,
4700 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00004701 // No target constraints for now.
4702 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004703 }
4704 virtual const char *getClobbers() const {
4705 // FIXME: Is this really right?
4706 return "";
4707 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004708 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004709 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00004710 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004711 }
4712 };
4713
4714 const char * const MSP430TargetInfo::GCCRegNames[] = {
4715 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4716 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4717 };
4718
4719 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4720 unsigned &NumNames) const {
4721 Names = GCCRegNames;
4722 NumNames = llvm::array_lengthof(GCCRegNames);
4723 }
4724}
4725
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00004726namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004727
Mike Stump11289f42009-09-09 15:08:12 +00004728 // LLVM and Clang cannot be used directly to output native binaries for
4729 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00004730 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00004731 //
4732 // TCE uses the llvm bitcode as input and uses it for generating customized
4733 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00004734 // publicly available in http://tce.cs.tut.fi
4735
Eli Friedman1f191002011-10-07 19:51:42 +00004736 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4737 3, // opencl_global
4738 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00004739 5, // opencl_constant
4740 0, // cuda_device
4741 0, // cuda_constant
4742 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00004743 };
4744
Eli Friedmana9c3d712009-08-19 20:47:07 +00004745 class TCETargetInfo : public TargetInfo{
4746 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004747 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004748 TLSSupported = false;
4749 IntWidth = 32;
4750 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004751 PointerWidth = 32;
4752 IntAlign = 32;
4753 LongAlign = LongLongAlign = 32;
4754 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004755 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004756 SizeType = UnsignedInt;
4757 IntMaxType = SignedLong;
4758 UIntMaxType = UnsignedLong;
4759 IntPtrType = SignedInt;
4760 PtrDiffType = SignedInt;
4761 FloatWidth = 32;
4762 FloatAlign = 32;
4763 DoubleWidth = 32;
4764 DoubleAlign = 32;
4765 LongDoubleWidth = 32;
4766 LongDoubleAlign = 32;
4767 FloatFormat = &llvm::APFloat::IEEEsingle;
4768 DoubleFormat = &llvm::APFloat::IEEEsingle;
4769 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola2da35322013-12-16 23:27:41 +00004770 DescriptionString = "E-p:32:32-i8:8:32-"
4771 "i16:16:32-i64:32"
4772 "-f64:32-v64:32-"
4773 "v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00004774 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00004775 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004776 }
4777
4778 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004779 MacroBuilder &Builder) const {
4780 DefineStd(Builder, "tce", Opts);
4781 Builder.defineMacro("__TCE__");
4782 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00004783 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004784 virtual bool hasFeature(StringRef Feature) const {
4785 return Feature == "tce";
4786 }
4787
Eli Friedmana9c3d712009-08-19 20:47:07 +00004788 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4789 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00004790 virtual const char *getClobbers() const {
4791 return "";
4792 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004793 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4794 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004795 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00004796 virtual void getGCCRegNames(const char * const *&Names,
4797 unsigned &NumNames) const {}
4798 virtual bool validateAsmConstraint(const char *&Name,
4799 TargetInfo::ConstraintInfo &info) const {
4800 return true;
4801 }
4802 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4803 unsigned &NumAliases) const {}
4804 };
4805}
4806
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004807namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004808class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00004809 virtual void setDescriptionString() = 0;
4810
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004811 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004812 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00004813 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00004814 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004815 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00004816 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004817 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00004818 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004819 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004820 enum DspRevEnum {
4821 NoDSP, DSP1, DSP2
4822 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00004823 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004824
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004825protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00004826 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004827 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004828
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004829public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004830 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
4831 const std::string &CPUStr)
4832 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004833 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004834 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004835
Eric Christopher0b26a612010-03-02 02:41:08 +00004836 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004837 virtual bool setABI(const std::string &Name) = 0;
Eric Christopher0b26a612010-03-02 02:41:08 +00004838 virtual bool setCPU(const std::string &Name) {
4839 CPU = Name;
4840 return true;
4841 }
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00004842 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christopher0b26a612010-03-02 02:41:08 +00004843 Features[ABI] = true;
4844 Features[CPU] = true;
4845 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004846
Simon Atanasyan16ee0052012-08-29 19:59:32 +00004847 virtual void getTargetDefines(const LangOptions &Opts,
4848 MacroBuilder &Builder) const {
Simon Atanasyan683535b2012-08-29 19:14:58 +00004849 DefineStd(Builder, "mips", Opts);
4850 Builder.defineMacro("_mips");
4851 Builder.defineMacro("__REGISTER_PREFIX__", "");
4852
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004853 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004854 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004855 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004856 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004857 case SoftFloat:
4858 Builder.defineMacro("__mips_soft_float", Twine(1));
4859 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004860 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00004861
Simon Atanasyan16071912013-04-14 14:07:30 +00004862 if (IsSingleFloat)
4863 Builder.defineMacro("__mips_single_float", Twine(1));
4864
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004865 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
4866 Builder.defineMacro("_MIPS_FPSET",
4867 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
4868
Simon Atanasyan72244b62012-07-05 16:06:06 +00004869 if (IsMips16)
4870 Builder.defineMacro("__mips16", Twine(1));
4871
Simon Atanasyan60777612013-04-14 14:07:51 +00004872 if (IsMicromips)
4873 Builder.defineMacro("__mips_micromips", Twine(1));
4874
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004875 if (IsNan2008)
4876 Builder.defineMacro("__mips_nan2008", Twine(1));
4877
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004878 switch (DspRev) {
4879 default:
4880 break;
4881 case DSP1:
4882 Builder.defineMacro("__mips_dsp_rev", Twine(1));
4883 Builder.defineMacro("__mips_dsp", Twine(1));
4884 break;
4885 case DSP2:
4886 Builder.defineMacro("__mips_dsp_rev", Twine(2));
4887 Builder.defineMacro("__mips_dspr2", Twine(1));
4888 Builder.defineMacro("__mips_dsp", Twine(1));
4889 break;
4890 }
4891
Jack Carter44ff1e52013-08-12 17:20:29 +00004892 if (HasMSA)
4893 Builder.defineMacro("__mips_msa", Twine(1));
4894
Simon Atanasyan26f19672012-04-05 19:28:31 +00004895 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
4896 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
4897 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00004898
4899 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
4900 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004901 }
4902
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004903 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4904 unsigned &NumRecords) const {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004905 Records = BuiltinInfo;
4906 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004907 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004908 virtual bool hasFeature(StringRef Feature) const {
Akira Hatanaka618b2982013-10-29 19:00:35 +00004909 return llvm::StringSwitch<bool>(Feature)
4910 .Case("mips", true)
4911 .Case("fp64", HasFP64)
4912 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004913 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004914 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4915 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004916 }
4917 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004918 unsigned &NumNames) const {
Daniel Sanders8b59af12013-11-12 12:56:01 +00004919 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00004920 // CPU register names
4921 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004922 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
4923 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
4924 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00004925 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
4926 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004927 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
4928 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
4929 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
4930 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00004931 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004932 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00004933 "$fcc5","$fcc6","$fcc7",
4934 // MSA register names
4935 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
4936 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
4937 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
4938 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
4939 // MSA control register names
4940 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
4941 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004942 };
4943 Names = GCCRegNames;
4944 NumNames = llvm::array_lengthof(GCCRegNames);
4945 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004946 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004947 unsigned &NumAliases) const = 0;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004948 virtual bool validateAsmConstraint(const char *&Name,
4949 TargetInfo::ConstraintInfo &Info) const {
4950 switch (*Name) {
4951 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00004952 return false;
4953
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004954 case 'r': // CPU registers.
4955 case 'd': // Equivalent to "r" unless generating MIPS16 code.
4956 case 'y': // Equivalent to "r", backwards compatibility only.
4957 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00004958 case 'c': // $25 for indirect jumps
4959 case 'l': // lo register
4960 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004961 Info.setAllowsRegister();
4962 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00004963 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00004964 Info.setAllowsMemory();
4965 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004966 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004967 }
4968
4969 virtual const char *getClobbers() const {
4970 // FIXME: Implement!
4971 return "";
4972 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004973
Eric Christopher3ff21b32013-10-16 21:26:26 +00004974 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00004975 DiagnosticsEngine &Diags) {
Simon Atanasyan72244b62012-07-05 16:06:06 +00004976 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00004977 IsMicromips = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004978 IsNan2008 = false;
Simon Atanasyan16071912013-04-14 14:07:30 +00004979 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004980 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004981 DspRev = NoDSP;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004982 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004983
4984 for (std::vector<std::string>::iterator it = Features.begin(),
4985 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004986 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00004987 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004988 else if (*it == "+soft-float")
4989 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00004990 else if (*it == "+mips16")
4991 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00004992 else if (*it == "+micromips")
4993 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004994 else if (*it == "+dsp")
4995 DspRev = std::max(DspRev, DSP1);
4996 else if (*it == "+dspr2")
4997 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00004998 else if (*it == "+msa")
4999 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005000 else if (*it == "+fp64")
5001 HasFP64 = true;
5002 else if (*it == "-fp64")
5003 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005004 else if (*it == "+nan2008")
5005 IsNan2008 = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005006 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005007
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005008 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005009 std::vector<std::string>::iterator it =
5010 std::find(Features.begin(), Features.end(), "+soft-float");
5011 if (it != Features.end())
5012 Features.erase(it);
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005013 it = std::find(Features.begin(), Features.end(), "+nan2008");
5014 if (it != Features.end())
5015 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005016
Akira Hatanaka9064e362013-10-29 18:30:33 +00005017 setDescriptionString();
5018
Rafael Espindolaeb265472013-08-21 21:59:03 +00005019 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005020 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005021
5022 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
5023 if (RegNo == 0) return 4;
5024 if (RegNo == 1) return 5;
5025 return -1;
5026 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005027};
5028
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005029const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5030#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5031#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5032 ALL_LANGUAGES },
5033#include "clang/Basic/BuiltinsMips.def"
5034};
5035
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005036class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005037public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005038 Mips32TargetInfoBase(const llvm::Triple &Triple)
5039 : MipsTargetInfoBase(Triple, "o32", "mips32") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005040 SizeType = UnsignedInt;
5041 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005042 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005043 }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005044 virtual bool setABI(const std::string &Name) {
5045 if ((Name == "o32") || (Name == "eabi")) {
5046 ABI = Name;
5047 return true;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005048 } else if (Name == "32") {
5049 ABI = "o32";
5050 return true;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005051 } else
5052 return false;
5053 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005054 virtual void getTargetDefines(const LangOptions &Opts,
5055 MacroBuilder &Builder) const {
5056 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005057
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005058 if (ABI == "o32") {
5059 Builder.defineMacro("__mips_o32");
5060 Builder.defineMacro("_ABIO32", "1");
5061 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5062 }
5063 else if (ABI == "eabi")
5064 Builder.defineMacro("__mips_eabi");
5065 else
David Blaikie83d382b2011-09-23 05:06:16 +00005066 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005067 }
5068 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5069 unsigned &NumAliases) const {
5070 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5071 { { "at" }, "$1" },
5072 { { "v0" }, "$2" },
5073 { { "v1" }, "$3" },
5074 { { "a0" }, "$4" },
5075 { { "a1" }, "$5" },
5076 { { "a2" }, "$6" },
5077 { { "a3" }, "$7" },
5078 { { "t0" }, "$8" },
5079 { { "t1" }, "$9" },
5080 { { "t2" }, "$10" },
5081 { { "t3" }, "$11" },
5082 { { "t4" }, "$12" },
5083 { { "t5" }, "$13" },
5084 { { "t6" }, "$14" },
5085 { { "t7" }, "$15" },
5086 { { "s0" }, "$16" },
5087 { { "s1" }, "$17" },
5088 { { "s2" }, "$18" },
5089 { { "s3" }, "$19" },
5090 { { "s4" }, "$20" },
5091 { { "s5" }, "$21" },
5092 { { "s6" }, "$22" },
5093 { { "s7" }, "$23" },
5094 { { "t8" }, "$24" },
5095 { { "t9" }, "$25" },
5096 { { "k0" }, "$26" },
5097 { { "k1" }, "$27" },
5098 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005099 { { "sp","$sp" }, "$29" },
5100 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005101 { { "ra" }, "$31" }
5102 };
5103 Aliases = GCCRegAliases;
5104 NumAliases = llvm::array_lengthof(GCCRegAliases);
5105 }
5106};
5107
5108class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005109 virtual void setDescriptionString() {
Rafael Espindola2da35322013-12-16 23:27:41 +00005110 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-"
5111 "i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005112 }
5113
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005114public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005115 Mips32EBTargetInfo(const llvm::Triple &Triple)
5116 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005117 }
5118 virtual void getTargetDefines(const LangOptions &Opts,
5119 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005120 DefineStd(Builder, "MIPSEB", Opts);
5121 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005122 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005123 }
5124};
5125
5126class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005127 virtual void setDescriptionString() {
Rafael Espindola2da35322013-12-16 23:27:41 +00005128 DescriptionString = "e-p:32:32-i8:8:32-i16:16:32-"
5129 "i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005130 }
5131
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005132public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005133 Mips32ELTargetInfo(const llvm::Triple &Triple)
5134 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005135 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005136 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005137 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005138 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005139 DefineStd(Builder, "MIPSEL", Opts);
5140 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005141 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005142 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005143};
Akira Hatanakabef17452011-09-20 19:21:49 +00005144
5145class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005146public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005147 Mips64TargetInfoBase(const llvm::Triple &Triple)
5148 : MipsTargetInfoBase(Triple, "n64", "mips64") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005149 LongWidth = LongAlign = 64;
5150 PointerWidth = PointerAlign = 64;
5151 LongDoubleWidth = LongDoubleAlign = 128;
5152 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005153 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5154 LongDoubleWidth = LongDoubleAlign = 64;
5155 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5156 }
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005157 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005158 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005159 }
Akira Hatanakabef17452011-09-20 19:21:49 +00005160 virtual bool setABI(const std::string &Name) {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005161 if (Name == "n32") {
5162 LongWidth = LongAlign = 32;
5163 PointerWidth = PointerAlign = 32;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005164 ABI = Name;
5165 return true;
5166 } else if (Name == "n64") {
5167 ABI = Name;
5168 return true;
5169 } else if (Name == "64") {
5170 ABI = "n64";
5171 return true;
5172 } else
5173 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005174 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005175 virtual void getTargetDefines(const LangOptions &Opts,
5176 MacroBuilder &Builder) const {
5177 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005178
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005179 Builder.defineMacro("__mips64");
5180 Builder.defineMacro("__mips64__");
5181
Akira Hatanakabef17452011-09-20 19:21:49 +00005182 if (ABI == "n32") {
5183 Builder.defineMacro("__mips_n32");
5184 Builder.defineMacro("_ABIN32", "2");
5185 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5186 }
5187 else if (ABI == "n64") {
5188 Builder.defineMacro("__mips_n64");
5189 Builder.defineMacro("_ABI64", "3");
5190 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5191 }
5192 else
David Blaikie83d382b2011-09-23 05:06:16 +00005193 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005194 }
5195 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5196 unsigned &NumAliases) const {
5197 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5198 { { "at" }, "$1" },
5199 { { "v0" }, "$2" },
5200 { { "v1" }, "$3" },
5201 { { "a0" }, "$4" },
5202 { { "a1" }, "$5" },
5203 { { "a2" }, "$6" },
5204 { { "a3" }, "$7" },
5205 { { "a4" }, "$8" },
5206 { { "a5" }, "$9" },
5207 { { "a6" }, "$10" },
5208 { { "a7" }, "$11" },
5209 { { "t0" }, "$12" },
5210 { { "t1" }, "$13" },
5211 { { "t2" }, "$14" },
5212 { { "t3" }, "$15" },
5213 { { "s0" }, "$16" },
5214 { { "s1" }, "$17" },
5215 { { "s2" }, "$18" },
5216 { { "s3" }, "$19" },
5217 { { "s4" }, "$20" },
5218 { { "s5" }, "$21" },
5219 { { "s6" }, "$22" },
5220 { { "s7" }, "$23" },
5221 { { "t8" }, "$24" },
5222 { { "t9" }, "$25" },
5223 { { "k0" }, "$26" },
5224 { { "k1" }, "$27" },
5225 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005226 { { "sp","$sp" }, "$29" },
5227 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005228 { { "ra" }, "$31" }
5229 };
5230 Aliases = GCCRegAliases;
5231 NumAliases = llvm::array_lengthof(GCCRegAliases);
5232 }
5233};
5234
5235class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005236 virtual void setDescriptionString() {
5237 if (ABI == "n32")
Rafael Espindola2da35322013-12-16 23:27:41 +00005238 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00005239 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005240 "n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005241 else
Rafael Espindola47debc02013-12-16 21:59:14 +00005242 DescriptionString = "E-i8:8:32-i16:16:32-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00005243 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005244 "n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005245
Akira Hatanakabef17452011-09-20 19:21:49 +00005246 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005247
Akira Hatanakabef17452011-09-20 19:21:49 +00005248public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005249 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005250 : Mips64TargetInfoBase(Triple) {}
Akira Hatanakabef17452011-09-20 19:21:49 +00005251 virtual void getTargetDefines(const LangOptions &Opts,
5252 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00005253 DefineStd(Builder, "MIPSEB", Opts);
5254 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005255 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005256 }
5257};
5258
5259class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005260 virtual void setDescriptionString() {
5261 if (ABI == "n32")
Rafael Espindola2da35322013-12-16 23:27:41 +00005262 DescriptionString = "e-p:32:32-i8:8:32-i16:16:32-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00005263 "i64:64"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005264 "-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005265 else
Rafael Espindola47debc02013-12-16 21:59:14 +00005266 DescriptionString = "e-i8:8:32-i16:16:32-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00005267 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005268 "n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005269 }
5270public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005271 Mips64ELTargetInfo(const llvm::Triple &Triple)
5272 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005273 // Default ABI is n64.
5274 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005275 }
5276 virtual void getTargetDefines(const LangOptions &Opts,
5277 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00005278 DefineStd(Builder, "MIPSEL", Opts);
5279 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005280 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005281 }
5282};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005283} // end anonymous namespace.
5284
Ivan Krasindd7403e2011-08-24 20:22:22 +00005285namespace {
5286class PNaClTargetInfo : public TargetInfo {
5287public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005288 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005289 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005290 this->UserLabelPrefix = "";
5291 this->LongAlign = 32;
5292 this->LongWidth = 32;
5293 this->PointerAlign = 32;
5294 this->PointerWidth = 32;
5295 this->IntMaxType = TargetInfo::SignedLongLong;
5296 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5297 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005298 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005299 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005300 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005301 this->SizeType = TargetInfo::UnsignedInt;
5302 this->PtrDiffType = TargetInfo::SignedInt;
5303 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005304 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005305 }
5306
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005307 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005308 }
5309 virtual void getArchDefines(const LangOptions &Opts,
5310 MacroBuilder &Builder) const {
5311 Builder.defineMacro("__le32__");
5312 Builder.defineMacro("__pnacl__");
5313 }
5314 virtual void getTargetDefines(const LangOptions &Opts,
5315 MacroBuilder &Builder) const {
Jan Wen Voung1d4c2d92012-03-29 00:05:59 +00005316 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasindd7403e2011-08-24 20:22:22 +00005317 getArchDefines(Opts, Builder);
5318 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005319 virtual bool hasFeature(StringRef Feature) const {
5320 return Feature == "pnacl";
5321 }
Ivan Krasindd7403e2011-08-24 20:22:22 +00005322 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5323 unsigned &NumRecords) const {
5324 }
Meador Inge5d3fb222012-06-16 03:34:49 +00005325 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5326 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005327 }
5328 virtual void getGCCRegNames(const char * const *&Names,
5329 unsigned &NumNames) const;
5330 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5331 unsigned &NumAliases) const;
5332 virtual bool validateAsmConstraint(const char *&Name,
5333 TargetInfo::ConstraintInfo &Info) const {
5334 return false;
5335 }
5336
5337 virtual const char *getClobbers() const {
5338 return "";
5339 }
5340};
5341
5342void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5343 unsigned &NumNames) const {
5344 Names = NULL;
5345 NumNames = 0;
5346}
5347
5348void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5349 unsigned &NumAliases) const {
5350 Aliases = NULL;
5351 NumAliases = 0;
5352}
5353} // end anonymous namespace.
5354
Guy Benyeib798fc92012-12-11 21:38:14 +00005355namespace {
5356 static const unsigned SPIRAddrSpaceMap[] = {
5357 1, // opencl_global
5358 3, // opencl_local
5359 2, // opencl_constant
5360 0, // cuda_device
5361 0, // cuda_constant
5362 0 // cuda_shared
5363 };
5364 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00005365 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005366 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005367 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5368 "SPIR target must use unknown OS");
5369 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5370 "SPIR target must use unknown environment type");
5371 BigEndian = false;
5372 TLSSupported = false;
5373 LongWidth = LongAlign = 64;
5374 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005375 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00005376 // Define available target features
5377 // These must be defined in sorted order!
5378 NoAsmVariants = true;
5379 }
5380 virtual void getTargetDefines(const LangOptions &Opts,
5381 MacroBuilder &Builder) const {
5382 DefineStd(Builder, "SPIR", Opts);
5383 }
5384 virtual bool hasFeature(StringRef Feature) const {
5385 return Feature == "spir";
5386 }
5387
5388 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5389 unsigned &NumRecords) const {}
5390 virtual const char *getClobbers() const {
5391 return "";
5392 }
5393 virtual void getGCCRegNames(const char * const *&Names,
5394 unsigned &NumNames) const {}
5395 virtual bool validateAsmConstraint(const char *&Name,
5396 TargetInfo::ConstraintInfo &info) const {
5397 return true;
5398 }
5399 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5400 unsigned &NumAliases) const {}
5401 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5402 return TargetInfo::VoidPtrBuiltinVaList;
5403 }
5404 };
5405
5406
5407 class SPIR32TargetInfo : public SPIRTargetInfo {
5408 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005409 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005410 PointerWidth = PointerAlign = 32;
5411 SizeType = TargetInfo::UnsignedInt;
5412 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5413 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00005414 = "e-p:32:32-i64:64"
5415 "-v16:16-v24:32-v32:32-v48:64-"
5416 "v96:128-v192:256-v256:256-"
5417 "v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005418 }
5419 virtual void getTargetDefines(const LangOptions &Opts,
5420 MacroBuilder &Builder) const {
5421 DefineStd(Builder, "SPIR32", Opts);
5422 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005423 };
5424
5425 class SPIR64TargetInfo : public SPIRTargetInfo {
5426 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005427 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005428 PointerWidth = PointerAlign = 64;
5429 SizeType = TargetInfo::UnsignedLong;
5430 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
5431 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00005432 = "e-i64:64"
5433 "-v16:16-v24:32-v32:32-v48:64-"
5434 "v96:128-v192:256-v256:256-"
5435 "v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005436 }
5437 virtual void getTargetDefines(const LangOptions &Opts,
5438 MacroBuilder &Builder) const {
5439 DefineStd(Builder, "SPIR64", Opts);
5440 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005441 };
5442}
5443
Robert Lytton0e076492013-08-13 09:43:10 +00005444namespace {
5445class XCoreTargetInfo : public TargetInfo {
5446 static const Builtin::Info BuiltinInfo[];
5447public:
5448 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5449 BigEndian = false;
5450 NoAsmVariants = true;
5451 LongLongAlign = 32;
5452 SuitableAlign = 32;
5453 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00005454 SizeType = UnsignedInt;
5455 PtrDiffType = SignedInt;
5456 IntPtrType = SignedInt;
5457 WCharType = UnsignedChar;
5458 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00005459 UseZeroLengthBitfieldAlignment = true;
Rafael Espindola8ddf8bc2013-12-17 00:04:48 +00005460 DescriptionString = "e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
Rafael Espindola26c67b72013-12-17 14:34:42 +00005461 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00005462 }
5463 virtual void getTargetDefines(const LangOptions &Opts,
5464 MacroBuilder &Builder) const {
5465 Builder.defineMacro("__XS1B__");
5466 }
5467 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5468 unsigned &NumRecords) const {
5469 Records = BuiltinInfo;
5470 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5471 }
5472 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5473 return TargetInfo::VoidPtrBuiltinVaList;
5474 }
5475 virtual const char *getClobbers() const {
5476 return "";
5477 }
5478 virtual void getGCCRegNames(const char * const *&Names,
5479 unsigned &NumNames) const {
5480 static const char * const GCCRegNames[] = {
5481 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5482 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
5483 };
5484 Names = GCCRegNames;
5485 NumNames = llvm::array_lengthof(GCCRegNames);
5486 }
5487 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5488 unsigned &NumAliases) const {
5489 Aliases = NULL;
5490 NumAliases = 0;
5491 }
5492 virtual bool validateAsmConstraint(const char *&Name,
5493 TargetInfo::ConstraintInfo &Info) const {
5494 return false;
5495 }
5496};
5497
5498const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
5499#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5500#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5501 ALL_LANGUAGES },
5502#include "clang/Basic/BuiltinsXCore.def"
5503};
5504} // end anonymous namespace.
5505
Ivan Krasindd7403e2011-08-24 20:22:22 +00005506
Chris Lattner5ba61f02006-10-14 07:39:34 +00005507//===----------------------------------------------------------------------===//
5508// Driver code
5509//===----------------------------------------------------------------------===//
5510
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005511static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00005512 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00005513
Daniel Dunbar52322032009-08-18 05:47:58 +00005514 switch (Triple.getArch()) {
5515 default:
5516 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00005517
Robert Lytton0e076492013-08-13 09:43:10 +00005518 case llvm::Triple::xcore:
5519 return new XCoreTargetInfo(Triple);
5520
Tony Linthicum76329bf2011-12-12 21:14:55 +00005521 case llvm::Triple::hexagon:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005522 return new HexagonTargetInfo(Triple);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005523
Tim Northover9bb857a2013-01-31 12:13:10 +00005524 case llvm::Triple::aarch64:
5525 switch (os) {
5526 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005527 return new LinuxTargetInfo<AArch64TargetInfo>(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005528 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005529 return new AArch64TargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005530 }
5531
Daniel Dunbar52322032009-08-18 05:47:58 +00005532 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00005533 case llvm::Triple::thumb:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005534 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005535 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005536
Daniel Dunbar52322032009-08-18 05:47:58 +00005537 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00005538 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005539 return new LinuxTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005540 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005541 return new FreeBSDTargetInfo<ARMTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005542 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005543 return new NetBSDTargetInfo<ARMTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005544 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005545 return new OpenBSDTargetInfo<ARMTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005546 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005547 return new BitrigTargetInfo<ARMTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005548 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005549 return new RTEMSTargetInfo<ARMTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005550 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005551 return new NaClTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005552 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005553 return new ARMTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005554 }
Eli Friedmanb5366062008-05-20 14:21:01 +00005555
Daniel Dunbar52322032009-08-18 05:47:58 +00005556 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005557 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00005558
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005559 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005560 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005561 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005562 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005563 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005564 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005565 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005566 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005567 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005568 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005569 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005570 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005571 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005572
5573 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005574 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005575 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005576 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005577 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005578 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005579 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005580 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005581 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005582 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00005583 case llvm::Triple::NaCl:
5584 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005585 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005586 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005587 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005588
Akira Hatanakabef17452011-09-20 19:21:49 +00005589 case llvm::Triple::mips64:
5590 switch (os) {
5591 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005592 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005593 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005594 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005595 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005596 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005597 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005598 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005599 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005600 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005601 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005602 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005603 }
5604
5605 case llvm::Triple::mips64el:
5606 switch (os) {
5607 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005608 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005609 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005610 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005611 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005612 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005613 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005614 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005615 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005616 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005617 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005618 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005619 }
5620
Ivan Krasindd7403e2011-08-24 20:22:22 +00005621 case llvm::Triple::le32:
5622 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00005623 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005624 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00005625 default:
5626 return NULL;
5627 }
5628
Daniel Dunbar52322032009-08-18 05:47:58 +00005629 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005630 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005631 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005632 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005633 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005634 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005635 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005636 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005637 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005638 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005639 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005640 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005641 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005642 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005643 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005644 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005645 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005646
5647 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005648 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005649 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005650 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005651 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005652 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005653 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005654 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005655 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005656 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005657 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005658 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005659 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005660 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005661 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005662
Bill Schmidt778d3872013-07-26 01:36:11 +00005663 case llvm::Triple::ppc64le:
5664 switch (os) {
5665 case llvm::Triple::Linux:
5666 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
5667 default:
5668 return new PPC64TargetInfo(Triple);
5669 }
5670
Peter Collingbournec947aae2012-05-20 23:28:41 +00005671 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005672 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005673 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005674 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005675
Eli Friedmand13b41e2012-10-12 23:32:00 +00005676 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005677 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00005678
Daniel Dunbar52322032009-08-18 05:47:58 +00005679 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005680 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005681 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005682 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005683 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005684 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005685 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005686 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005687 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005688 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005689 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005690 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005691 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005692 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005693 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005694 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005695 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005696
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005697 case llvm::Triple::sparcv9:
5698 switch (os) {
5699 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005700 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005701 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005702 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005703 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005704 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005705 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005706 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005707 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005708 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005709 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005710 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005711 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005712 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005713 }
5714
Ulrich Weigand47445072013-05-06 16:26:41 +00005715 case llvm::Triple::systemz:
5716 switch (os) {
5717 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005718 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005719 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005720 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005721 }
5722
Eli Friedmana9c3d712009-08-19 20:47:07 +00005723 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005724 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00005725
Daniel Dunbar52322032009-08-18 05:47:58 +00005726 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005727 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005728 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005729
Daniel Dunbar52322032009-08-18 05:47:58 +00005730 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005731 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005732 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005733 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005734 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005735 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005736 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005737 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005738 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005739 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005740 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005741 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005742 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005743 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005744 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005745 case llvm::Triple::KFreeBSD:
5746 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005747 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005748 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005749 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005750 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005751 case llvm::Triple::Cygwin:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005752 return new CygwinX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005753 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005754 return new MinGWX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005755 case llvm::Triple::Win32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005756 return new VisualStudioWindowsX86_32TargetInfo(Triple);
Chris Lattnerb986aba2010-04-11 19:29:39 +00005757 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005758 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005759 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005760 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005761 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005762 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005763 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005764 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005765 }
5766
5767 case llvm::Triple::x86_64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005768 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005769 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005770
Daniel Dunbar52322032009-08-18 05:47:58 +00005771 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005772 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005773 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005774 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005775 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00005776 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005777 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005778 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005779 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005780 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005781 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005782 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005783 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005784 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005785 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005786 case llvm::Triple::KFreeBSD:
5787 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005788 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005789 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00005790 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005791 return new MinGWX86_64TargetInfo(Triple);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00005792 case llvm::Triple::Win32: // This is what Triple.h supports now.
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005793 return new VisualStudioWindowsX86_64TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005794 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005795 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005796 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005797 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005798 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005799
5800 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005801 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005802 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005803 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005804 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005805 }
5806 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005807 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005808 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005809 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005810 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005811 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005812 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00005813}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005814
5815/// CreateTargetInfo - Return the target info object for the specified target
5816/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00005817TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregorf8715de2012-11-16 04:24:59 +00005818 TargetOptions *Opts) {
5819 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005820
5821 // Construct the target
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005822 OwningPtr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005823 if (!Target) {
5824 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5825 return 0;
5826 }
Douglas Gregorbc10b9f2012-10-15 16:45:32 +00005827 Target->setTargetOpts(Opts);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005828
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005829 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005830 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5831 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005832 return 0;
5833 }
5834
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005835 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005836 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5837 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005838 return 0;
5839 }
5840
Charles Davis95a546e2010-06-11 01:06:47 +00005841 // Set the target C++ ABI.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005842 if (!Opts->CXXABI.empty() && !Target->setCXXABI(Opts->CXXABI)) {
5843 Diags.Report(diag::err_target_unknown_cxxabi) << Opts->CXXABI;
Charles Davis95a546e2010-06-11 01:06:47 +00005844 return 0;
5845 }
5846
Rafael Espindolaeb265472013-08-21 21:59:03 +00005847 // Set the fp math unit.
5848 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
5849 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
5850 return 0;
5851 }
5852
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005853 // Compute the default target features, we need the target to handle this
5854 // because features may have dependencies on one another.
5855 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005856 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005857
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005858 // Apply the user specified deltas.
5859 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
5860 I < N; ++I) {
5861 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00005862 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005863 bool Enabled = Name[0] == '+';
5864 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005865 }
5866
5867 // Add the features to the compile options.
5868 //
5869 // FIXME: If we are completely confident that we have the right set, we only
5870 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005871 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005872 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5873 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00005874 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00005875 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Rafael Espindolaeb265472013-08-21 21:59:03 +00005876 return 0;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005877
5878 return Target.take();
5879}