blob: cce3ae63a4c6f62f3d4f7b1d46874745b0ac20ba [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 Espindola2da35322013-12-16 23:27:41 +0000488 this->DescriptionString = "E-p:32:32-"
489 "i64:64-n32";
John Thompsone467e192009-11-19 17:18:50 +0000490 }
491};
492
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000493// AuroraUX target
494template<typename Target>
495class AuroraUXTargetInfo : public OSTargetInfo<Target> {
496protected:
497 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000498 MacroBuilder &Builder) const {
499 DefineStd(Builder, "sun", Opts);
500 DefineStd(Builder, "unix", Opts);
501 Builder.defineMacro("__ELF__");
502 Builder.defineMacro("__svr4__");
503 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000504 }
505public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000506 AuroraUXTargetInfo(const llvm::Triple &Triple)
507 : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000508 this->UserLabelPrefix = "";
509 this->WCharType = this->SignedLong;
510 // FIXME: WIntType should be SignedLong
511 }
512};
513
Torok Edwinb2b37c62009-06-30 17:10:35 +0000514// Solaris target
515template<typename Target>
516class SolarisTargetInfo : public OSTargetInfo<Target> {
517protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000518 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000519 MacroBuilder &Builder) const {
520 DefineStd(Builder, "sun", Opts);
521 DefineStd(Builder, "unix", Opts);
522 Builder.defineMacro("__ELF__");
523 Builder.defineMacro("__svr4__");
524 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000525 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
526 // newer, but to 500 for everything else. feature_test.h has a check to
527 // ensure that you are not using C99 with an old version of X/Open or C89
528 // with a new version.
529 if (Opts.C99 || Opts.C11)
530 Builder.defineMacro("_XOPEN_SOURCE", "600");
531 else
532 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000533 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000534 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000535 Builder.defineMacro("_LARGEFILE_SOURCE");
536 Builder.defineMacro("_LARGEFILE64_SOURCE");
537 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000538 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000539 }
540public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000541 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000542 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000543 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000544 // FIXME: WIntType should be SignedLong
545 }
546};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000547
548// Windows target
549template<typename Target>
550class WindowsTargetInfo : public OSTargetInfo<Target> {
551protected:
552 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
553 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000554 Builder.defineMacro("_WIN32");
555 }
556 void getVisualStudioDefines(const LangOptions &Opts,
557 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000558 if (Opts.CPlusPlus) {
559 if (Opts.RTTI)
560 Builder.defineMacro("_CPPRTTI");
561
562 if (Opts.Exceptions)
563 Builder.defineMacro("_CPPUNWIND");
564 }
565
566 if (!Opts.CharIsSigned)
567 Builder.defineMacro("_CHAR_UNSIGNED");
568
569 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
570 // but it works for now.
571 if (Opts.POSIXThreads)
572 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000573
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000574 if (Opts.MSCVersion != 0)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000575 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000576
Francois Pichet0706d202011-09-17 17:15:52 +0000577 if (Opts.MicrosoftExt) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000578 Builder.defineMacro("_MSC_EXTENSIONS");
579
Richard Smith2bf7fdb2013-01-02 11:42:31 +0000580 if (Opts.CPlusPlus11) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000581 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
582 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
583 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
584 }
585 }
586
587 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000588 }
589
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000590public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000591 WindowsTargetInfo(const llvm::Triple &Triple)
592 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000593};
594
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000595template <typename Target>
596class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000597protected:
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000598 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
599 MacroBuilder &Builder) const {
600 if (Opts.POSIXThreads)
601 Builder.defineMacro("_REENTRANT");
602 if (Opts.CPlusPlus)
603 Builder.defineMacro("_GNU_SOURCE");
604
605 DefineStd(Builder, "unix", Opts);
606 Builder.defineMacro("__ELF__");
607 Builder.defineMacro("__native_client__");
608 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000609
610public:
611 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000612 this->UserLabelPrefix = "";
613 this->LongAlign = 32;
614 this->LongWidth = 32;
615 this->PointerAlign = 32;
616 this->PointerWidth = 32;
617 this->IntMaxType = TargetInfo::SignedLongLong;
618 this->UIntMaxType = TargetInfo::UnsignedLongLong;
619 this->Int64Type = TargetInfo::SignedLongLong;
620 this->DoubleAlign = 64;
621 this->LongDoubleWidth = 64;
622 this->LongDoubleAlign = 64;
623 this->SizeType = TargetInfo::UnsignedInt;
624 this->PtrDiffType = TargetInfo::SignedInt;
625 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000626 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000627 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola2da35322013-12-16 23:27:41 +0000628 this->DescriptionString = "e-i64:64"
629 "-p:32:32-v128:32";
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000630 }
Derek Schuffa2020962012-10-16 22:30:41 +0000631 virtual typename Target::CallingConvCheckResult checkCallingConvention(
632 CallingConv CC) const {
633 return CC == CC_PnaclCall ? Target::CCCR_OK :
634 Target::checkCallingConvention(CC);
635 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000636};
Mike Stump11289f42009-09-09 15:08:12 +0000637} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000638
Chris Lattner09d98f52008-10-05 21:50:58 +0000639//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000640// Specific target implementations.
641//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000642
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000643namespace {
644// PPC abstract base class
645class PPCTargetInfo : public TargetInfo {
646 static const Builtin::Info BuiltinInfo[];
647 static const char * const GCCRegNames[];
648 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000649 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000650
651 // Target cpu features.
652 bool HasVSX;
653
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000654public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000655 PPCTargetInfo(const llvm::Triple &Triple)
656 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000657 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000658 LongDoubleWidth = LongDoubleAlign = 128;
659 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
660 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000661
Hal Finkel6b984f02012-07-03 16:51:04 +0000662 /// \brief Flags for architecture specific defines.
663 typedef enum {
664 ArchDefineNone = 0,
665 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
666 ArchDefinePpcgr = 1 << 1,
667 ArchDefinePpcsq = 1 << 2,
668 ArchDefine440 = 1 << 3,
669 ArchDefine603 = 1 << 4,
670 ArchDefine604 = 1 << 5,
671 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000672 ArchDefinePwr5 = 1 << 7,
673 ArchDefinePwr5x = 1 << 8,
674 ArchDefinePwr6 = 1 << 9,
675 ArchDefinePwr6x = 1 << 10,
676 ArchDefinePwr7 = 1 << 11,
677 ArchDefineA2 = 1 << 12,
678 ArchDefineA2q = 1 << 13
Hal Finkel6b984f02012-07-03 16:51:04 +0000679 } ArchDefineTypes;
680
Bill Schmidt38378a02013-02-01 20:23:10 +0000681 // Note: GCC recognizes the following additional cpus:
682 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
683 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
684 // titan, rs64.
Hal Finkel8eb59282012-06-11 22:35:19 +0000685 virtual bool setCPU(const std::string &Name) {
686 bool CPUKnown = llvm::StringSwitch<bool>(Name)
687 .Case("generic", true)
688 .Case("440", true)
689 .Case("450", true)
690 .Case("601", true)
691 .Case("602", true)
692 .Case("603", true)
693 .Case("603e", true)
694 .Case("603ev", true)
695 .Case("604", true)
696 .Case("604e", true)
697 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000698 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000699 .Case("g3", true)
700 .Case("7400", true)
701 .Case("g4", true)
702 .Case("7450", true)
703 .Case("g4+", true)
704 .Case("750", true)
705 .Case("970", true)
706 .Case("g5", true)
707 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000708 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000709 .Case("e500mc", true)
710 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000711 .Case("power3", true)
712 .Case("pwr3", true)
713 .Case("power4", true)
714 .Case("pwr4", true)
715 .Case("power5", true)
716 .Case("pwr5", true)
717 .Case("power5x", true)
718 .Case("pwr5x", true)
719 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000720 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000721 .Case("power6x", true)
722 .Case("pwr6x", true)
723 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000724 .Case("pwr7", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000725 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000726 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000727 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000728 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000729 .Case("powerpc64le", true)
730 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000731 .Default(false);
732
733 if (CPUKnown)
734 CPU = Name;
735
736 return CPUKnown;
737 }
738
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000739 virtual void getTargetBuiltins(const Builtin::Info *&Records,
740 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000741 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000742 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000743 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000744
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000745 virtual bool isCLZForZeroUndef() const { return false; }
746
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000747 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000748 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000749
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000750 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
751
Eric Christopher3ff21b32013-10-16 21:26:26 +0000752 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000753 DiagnosticsEngine &Diags);
Douglas Gregor0070c0b2012-01-30 06:38:25 +0000754 virtual bool hasFeature(StringRef Feature) const;
755
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000756 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000757 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000758 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000759 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000760 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000761 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000762 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000763 default: return false;
764 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000765 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000766 case 'b': // Base register
767 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000768 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000769 break;
770 // FIXME: The following are added to allow parsing.
771 // I just took a guess at what the actions should be.
772 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000773 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000774 case 'v': // Altivec vector register
775 Info.setAllowsRegister();
776 break;
777 case 'w':
778 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000779 case 'd':// VSX vector register to hold vector double data
780 case 'f':// VSX vector register to hold vector float data
781 case 's':// VSX vector register to hold scalar float data
782 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000783 break;
784 default:
785 return false;
786 }
787 Info.setAllowsRegister();
788 Name++; // Skip over 'w'.
789 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000790 case 'h': // `MQ', `CTR', or `LINK' register
791 case 'q': // `MQ' register
792 case 'c': // `CTR' register
793 case 'l': // `LINK' register
794 case 'x': // `CR' register (condition register) number 0
795 case 'y': // `CR' register (condition register)
796 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000797 Info.setAllowsRegister();
798 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000799 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000800 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000801 // (use `L' instead for SImode constants)
802 case 'K': // Unsigned 16-bit constant
803 case 'L': // Signed 16-bit constant shifted left 16 bits
804 case 'M': // Constant larger than 31
805 case 'N': // Exact power of 2
806 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000807 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000808 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000809 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000810 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000811 break;
812 case 'm': // Memory operand. Note that on PowerPC targets, m can
813 // include addresses that update the base register. It
814 // is therefore only safe to use `m' in an asm statement
815 // if that asm statement accesses the operand exactly once.
816 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000817 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000818 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000819 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000820 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000821 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
822 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000823 // register to be updated.
824 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000825 if (Name[1] != 's')
826 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000827 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000828 // include any automodification of the base register. Unlike
829 // `m', this constraint can be used in asm statements that
830 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000831 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000832 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000833 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000834 break;
835 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000836 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000837 case 'Z': // Memory operand that is an indexed or indirect from a
838 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000839 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000840 Info.setAllowsMemory();
841 Info.setAllowsRegister();
842 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000843 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000844 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000845 // register (`p' is preferable for asm statements)
846 case 'S': // Constant suitable as a 64-bit mask operand
847 case 'T': // Constant suitable as a 32-bit mask operand
848 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000849 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000850 // instructions
851 case 'W': // Vector constant that does not require memory
852 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000853 break;
854 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000855 }
John Thompson07a61a42010-06-24 22:44:13 +0000856 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000857 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000858 virtual const char *getClobbers() const {
859 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000860 }
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000861 int getEHDataRegisterNumber(unsigned RegNo) const {
862 if (RegNo == 0) return 3;
863 if (RegNo == 1) return 4;
864 return -1;
865 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000866};
Anders Carlssonf511f642007-11-27 04:11:28 +0000867
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000868const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000869#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000870#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000871 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000872#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000873};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000874
Eric Christopher3ff21b32013-10-16 21:26:26 +0000875 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000876/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000877bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000878 DiagnosticsEngine &Diags) {
879 // Remember the maximum enabled sselevel.
880 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
881 // Ignore disabled features.
882 if (Features[i][0] == '-')
883 continue;
884
885 StringRef Feature = StringRef(Features[i]).substr(1);
886
887 if (Feature == "vsx") {
888 HasVSX = true;
889 continue;
890 }
891
892 // TODO: Finish this list and add an assert that we've handled them
893 // all.
894 }
895
896 return true;
897}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000898
Chris Lattnerecd49032009-03-02 22:27:17 +0000899/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
900/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000901void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000902 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000903 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000904 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000905 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000906 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000907 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000908 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000909 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000910 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000911 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000912 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000913 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000914 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000915
Chris Lattnerecd49032009-03-02 22:27:17 +0000916 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000917 if (getTriple().getArch() == llvm::Triple::ppc64le) {
918 Builder.defineMacro("_LITTLE_ENDIAN");
919 Builder.defineMacro("__LITTLE_ENDIAN__");
920 } else {
921 if (getTriple().getOS() != llvm::Triple::NetBSD &&
922 getTriple().getOS() != llvm::Triple::OpenBSD)
923 Builder.defineMacro("_BIG_ENDIAN");
924 Builder.defineMacro("__BIG_ENDIAN__");
925 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000926
Chris Lattnerecd49032009-03-02 22:27:17 +0000927 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000928 Builder.defineMacro("__NATURAL_ALIGNMENT__");
929 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000930
Chris Lattnerecd49032009-03-02 22:27:17 +0000931 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000932 if (LongDoubleWidth == 128)
933 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000934
John Thompsone467e192009-11-19 17:18:50 +0000935 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000936 Builder.defineMacro("__VEC__", "10206");
937 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000938 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000939
940 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000941 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
942 .Case("440", ArchDefineName)
943 .Case("450", ArchDefineName | ArchDefine440)
944 .Case("601", ArchDefineName)
945 .Case("602", ArchDefineName | ArchDefinePpcgr)
946 .Case("603", ArchDefineName | ArchDefinePpcgr)
947 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
948 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
949 .Case("604", ArchDefineName | ArchDefinePpcgr)
950 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
951 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +0000952 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +0000953 .Case("7400", ArchDefineName | ArchDefinePpcgr)
954 .Case("7450", ArchDefineName | ArchDefinePpcgr)
955 .Case("750", ArchDefineName | ArchDefinePpcgr)
956 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
957 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000958 .Case("a2", ArchDefineA2)
959 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +0000960 .Case("pwr3", ArchDefinePpcgr)
961 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
962 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
963 | ArchDefinePpcsq)
964 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
965 | ArchDefinePpcgr | ArchDefinePpcsq)
966 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
967 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
968 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
969 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
970 | ArchDefinePpcsq)
971 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
972 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
973 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
974 .Case("power3", ArchDefinePpcgr)
975 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
976 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
977 | ArchDefinePpcsq)
978 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
979 | ArchDefinePpcgr | ArchDefinePpcsq)
980 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
981 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
982 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
983 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
984 | ArchDefinePpcsq)
985 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
986 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
987 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +0000988 .Default(ArchDefineNone);
989
990 if (defs & ArchDefineName)
991 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
992 if (defs & ArchDefinePpcgr)
993 Builder.defineMacro("_ARCH_PPCGR");
994 if (defs & ArchDefinePpcsq)
995 Builder.defineMacro("_ARCH_PPCSQ");
996 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +0000997 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +0000998 if (defs & ArchDefine603)
999 Builder.defineMacro("_ARCH_603");
1000 if (defs & ArchDefine604)
1001 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001002 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001003 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001004 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001005 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001006 if (defs & ArchDefinePwr5x)
1007 Builder.defineMacro("_ARCH_PWR5X");
1008 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001009 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001010 if (defs & ArchDefinePwr6x)
1011 Builder.defineMacro("_ARCH_PWR6X");
1012 if (defs & ArchDefinePwr7)
1013 Builder.defineMacro("_ARCH_PWR7");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001014 if (defs & ArchDefineA2)
1015 Builder.defineMacro("_ARCH_A2");
1016 if (defs & ArchDefineA2q) {
1017 Builder.defineMacro("_ARCH_A2Q");
1018 Builder.defineMacro("_ARCH_QP");
1019 }
1020
1021 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1022 Builder.defineMacro("__bg__");
1023 Builder.defineMacro("__THW_BLUEGENE__");
1024 Builder.defineMacro("__bgq__");
1025 Builder.defineMacro("__TOS_BGQ__");
1026 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001027
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001028 if (HasVSX)
1029 Builder.defineMacro("__VSX__");
1030
Bill Schmidt38378a02013-02-01 20:23:10 +00001031 // FIXME: The following are not yet generated here by Clang, but are
1032 // generated by GCC:
1033 //
1034 // _SOFT_FLOAT_
1035 // __RECIP_PRECISION__
1036 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001037 // __RECIP__
1038 // __RECIPF__
1039 // __RSQRTE__
1040 // __RSQRTEF__
1041 // _SOFT_DOUBLE_
1042 // __NO_LWSYNC__
1043 // __HAVE_BSWAP__
1044 // __LONGDOUBLE128
1045 // __CMODEL_MEDIUM__
1046 // __CMODEL_LARGE__
1047 // _CALL_SYSV
1048 // _CALL_DARWIN
1049 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001050}
1051
1052void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1053 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1054 .Case("7400", true)
1055 .Case("g4", true)
1056 .Case("7450", true)
1057 .Case("g4+", true)
1058 .Case("970", true)
1059 .Case("g5", true)
1060 .Case("pwr6", true)
1061 .Case("pwr7", true)
1062 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001063 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001064 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001065
1066 Features["qpx"] = (CPU == "a2q");
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001067}
1068
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001069bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1070 return Feature == "powerpc";
1071}
Chris Lattner17df24e2008-04-21 18:56:49 +00001072
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001073
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001074const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001075 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1076 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1077 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1078 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1079 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1080 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1081 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1082 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001083 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001084 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001085 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001086 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1087 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1088 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1089 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001090 "vrsave", "vscr",
1091 "spe_acc", "spefscr",
1092 "sfp"
1093};
Chris Lattner10a5b382007-01-29 05:24:35 +00001094
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001095void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001096 unsigned &NumNames) const {
1097 Names = GCCRegNames;
1098 NumNames = llvm::array_lengthof(GCCRegNames);
1099}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001100
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001101const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1102 // While some of these aliases do map to different registers
1103 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001104 { { "0" }, "r0" },
1105 { { "1"}, "r1" },
1106 { { "2" }, "r2" },
1107 { { "3" }, "r3" },
1108 { { "4" }, "r4" },
1109 { { "5" }, "r5" },
1110 { { "6" }, "r6" },
1111 { { "7" }, "r7" },
1112 { { "8" }, "r8" },
1113 { { "9" }, "r9" },
1114 { { "10" }, "r10" },
1115 { { "11" }, "r11" },
1116 { { "12" }, "r12" },
1117 { { "13" }, "r13" },
1118 { { "14" }, "r14" },
1119 { { "15" }, "r15" },
1120 { { "16" }, "r16" },
1121 { { "17" }, "r17" },
1122 { { "18" }, "r18" },
1123 { { "19" }, "r19" },
1124 { { "20" }, "r20" },
1125 { { "21" }, "r21" },
1126 { { "22" }, "r22" },
1127 { { "23" }, "r23" },
1128 { { "24" }, "r24" },
1129 { { "25" }, "r25" },
1130 { { "26" }, "r26" },
1131 { { "27" }, "r27" },
1132 { { "28" }, "r28" },
1133 { { "29" }, "r29" },
1134 { { "30" }, "r30" },
1135 { { "31" }, "r31" },
1136 { { "fr0" }, "f0" },
1137 { { "fr1" }, "f1" },
1138 { { "fr2" }, "f2" },
1139 { { "fr3" }, "f3" },
1140 { { "fr4" }, "f4" },
1141 { { "fr5" }, "f5" },
1142 { { "fr6" }, "f6" },
1143 { { "fr7" }, "f7" },
1144 { { "fr8" }, "f8" },
1145 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001146 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001147 { { "fr11" }, "f11" },
1148 { { "fr12" }, "f12" },
1149 { { "fr13" }, "f13" },
1150 { { "fr14" }, "f14" },
1151 { { "fr15" }, "f15" },
1152 { { "fr16" }, "f16" },
1153 { { "fr17" }, "f17" },
1154 { { "fr18" }, "f18" },
1155 { { "fr19" }, "f19" },
1156 { { "fr20" }, "f20" },
1157 { { "fr21" }, "f21" },
1158 { { "fr22" }, "f22" },
1159 { { "fr23" }, "f23" },
1160 { { "fr24" }, "f24" },
1161 { { "fr25" }, "f25" },
1162 { { "fr26" }, "f26" },
1163 { { "fr27" }, "f27" },
1164 { { "fr28" }, "f28" },
1165 { { "fr29" }, "f29" },
1166 { { "fr30" }, "f30" },
1167 { { "fr31" }, "f31" },
1168 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001169};
1170
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001171void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001172 unsigned &NumAliases) const {
1173 Aliases = GCCRegAliases;
1174 NumAliases = llvm::array_lengthof(GCCRegAliases);
1175}
1176} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001177
Chris Lattner5ba61f02006-10-14 07:39:34 +00001178namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001179class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001180public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001181 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindola2da35322013-12-16 23:27:41 +00001182 DescriptionString = "E-p:32:32-"
1183 "i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001184
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001185 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001186 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001187 case llvm::Triple::FreeBSD:
1188 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001189 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001190 PtrDiffType = SignedInt;
1191 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001192 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001193 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001194 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001195 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001196
Roman Divacky3ffe7462012-03-13 19:20:17 +00001197 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1198 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001199 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001200 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001201
1202 // PPC32 supports atomics up to 4 bytes.
1203 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001204 }
1205
Meador Inge5d3fb222012-06-16 03:34:49 +00001206 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Roman Divacky965b0b72011-01-06 08:27:10 +00001207 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001208 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001209 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001210};
1211} // end anonymous namespace.
1212
Bill Schmidt778d3872013-07-26 01:36:11 +00001213// Note: ABI differences may eventually require us to have a separate
1214// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001215namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001216class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001217public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001218 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001219 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001220 IntMaxType = SignedLong;
1221 UIntMaxType = UnsignedLong;
1222 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001223
Roman Divacky3ffe7462012-03-13 19:20:17 +00001224 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1225 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001226 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola47debc02013-12-16 21:59:14 +00001227 DescriptionString = "E-"
Rafael Espindola2da35322013-12-16 23:27:41 +00001228 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00001229 "n32:64";
Bill Schmidtcec4cb12012-10-29 14:59:24 +00001230 } else
Rafael Espindola47debc02013-12-16 21:59:14 +00001231 DescriptionString = "E-"
Rafael Espindola2da35322013-12-16 23:27:41 +00001232 "i64:64-f128:128-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00001233 "n32:64";
Benjamin Kramer37196de2012-11-17 17:30:55 +00001234
1235 // PPC64 supports atomics up to 8 bytes.
1236 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001237 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001238 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1239 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001240 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001241};
1242} // end anonymous namespace.
1243
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001244
1245namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001246class DarwinPPC32TargetInfo :
1247 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001248public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001249 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1250 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001251 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001252 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherc04fe092013-10-16 21:19:19 +00001253 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001254 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001255 SuitableAlign = 128;
Rafael Espindola2da35322013-12-16 23:27:41 +00001256 DescriptionString = "E-p:32:32"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00001257 "-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001258 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001259 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1260 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001261 }
1262};
1263
1264class DarwinPPC64TargetInfo :
1265 public DarwinTargetInfo<PPC64TargetInfo> {
1266public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001267 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1268 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001269 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001270 SuitableAlign = 128;
Rafael Espindola47debc02013-12-16 21:59:14 +00001271 DescriptionString = "E-"
Rafael Espindola2da35322013-12-16 23:27:41 +00001272 "i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001273 }
1274};
1275} // end anonymous namespace.
1276
Chris Lattner5ba61f02006-10-14 07:39:34 +00001277namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001278 static const unsigned NVPTXAddrSpaceMap[] = {
1279 1, // opencl_global
1280 3, // opencl_local
1281 4, // opencl_constant
1282 1, // cuda_device
1283 4, // cuda_constant
1284 3, // cuda_shared
1285 };
1286 class NVPTXTargetInfo : public TargetInfo {
1287 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001288 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001289 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001290 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001291 BigEndian = false;
1292 TLSSupported = false;
1293 LongWidth = LongAlign = 64;
1294 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001295 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001296 // Define available target features
1297 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001298 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001299 }
1300 virtual void getTargetDefines(const LangOptions &Opts,
1301 MacroBuilder &Builder) const {
1302 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001303 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001304 }
1305 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1306 unsigned &NumRecords) const {
Justin Holewinski83e96682012-05-24 17:43:12 +00001307 Records = BuiltinInfo;
1308 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001309 }
1310 virtual bool hasFeature(StringRef Feature) const {
Justin Holewinski83e96682012-05-24 17:43:12 +00001311 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001312 }
1313
1314 virtual void getGCCRegNames(const char * const *&Names,
1315 unsigned &NumNames) const;
1316 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1317 unsigned &NumAliases) const {
1318 // No aliases.
1319 Aliases = 0;
1320 NumAliases = 0;
1321 }
1322 virtual bool validateAsmConstraint(const char *&Name,
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001323 TargetInfo::ConstraintInfo &Info) const {
1324 switch (*Name) {
1325 default: return false;
1326 case 'c':
1327 case 'h':
1328 case 'r':
1329 case 'l':
1330 case 'f':
1331 case 'd':
1332 Info.setAllowsRegister();
1333 return true;
1334 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001335 }
1336 virtual const char *getClobbers() const {
1337 // FIXME: Is this really right?
1338 return "";
1339 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001340 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001341 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001342 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001343 }
1344 virtual bool setCPU(const std::string &Name) {
Justin Holewinski91203e82013-03-30 14:38:26 +00001345 bool Valid = llvm::StringSwitch<bool>(Name)
1346 .Case("sm_20", true)
1347 .Case("sm_21", true)
1348 .Case("sm_30", true)
1349 .Case("sm_35", true)
1350 .Default(false);
1351
1352 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001353 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001354 };
1355
1356 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1357#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1358#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1359 ALL_LANGUAGES },
1360#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001361 };
1362
1363 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1364 "r0"
1365 };
1366
1367 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1368 unsigned &NumNames) const {
1369 Names = GCCRegNames;
1370 NumNames = llvm::array_lengthof(GCCRegNames);
1371 }
1372
1373 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1374 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001375 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001376 PointerWidth = PointerAlign = 32;
Justin Holewinski83e96682012-05-24 17:43:12 +00001377 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001378 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00001379 = "e-p:32:32-i64:64"
1380 "-v16:16-v32:32-"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001381 "n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001382 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001383 };
1384
1385 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1386 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001387 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001388 PointerWidth = PointerAlign = 64;
Justin Holewinski83e96682012-05-24 17:43:12 +00001389 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001390 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00001391 = "e-i64:64"
1392 "-v16:16-v32:32-"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001393 "n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001394 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001395 };
1396}
1397
1398namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001399
1400static const unsigned R600AddrSpaceMap[] = {
1401 1, // opencl_global
1402 3, // opencl_local
1403 2, // opencl_constant
1404 1, // cuda_device
1405 2, // cuda_constant
1406 3 // cuda_shared
1407};
1408
Tom Stellardc74b1e02013-03-04 17:40:53 +00001409static const char *DescriptionStringR600 =
1410 "e"
Rafael Espindola2da35322013-12-16 23:27:41 +00001411 "-p:32:32"
1412 "-i64:64"
1413 "-v16:16-v24:32-v32:32-v48:64-v96:128"
1414 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048"
Tom Stellardc74b1e02013-03-04 17:40:53 +00001415 "-n32:64";
1416
1417static const char *DescriptionStringR600DoubleOps =
1418 "e"
Rafael Espindola2da35322013-12-16 23:27:41 +00001419 "-p:32:32"
1420 "-i64:64"
1421 "-v16:16-v24:32-v32:32-v48:64-v96:128"
1422 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048"
Tom Stellardc74b1e02013-03-04 17:40:53 +00001423 "-n32:64";
1424
1425static const char *DescriptionStringSI =
1426 "e"
Rafael Espindola47debc02013-12-16 21:59:14 +00001427 ""
Rafael Espindola2da35322013-12-16 23:27:41 +00001428 "-p3:32:32"
1429 "-i64:64"
1430 "-v16:16-v24:32-v32:32-v48:64-v96:128"
1431 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048"
Tom Stellardc74b1e02013-03-04 17:40:53 +00001432 "-n32:64";
1433
Eli Friedmand13b41e2012-10-12 23:32:00 +00001434class R600TargetInfo : public TargetInfo {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001435 /// \brief The GPU profiles supported by the R600 target.
1436 enum GPUKind {
1437 GK_NONE,
1438 GK_R600,
1439 GK_R600_DOUBLE_OPS,
1440 GK_R700,
1441 GK_R700_DOUBLE_OPS,
1442 GK_EVERGREEN,
1443 GK_EVERGREEN_DOUBLE_OPS,
1444 GK_NORTHERN_ISLANDS,
1445 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001446 GK_SOUTHERN_ISLANDS,
1447 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001448 } GPU;
1449
Eli Friedmand13b41e2012-10-12 23:32:00 +00001450public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001451 R600TargetInfo(const llvm::Triple &Triple)
1452 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001453 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001454 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001455 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001456 }
1457
1458 virtual const char * getClobbers() const {
1459 return "";
1460 }
1461
1462 virtual void getGCCRegNames(const char * const *&Names,
1463 unsigned &numNames) const {
1464 Names = NULL;
1465 numNames = 0;
1466 }
1467
1468 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1469 unsigned &NumAliases) const {
1470 Aliases = NULL;
1471 NumAliases = 0;
1472 }
1473
1474 virtual bool validateAsmConstraint(const char *&Name,
1475 TargetInfo::ConstraintInfo &info) const {
1476 return true;
1477 }
1478
1479 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1480 unsigned &NumRecords) const {
1481 Records = NULL;
1482 NumRecords = 0;
1483 }
1484
1485
1486 virtual void getTargetDefines(const LangOptions &Opts,
1487 MacroBuilder &Builder) const {
1488 Builder.defineMacro("__R600__");
1489 }
1490
1491 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1492 return TargetInfo::CharPtrBuiltinVaList;
1493 }
1494
Tom Stellardc74b1e02013-03-04 17:40:53 +00001495 virtual bool setCPU(const std::string &Name) {
1496 GPU = llvm::StringSwitch<GPUKind>(Name)
1497 .Case("r600" , GK_R600)
1498 .Case("rv610", GK_R600)
1499 .Case("rv620", GK_R600)
1500 .Case("rv630", GK_R600)
1501 .Case("rv635", GK_R600)
1502 .Case("rs780", GK_R600)
1503 .Case("rs880", GK_R600)
1504 .Case("rv670", GK_R600_DOUBLE_OPS)
1505 .Case("rv710", GK_R700)
1506 .Case("rv730", GK_R700)
1507 .Case("rv740", GK_R700_DOUBLE_OPS)
1508 .Case("rv770", GK_R700_DOUBLE_OPS)
1509 .Case("palm", GK_EVERGREEN)
1510 .Case("cedar", GK_EVERGREEN)
1511 .Case("sumo", GK_EVERGREEN)
1512 .Case("sumo2", GK_EVERGREEN)
1513 .Case("redwood", GK_EVERGREEN)
1514 .Case("juniper", GK_EVERGREEN)
1515 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1516 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1517 .Case("barts", GK_NORTHERN_ISLANDS)
1518 .Case("turks", GK_NORTHERN_ISLANDS)
1519 .Case("caicos", GK_NORTHERN_ISLANDS)
1520 .Case("cayman", GK_CAYMAN)
1521 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001522 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001523 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1524 .Case("verde", GK_SOUTHERN_ISLANDS)
1525 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001526 .Case("bonaire", GK_SEA_ISLANDS)
1527 .Case("kabini", GK_SEA_ISLANDS)
1528 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001529 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001530 .Default(GK_NONE);
1531
1532 if (GPU == GK_NONE) {
1533 return false;
1534 }
1535
1536 // Set the correct data layout
1537 switch (GPU) {
1538 case GK_NONE:
1539 case GK_R600:
1540 case GK_R700:
1541 case GK_EVERGREEN:
1542 case GK_NORTHERN_ISLANDS:
1543 DescriptionString = DescriptionStringR600;
1544 break;
1545 case GK_R600_DOUBLE_OPS:
1546 case GK_R700_DOUBLE_OPS:
1547 case GK_EVERGREEN_DOUBLE_OPS:
1548 case GK_CAYMAN:
1549 DescriptionString = DescriptionStringR600DoubleOps;
1550 break;
1551 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001552 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001553 DescriptionString = DescriptionStringSI;
1554 break;
1555 }
1556
1557 return true;
1558 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001559};
1560
1561} // end anonymous namespace
1562
1563namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001564// Namespace for x86 abstract base class
1565const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001566#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001567#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001568 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001569#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001570};
Eli Friedmanb5366062008-05-20 14:21:01 +00001571
Nuno Lopescfca1f02009-12-23 17:49:57 +00001572static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001573 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1574 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001575 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001576 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1577 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1578 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001579 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001580 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1581 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001582};
1583
Eric Christophercdd36352011-06-21 00:05:20 +00001584const TargetInfo::AddlRegName AddlRegNames[] = {
1585 { { "al", "ah", "eax", "rax" }, 0 },
1586 { { "bl", "bh", "ebx", "rbx" }, 3 },
1587 { { "cl", "ch", "ecx", "rcx" }, 2 },
1588 { { "dl", "dh", "edx", "rdx" }, 1 },
1589 { { "esi", "rsi" }, 4 },
1590 { { "edi", "rdi" }, 5 },
1591 { { "esp", "rsp" }, 7 },
1592 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001593};
1594
1595// X86 target abstract base class; x86-32 and x86-64 are very close, so
1596// most of the implementation can be shared.
1597class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001598 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001599 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001600 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001601 enum MMX3DNowEnum {
1602 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1603 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001604 enum XOPEnum {
1605 NoXOP,
1606 SSE4A,
1607 FMA4,
1608 XOP
1609 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001610
Eric Christophere1ddaf92010-04-02 23:50:19 +00001611 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001612 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001613 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001614 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001615 bool HasBMI;
1616 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001617 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001618 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001619 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001620 bool HasRDSEED;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001621 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001622 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001623 bool HasF16C;
Craig Topper679b53a2013-08-21 05:29:10 +00001624 bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
Ben Langmuir58078d02013-09-19 13:22:04 +00001625 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001626 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001627
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001628 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1629 ///
1630 /// Each enumeration represents a particular CPU supported by Clang. These
1631 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1632 enum CPUKind {
1633 CK_Generic,
1634
1635 /// \name i386
1636 /// i386-generation processors.
1637 //@{
1638 CK_i386,
1639 //@}
1640
1641 /// \name i486
1642 /// i486-generation processors.
1643 //@{
1644 CK_i486,
1645 CK_WinChipC6,
1646 CK_WinChip2,
1647 CK_C3,
1648 //@}
1649
1650 /// \name i586
1651 /// i586-generation processors, P5 microarchitecture based.
1652 //@{
1653 CK_i586,
1654 CK_Pentium,
1655 CK_PentiumMMX,
1656 //@}
1657
1658 /// \name i686
1659 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1660 //@{
1661 CK_i686,
1662 CK_PentiumPro,
1663 CK_Pentium2,
1664 CK_Pentium3,
1665 CK_Pentium3M,
1666 CK_PentiumM,
1667 CK_C3_2,
1668
1669 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1670 /// Clang however has some logic to suport this.
1671 // FIXME: Warn, deprecate, and potentially remove this.
1672 CK_Yonah,
1673 //@}
1674
1675 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001676 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001677 //@{
1678 CK_Pentium4,
1679 CK_Pentium4M,
1680 CK_Prescott,
1681 CK_Nocona,
1682 //@}
1683
1684 /// \name Core
1685 /// Core microarchitecture based processors.
1686 //@{
1687 CK_Core2,
1688
1689 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1690 /// codename which GCC no longer accepts as an option to -march, but Clang
1691 /// has some logic for recognizing it.
1692 // FIXME: Warn, deprecate, and potentially remove this.
1693 CK_Penryn,
1694 //@}
1695
1696 /// \name Atom
1697 /// Atom processors
1698 //@{
1699 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001700 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001701 //@}
1702
1703 /// \name Nehalem
1704 /// Nehalem microarchitecture based processors.
1705 //@{
1706 CK_Corei7,
1707 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001708 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001709 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001710 //@}
1711
Craig Topper449314e2013-08-20 07:09:39 +00001712 /// \name Knights Landing
1713 /// Knights Landing processor.
1714 CK_KNL,
1715
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001716 /// \name K6
1717 /// K6 architecture processors.
1718 //@{
1719 CK_K6,
1720 CK_K6_2,
1721 CK_K6_3,
1722 //@}
1723
1724 /// \name K7
1725 /// K7 architecture processors.
1726 //@{
1727 CK_Athlon,
1728 CK_AthlonThunderbird,
1729 CK_Athlon4,
1730 CK_AthlonXP,
1731 CK_AthlonMP,
1732 //@}
1733
1734 /// \name K8
1735 /// K8 architecture processors.
1736 //@{
1737 CK_Athlon64,
1738 CK_Athlon64SSE3,
1739 CK_AthlonFX,
1740 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001741 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001742 CK_Opteron,
1743 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001744 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001745 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001746
Benjamin Kramer569f2152012-01-10 11:50:18 +00001747 /// \name Bobcat
1748 /// Bobcat architecture processors.
1749 //@{
1750 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001751 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001752 //@}
1753
1754 /// \name Bulldozer
1755 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001756 //@{
1757 CK_BDVER1,
1758 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001759 CK_BDVER3,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001760 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001761
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001762 /// This specification is deprecated and will be removed in the future.
1763 /// Users should prefer \see CK_K8.
1764 // FIXME: Warn on this when the CPU is set to it.
1765 CK_x86_64,
1766 //@}
1767
1768 /// \name Geode
1769 /// Geode processors.
1770 //@{
1771 CK_Geode
1772 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001773 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001774
Rafael Espindolaeb265472013-08-21 21:59:03 +00001775 enum FPMathKind {
1776 FP_Default,
1777 FP_SSE,
1778 FP_387
1779 } FPMath;
1780
Eli Friedman3fd920a2008-08-20 02:34:37 +00001781public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001782 X86TargetInfo(const llvm::Triple &Triple)
1783 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001784 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1785 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001786 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1787 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001788 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1789 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001790 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001791 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001792 }
Benjamin Kramercf501472011-12-28 15:47:06 +00001793 virtual unsigned getFloatEvalMethod() const {
1794 // X87 evaluates with 80 bits "long double" precision.
1795 return SSELevel == NoSSE ? 2 : 0;
1796 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001797 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1798 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001799 Records = BuiltinInfo;
1800 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001801 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001802 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001803 unsigned &NumNames) const {
1804 Names = GCCRegNames;
1805 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001806 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001807 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001808 unsigned &NumAliases) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001809 Aliases = 0;
1810 NumAliases = 0;
1811 }
1812 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
Eric Christopherfd081ca2012-11-14 22:08:59 +00001813 unsigned &NumNames) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001814 Names = AddlRegNames;
1815 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001816 }
Anders Carlsson58436352009-02-28 17:11:49 +00001817 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001818 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001819 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001820 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001821 return "~{dirflag},~{fpsr},~{flags}";
1822 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001823 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001824 MacroBuilder &Builder) const;
Craig Topper13f61a62013-09-17 04:12:55 +00001825 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1826 bool Enabled);
1827 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1828 bool Enabled);
1829 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1830 bool Enabled);
Rafael Espindolaa38ce292013-08-20 15:30:32 +00001831 virtual void setFeatureEnabled(llvm::StringMap<bool> &Features,
Craig Topper86d79ef2013-09-17 04:51:29 +00001832 StringRef Name, bool Enabled) const {
1833 setFeatureEnabledImpl(Features, Name, Enabled);
1834 }
1835 // This exists purely to cut down on the number of virtual calls in
1836 // getDefaultFeatures which calls this repeatedly.
1837 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1838 StringRef Name, bool Enabled);
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00001839 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001840 virtual bool hasFeature(StringRef Feature) const;
Eric Christopher3ff21b32013-10-16 21:26:26 +00001841 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00001842 DiagnosticsEngine &Diags);
Eli Friedman33465822011-07-08 23:31:17 +00001843 virtual const char* getABI() const {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001844 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001845 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001846 else if (getTriple().getArch() == llvm::Triple::x86 &&
1847 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001848 return "no-mmx";
1849 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001850 }
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001851 virtual bool setCPU(const std::string &Name) {
Chandler Carruth212334f2011-09-28 08:55:37 +00001852 CPU = llvm::StringSwitch<CPUKind>(Name)
1853 .Case("i386", CK_i386)
1854 .Case("i486", CK_i486)
1855 .Case("winchip-c6", CK_WinChipC6)
1856 .Case("winchip2", CK_WinChip2)
1857 .Case("c3", CK_C3)
1858 .Case("i586", CK_i586)
1859 .Case("pentium", CK_Pentium)
1860 .Case("pentium-mmx", CK_PentiumMMX)
1861 .Case("i686", CK_i686)
1862 .Case("pentiumpro", CK_PentiumPro)
1863 .Case("pentium2", CK_Pentium2)
1864 .Case("pentium3", CK_Pentium3)
1865 .Case("pentium3m", CK_Pentium3M)
1866 .Case("pentium-m", CK_PentiumM)
1867 .Case("c3-2", CK_C3_2)
1868 .Case("yonah", CK_Yonah)
1869 .Case("pentium4", CK_Pentium4)
1870 .Case("pentium4m", CK_Pentium4M)
1871 .Case("prescott", CK_Prescott)
1872 .Case("nocona", CK_Nocona)
1873 .Case("core2", CK_Core2)
1874 .Case("penryn", CK_Penryn)
1875 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001876 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001877 .Case("corei7", CK_Corei7)
1878 .Case("corei7-avx", CK_Corei7AVX)
1879 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001880 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001881 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00001882 .Case("k6", CK_K6)
1883 .Case("k6-2", CK_K6_2)
1884 .Case("k6-3", CK_K6_3)
1885 .Case("athlon", CK_Athlon)
1886 .Case("athlon-tbird", CK_AthlonThunderbird)
1887 .Case("athlon-4", CK_Athlon4)
1888 .Case("athlon-xp", CK_AthlonXP)
1889 .Case("athlon-mp", CK_AthlonMP)
1890 .Case("athlon64", CK_Athlon64)
1891 .Case("athlon64-sse3", CK_Athlon64SSE3)
1892 .Case("athlon-fx", CK_AthlonFX)
1893 .Case("k8", CK_K8)
1894 .Case("k8-sse3", CK_K8SSE3)
1895 .Case("opteron", CK_Opteron)
1896 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001897 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001898 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001899 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001900 .Case("bdver1", CK_BDVER1)
1901 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001902 .Case("bdver3", CK_BDVER3)
Chandler Carruth212334f2011-09-28 08:55:37 +00001903 .Case("x86-64", CK_x86_64)
1904 .Case("geode", CK_Geode)
1905 .Default(CK_Generic);
1906
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001907 // Perform any per-CPU checks necessary to determine if this CPU is
1908 // acceptable.
1909 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1910 // invalid without explaining *why*.
1911 switch (CPU) {
1912 case CK_Generic:
1913 // No processor selected!
1914 return false;
1915
1916 case CK_i386:
1917 case CK_i486:
1918 case CK_WinChipC6:
1919 case CK_WinChip2:
1920 case CK_C3:
1921 case CK_i586:
1922 case CK_Pentium:
1923 case CK_PentiumMMX:
1924 case CK_i686:
1925 case CK_PentiumPro:
1926 case CK_Pentium2:
1927 case CK_Pentium3:
1928 case CK_Pentium3M:
1929 case CK_PentiumM:
1930 case CK_Yonah:
1931 case CK_C3_2:
1932 case CK_Pentium4:
1933 case CK_Pentium4M:
1934 case CK_Prescott:
1935 case CK_K6:
1936 case CK_K6_2:
1937 case CK_K6_3:
1938 case CK_Athlon:
1939 case CK_AthlonThunderbird:
1940 case CK_Athlon4:
1941 case CK_AthlonXP:
1942 case CK_AthlonMP:
1943 case CK_Geode:
1944 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00001945 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001946 return false;
1947
1948 // Fallthrough
1949 case CK_Nocona:
1950 case CK_Core2:
1951 case CK_Penryn:
1952 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00001953 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001954 case CK_Corei7:
1955 case CK_Corei7AVX:
1956 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00001957 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00001958 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001959 case CK_Athlon64:
1960 case CK_Athlon64SSE3:
1961 case CK_AthlonFX:
1962 case CK_K8:
1963 case CK_K8SSE3:
1964 case CK_Opteron:
1965 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00001966 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00001967 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001968 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001969 case CK_BDVER1:
1970 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001971 case CK_BDVER3:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001972 case CK_x86_64:
1973 return true;
1974 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00001975 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001976 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001977
Rafael Espindolaeb265472013-08-21 21:59:03 +00001978 virtual bool setFPMath(StringRef Name);
1979
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001980 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
1981 // We accept all non-ARM calling conventions
1982 return (CC == CC_X86ThisCall ||
1983 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00001984 CC == CC_X86StdCall ||
1985 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00001986 CC == CC_X86Pascal ||
1987 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001988 }
1989
Aaron Ballman02df2e02012-12-09 17:45:41 +00001990 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
1991 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001992 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001993};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001994
Rafael Espindolaeb265472013-08-21 21:59:03 +00001995bool X86TargetInfo::setFPMath(StringRef Name) {
1996 if (Name == "387") {
1997 FPMath = FP_387;
1998 return true;
1999 }
2000 if (Name == "sse") {
2001 FPMath = FP_SSE;
2002 return true;
2003 }
2004 return false;
2005}
2006
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002007void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002008 // FIXME: This *really* should not be here.
2009
2010 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002011 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002012 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002013
Chandler Carruth212334f2011-09-28 08:55:37 +00002014 switch (CPU) {
2015 case CK_Generic:
2016 case CK_i386:
2017 case CK_i486:
2018 case CK_i586:
2019 case CK_Pentium:
2020 case CK_i686:
2021 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002022 break;
2023 case CK_PentiumMMX:
2024 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002025 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002026 break;
2027 case CK_Pentium3:
2028 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002029 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002030 break;
2031 case CK_PentiumM:
2032 case CK_Pentium4:
2033 case CK_Pentium4M:
2034 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002035 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002036 break;
2037 case CK_Yonah:
2038 case CK_Prescott:
2039 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002040 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002041 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002042 break;
2043 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002044 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002045 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002046 break;
2047 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002048 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002049 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002050 break;
2051 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002052 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002053 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002054 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002055 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002056 setFeatureEnabledImpl(Features, "sse4.2", true);
2057 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002058 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002059 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002060 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002061 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002062 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002063 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002064 break;
2065 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002066 setFeatureEnabledImpl(Features, "avx", true);
2067 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002068 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002069 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002070 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002071 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002072 setFeatureEnabledImpl(Features, "avx", true);
2073 setFeatureEnabledImpl(Features, "aes", true);
2074 setFeatureEnabledImpl(Features, "pclmul", true);
2075 setFeatureEnabledImpl(Features, "rdrnd", true);
2076 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002077 break;
Craig Topper865fff52011-12-17 19:55:21 +00002078 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002079 setFeatureEnabledImpl(Features, "avx2", true);
2080 setFeatureEnabledImpl(Features, "aes", true);
2081 setFeatureEnabledImpl(Features, "pclmul", true);
2082 setFeatureEnabledImpl(Features, "lzcnt", true);
2083 setFeatureEnabledImpl(Features, "rdrnd", true);
2084 setFeatureEnabledImpl(Features, "f16c", true);
2085 setFeatureEnabledImpl(Features, "bmi", true);
2086 setFeatureEnabledImpl(Features, "bmi2", true);
2087 setFeatureEnabledImpl(Features, "rtm", true);
2088 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002089 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002090 break;
Craig Topper449314e2013-08-20 07:09:39 +00002091 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002092 setFeatureEnabledImpl(Features, "avx512f", true);
2093 setFeatureEnabledImpl(Features, "avx512cd", true);
2094 setFeatureEnabledImpl(Features, "avx512er", true);
2095 setFeatureEnabledImpl(Features, "avx512pf", true);
2096 setFeatureEnabledImpl(Features, "aes", true);
2097 setFeatureEnabledImpl(Features, "pclmul", true);
2098 setFeatureEnabledImpl(Features, "lzcnt", true);
2099 setFeatureEnabledImpl(Features, "rdrnd", true);
2100 setFeatureEnabledImpl(Features, "f16c", true);
2101 setFeatureEnabledImpl(Features, "bmi", true);
2102 setFeatureEnabledImpl(Features, "bmi2", true);
2103 setFeatureEnabledImpl(Features, "rtm", true);
2104 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002105 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002106 case CK_K6:
2107 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002108 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002109 break;
2110 case CK_K6_2:
2111 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002112 case CK_WinChip2:
2113 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002114 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002115 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002116 case CK_Athlon:
2117 case CK_AthlonThunderbird:
2118 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002119 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002120 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002121 case CK_Athlon4:
2122 case CK_AthlonXP:
2123 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002124 setFeatureEnabledImpl(Features, "sse", true);
2125 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002126 break;
2127 case CK_K8:
2128 case CK_Opteron:
2129 case CK_Athlon64:
2130 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002131 setFeatureEnabledImpl(Features, "sse2", true);
2132 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002133 break;
2134 case CK_K8SSE3:
2135 case CK_OpteronSSE3:
2136 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002137 setFeatureEnabledImpl(Features, "sse3", true);
2138 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002139 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002140 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002141 setFeatureEnabledImpl(Features, "sse3", true);
2142 setFeatureEnabledImpl(Features, "sse4a", true);
2143 setFeatureEnabledImpl(Features, "3dnowa", true);
2144 setFeatureEnabledImpl(Features, "lzcnt", true);
2145 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002146 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002147 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002148 setFeatureEnabledImpl(Features, "ssse3", true);
2149 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002150 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002151 setFeatureEnabledImpl(Features, "lzcnt", true);
2152 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002153 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002154 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002155 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002156 setFeatureEnabledImpl(Features, "avx", true);
2157 setFeatureEnabledImpl(Features, "sse4a", true);
2158 setFeatureEnabledImpl(Features, "lzcnt", true);
2159 setFeatureEnabledImpl(Features, "aes", true);
2160 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002161 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002162 setFeatureEnabledImpl(Features, "bmi", true);
2163 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002164 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002165 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002166 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002167 setFeatureEnabledImpl(Features, "xop", true);
2168 setFeatureEnabledImpl(Features, "lzcnt", true);
2169 setFeatureEnabledImpl(Features, "aes", true);
2170 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002171 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002172 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002173 break;
Eli Friedman3e94f572012-11-17 01:43:10 +00002174 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002175 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002176 setFeatureEnabledImpl(Features, "xop", true);
2177 setFeatureEnabledImpl(Features, "lzcnt", true);
2178 setFeatureEnabledImpl(Features, "aes", true);
2179 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002180 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002181 setFeatureEnabledImpl(Features, "bmi", true);
2182 setFeatureEnabledImpl(Features, "fma", true);
2183 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002184 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002185 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002186 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002187 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002188 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002189 break;
Eli Friedman33465822011-07-08 23:31:17 +00002190 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002191}
2192
Rafael Espindolae62e2792013-08-20 13:44:29 +00002193void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002194 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002195 if (Enabled) {
2196 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002197 case AVX512F:
2198 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002199 case AVX2:
2200 Features["avx2"] = true;
2201 case AVX:
2202 Features["avx"] = true;
2203 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002204 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002205 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002206 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002207 case SSSE3:
2208 Features["ssse3"] = true;
2209 case SSE3:
2210 Features["sse3"] = true;
2211 case SSE2:
2212 Features["sse2"] = true;
2213 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002214 Features["sse"] = true;
2215 case NoSSE:
2216 break;
2217 }
2218 return;
2219 }
2220
2221 switch (Level) {
2222 case NoSSE:
2223 case SSE1:
2224 Features["sse"] = false;
2225 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002226 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2227 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002228 case SSE3:
2229 Features["sse3"] = false;
2230 setXOPLevel(Features, NoXOP, false);
2231 case SSSE3:
2232 Features["ssse3"] = false;
2233 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002234 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002235 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002236 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002237 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002238 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002239 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002240 case AVX2:
2241 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002242 case AVX512F:
Craig Topper679b53a2013-08-21 05:29:10 +00002243 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2244 Features["avx512pf"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002245 }
2246}
2247
2248void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002249 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002250 if (Enabled) {
2251 switch (Level) {
2252 case AMD3DNowAthlon:
2253 Features["3dnowa"] = true;
2254 case AMD3DNow:
2255 Features["3dnow"] = true;
2256 case MMX:
2257 Features["mmx"] = true;
2258 case NoMMX3DNow:
2259 break;
2260 }
2261 return;
2262 }
2263
2264 switch (Level) {
2265 case NoMMX3DNow:
2266 case MMX:
2267 Features["mmx"] = false;
2268 case AMD3DNow:
2269 Features["3dnow"] = false;
2270 case AMD3DNowAthlon:
2271 Features["3dnowa"] = false;
2272 }
2273}
2274
2275void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002276 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002277 if (Enabled) {
2278 switch (Level) {
2279 case XOP:
2280 Features["xop"] = true;
2281 case FMA4:
2282 Features["fma4"] = true;
2283 setSSELevel(Features, AVX, true);
2284 case SSE4A:
2285 Features["sse4a"] = true;
2286 setSSELevel(Features, SSE3, true);
2287 case NoXOP:
2288 break;
2289 }
2290 return;
2291 }
2292
2293 switch (Level) {
2294 case NoXOP:
2295 case SSE4A:
2296 Features["sse4a"] = false;
2297 case FMA4:
2298 Features["fma4"] = false;
2299 case XOP:
2300 Features["xop"] = false;
2301 }
2302}
2303
Craig Topper86d79ef2013-09-17 04:51:29 +00002304void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2305 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002306 // FIXME: This *really* should not be here. We need some way of translating
2307 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002308 if (Name == "sse4")
2309 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002310
Rafael Espindolae62e2792013-08-20 13:44:29 +00002311 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002312
Craig Topper29561122013-09-19 01:13:07 +00002313 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002314 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002315 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002316 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002317 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002318 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002319 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002320 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002321 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002322 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002323 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002324 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002325 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002326 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002327 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002328 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002329 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002330 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002331 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002332 if (Enabled)
2333 setSSELevel(Features, SSE2, Enabled);
2334 } else if (Name == "pclmul") {
2335 if (Enabled)
2336 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002337 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002338 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002339 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002340 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002341 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002342 setSSELevel(Features, AVX512F, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002343 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002344 if (Enabled)
2345 setSSELevel(Features, AVX512F, Enabled);
2346 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002347 if (Enabled)
2348 setSSELevel(Features, AVX, Enabled);
2349 } else if (Name == "fma4") {
2350 setXOPLevel(Features, FMA4, Enabled);
2351 } else if (Name == "xop") {
2352 setXOPLevel(Features, XOP, Enabled);
2353 } else if (Name == "sse4a") {
2354 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002355 } else if (Name == "f16c") {
2356 if (Enabled)
2357 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002358 } else if (Name == "sha") {
2359 if (Enabled)
2360 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002361 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002362}
2363
Eric Christopher3ff21b32013-10-16 21:26:26 +00002364/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002365/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002366bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002367 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002368 // Remember the maximum enabled sselevel.
2369 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2370 // Ignore disabled features.
2371 if (Features[i][0] == '-')
2372 continue;
2373
Benjamin Kramer27402c62012-03-05 15:10:44 +00002374 StringRef Feature = StringRef(Features[i]).substr(1);
2375
2376 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002377 HasAES = true;
2378 continue;
2379 }
2380
Craig Topper3f122a72012-05-31 05:18:48 +00002381 if (Feature == "pclmul") {
2382 HasPCLMUL = true;
2383 continue;
2384 }
2385
Benjamin Kramer27402c62012-03-05 15:10:44 +00002386 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002387 HasLZCNT = true;
2388 continue;
2389 }
2390
Rafael Espindola89049822013-08-23 20:21:37 +00002391 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002392 HasRDRND = true;
2393 continue;
2394 }
2395
Benjamin Kramer27402c62012-03-05 15:10:44 +00002396 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002397 HasBMI = true;
2398 continue;
2399 }
2400
Benjamin Kramer27402c62012-03-05 15:10:44 +00002401 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002402 HasBMI2 = true;
2403 continue;
2404 }
2405
Benjamin Kramer27402c62012-03-05 15:10:44 +00002406 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002407 HasPOPCNT = true;
2408 continue;
2409 }
2410
Michael Liao625a8752012-11-10 05:17:46 +00002411 if (Feature == "rtm") {
2412 HasRTM = true;
2413 continue;
2414 }
2415
Michael Liao74f4eaf2013-03-26 17:52:08 +00002416 if (Feature == "prfchw") {
2417 HasPRFCHW = true;
2418 continue;
2419 }
2420
Michael Liaoffaae352013-03-29 05:17:55 +00002421 if (Feature == "rdseed") {
2422 HasRDSEED = true;
2423 continue;
2424 }
2425
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002426 if (Feature == "tbm") {
2427 HasTBM = true;
2428 continue;
2429 }
2430
Craig Topperbba778b2012-06-03 21:46:30 +00002431 if (Feature == "fma") {
2432 HasFMA = true;
2433 continue;
2434 }
2435
Manman Rena45358c2012-10-11 00:59:55 +00002436 if (Feature == "f16c") {
2437 HasF16C = true;
2438 continue;
2439 }
2440
Craig Topper679b53a2013-08-21 05:29:10 +00002441 if (Feature == "avx512cd") {
2442 HasAVX512CD = true;
2443 continue;
2444 }
2445
2446 if (Feature == "avx512er") {
2447 HasAVX512ER = true;
2448 continue;
2449 }
2450
2451 if (Feature == "avx512pf") {
2452 HasAVX512PF = true;
2453 continue;
2454 }
2455
Ben Langmuir58078d02013-09-19 13:22:04 +00002456 if (Feature == "sha") {
2457 HasSHA = true;
2458 continue;
2459 }
2460
Nick Lewycky50e8f482013-10-05 20:14:27 +00002461 if (Feature == "cx16") {
2462 HasCX16 = true;
2463 continue;
2464 }
2465
Daniel Dunbar979586e2009-11-11 09:38:56 +00002466 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002467 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002468 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002469 .Case("avx2", AVX2)
2470 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002471 .Case("sse4.2", SSE42)
2472 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002473 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002474 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002475 .Case("sse2", SSE2)
2476 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002477 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002478 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002479
Eli Friedman33465822011-07-08 23:31:17 +00002480 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002481 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002482 .Case("3dnowa", AMD3DNowAthlon)
2483 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002484 .Case("mmx", MMX)
2485 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002486 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002487
2488 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2489 .Case("xop", XOP)
2490 .Case("fma4", FMA4)
2491 .Case("sse4a", SSE4A)
2492 .Default(NoXOP);
2493 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002494 }
Eli Friedman33465822011-07-08 23:31:17 +00002495
Craig Topper7481d8a2013-09-10 06:55:47 +00002496 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2497 // Can't do this earlier because we need to be able to explicitly enable
2498 // popcnt and still disable sse4.2.
2499 if (!HasPOPCNT && SSELevel >= SSE42 &&
2500 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2501 HasPOPCNT = true;
2502 Features.push_back("+popcnt");
2503 }
2504
Yunzhong Gao61089362013-10-16 19:07:02 +00002505 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2506 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2507 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2508 HasPRFCHW = true;
2509 Features.push_back("+prfchw");
2510 }
2511
Rafael Espindolaeb265472013-08-21 21:59:03 +00002512 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2513 // matches the selected sse level.
2514 if (FPMath == FP_SSE && SSELevel < SSE1) {
2515 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2516 return false;
2517 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2518 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2519 return false;
2520 }
2521
Eli Friedman33465822011-07-08 23:31:17 +00002522 // Don't tell the backend if we're turning off mmx; it will end up disabling
2523 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002524 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2525 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002526 std::vector<std::string>::iterator it;
2527 it = std::find(Features.begin(), Features.end(), "-mmx");
2528 if (it != Features.end())
2529 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002530 else if (SSELevel > NoSSE)
2531 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002532 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002533}
Chris Lattnerecd49032009-03-02 22:27:17 +00002534
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002535/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2536/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002537void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002538 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002539 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002540 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002541 Builder.defineMacro("__amd64__");
2542 Builder.defineMacro("__amd64");
2543 Builder.defineMacro("__x86_64");
2544 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002545 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002546 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002547 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002548
Chris Lattnerecd49032009-03-02 22:27:17 +00002549 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002550 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2551 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002552 switch (CPU) {
2553 case CK_Generic:
2554 break;
2555 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002556 // The rest are coming from the i386 define above.
2557 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002558 break;
2559 case CK_i486:
2560 case CK_WinChipC6:
2561 case CK_WinChip2:
2562 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002563 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002564 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002565 case CK_PentiumMMX:
2566 Builder.defineMacro("__pentium_mmx__");
2567 Builder.defineMacro("__tune_pentium_mmx__");
2568 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002569 case CK_i586:
2570 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002571 defineCPUMacros(Builder, "i586");
2572 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002573 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002574 case CK_Pentium3:
2575 case CK_Pentium3M:
2576 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002577 Builder.defineMacro("__tune_pentium3__");
2578 // Fallthrough
2579 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002580 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002581 Builder.defineMacro("__tune_pentium2__");
2582 // Fallthrough
2583 case CK_PentiumPro:
2584 Builder.defineMacro("__tune_i686__");
2585 Builder.defineMacro("__tune_pentiumpro__");
2586 // Fallthrough
2587 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002588 Builder.defineMacro("__i686");
2589 Builder.defineMacro("__i686__");
2590 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2591 Builder.defineMacro("__pentiumpro");
2592 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002593 break;
2594 case CK_Pentium4:
2595 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002596 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002597 break;
2598 case CK_Yonah:
2599 case CK_Prescott:
2600 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002601 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002602 break;
2603 case CK_Core2:
2604 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002605 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002606 break;
2607 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002608 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002609 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002610 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002611 defineCPUMacros(Builder, "slm");
2612 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002613 case CK_Corei7:
2614 case CK_Corei7AVX:
2615 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002616 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002617 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002618 break;
Craig Topper449314e2013-08-20 07:09:39 +00002619 case CK_KNL:
2620 defineCPUMacros(Builder, "knl");
2621 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002622 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002623 Builder.defineMacro("__k6_2__");
2624 Builder.defineMacro("__tune_k6_2__");
2625 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002626 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002627 if (CPU != CK_K6_2) { // In case of fallthrough
2628 // FIXME: GCC may be enabling these in cases where some other k6
2629 // architecture is specified but -m3dnow is explicitly provided. The
2630 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002631 Builder.defineMacro("__k6_3__");
2632 Builder.defineMacro("__tune_k6_3__");
2633 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002634 // Fallthrough
2635 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002636 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002637 break;
2638 case CK_Athlon:
2639 case CK_AthlonThunderbird:
2640 case CK_Athlon4:
2641 case CK_AthlonXP:
2642 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002643 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002644 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002645 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002646 Builder.defineMacro("__tune_athlon_sse__");
2647 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002648 break;
2649 case CK_K8:
2650 case CK_K8SSE3:
2651 case CK_x86_64:
2652 case CK_Opteron:
2653 case CK_OpteronSSE3:
2654 case CK_Athlon64:
2655 case CK_Athlon64SSE3:
2656 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002657 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002658 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002659 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002660 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002661 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002662 case CK_BTVER1:
2663 defineCPUMacros(Builder, "btver1");
2664 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002665 case CK_BTVER2:
2666 defineCPUMacros(Builder, "btver2");
2667 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002668 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002669 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002670 break;
2671 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002672 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002673 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002674 case CK_BDVER3:
2675 defineCPUMacros(Builder, "bdver3");
2676 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002677 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002678 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002679 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002680 }
Chris Lattner96e43572009-03-02 22:40:39 +00002681
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002682 // Target properties.
2683 Builder.defineMacro("__LITTLE_ENDIAN__");
2684 Builder.defineMacro("__REGISTER_PREFIX__", "");
2685
Chris Lattner6df41af2009-04-19 17:32:33 +00002686 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2687 // functions in glibc header files that use FP Stack inline asm which the
2688 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002689 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002690
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002691 if (HasAES)
2692 Builder.defineMacro("__AES__");
2693
Craig Topper3f122a72012-05-31 05:18:48 +00002694 if (HasPCLMUL)
2695 Builder.defineMacro("__PCLMUL__");
2696
Craig Topper22967d42011-12-25 05:06:45 +00002697 if (HasLZCNT)
2698 Builder.defineMacro("__LZCNT__");
2699
Benjamin Kramer1e250392012-07-07 09:39:18 +00002700 if (HasRDRND)
2701 Builder.defineMacro("__RDRND__");
2702
Craig Topper22967d42011-12-25 05:06:45 +00002703 if (HasBMI)
2704 Builder.defineMacro("__BMI__");
2705
2706 if (HasBMI2)
2707 Builder.defineMacro("__BMI2__");
2708
Craig Topper1de83482011-12-29 16:10:46 +00002709 if (HasPOPCNT)
2710 Builder.defineMacro("__POPCNT__");
2711
Michael Liao625a8752012-11-10 05:17:46 +00002712 if (HasRTM)
2713 Builder.defineMacro("__RTM__");
2714
Michael Liao74f4eaf2013-03-26 17:52:08 +00002715 if (HasPRFCHW)
2716 Builder.defineMacro("__PRFCHW__");
2717
Michael Liaoffaae352013-03-29 05:17:55 +00002718 if (HasRDSEED)
2719 Builder.defineMacro("__RDSEED__");
2720
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002721 if (HasTBM)
2722 Builder.defineMacro("__TBM__");
2723
Rafael Espindolae62e2792013-08-20 13:44:29 +00002724 switch (XOPLevel) {
2725 case XOP:
2726 Builder.defineMacro("__XOP__");
2727 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002728 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002729 case SSE4A:
2730 Builder.defineMacro("__SSE4A__");
2731 case NoXOP:
2732 break;
2733 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002734
Craig Topperbba778b2012-06-03 21:46:30 +00002735 if (HasFMA)
2736 Builder.defineMacro("__FMA__");
2737
Manman Rena45358c2012-10-11 00:59:55 +00002738 if (HasF16C)
2739 Builder.defineMacro("__F16C__");
2740
Craig Topper679b53a2013-08-21 05:29:10 +00002741 if (HasAVX512CD)
2742 Builder.defineMacro("__AVX512CD__");
2743 if (HasAVX512ER)
2744 Builder.defineMacro("__AVX512ER__");
2745 if (HasAVX512PF)
2746 Builder.defineMacro("__AVX512PF__");
2747
Ben Langmuir58078d02013-09-19 13:22:04 +00002748 if (HasSHA)
2749 Builder.defineMacro("__SHA__");
2750
Nick Lewycky50e8f482013-10-05 20:14:27 +00002751 if (HasCX16)
2752 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2753
Chris Lattner96e43572009-03-02 22:40:39 +00002754 // Each case falls through to the previous one here.
2755 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002756 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002757 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002758 case AVX2:
2759 Builder.defineMacro("__AVX2__");
2760 case AVX:
2761 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002762 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002763 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002764 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002765 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002766 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002767 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002768 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002769 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002770 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002771 Builder.defineMacro("__SSE2__");
2772 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002773 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002774 Builder.defineMacro("__SSE__");
2775 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002776 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002777 break;
2778 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002779
Derek Schuffc7dd7222012-10-11 15:52:22 +00002780 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002781 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002782 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002783 case AVX2:
2784 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002785 case SSE42:
2786 case SSE41:
2787 case SSSE3:
2788 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002789 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002790 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002791 break;
2792 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002793 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002794 break;
2795 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002796 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002797 }
2798 }
2799
Anders Carlssone437c682010-01-27 03:47:49 +00002800 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002801 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002802 case AMD3DNowAthlon:
2803 Builder.defineMacro("__3dNOW_A__");
2804 case AMD3DNow:
2805 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002806 case MMX:
2807 Builder.defineMacro("__MMX__");
2808 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002809 break;
2810 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002811
2812 if (CPU >= CK_i486) {
2813 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2814 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2815 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2816 }
2817 if (CPU >= CK_i586)
2818 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002819}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002820
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002821bool X86TargetInfo::hasFeature(StringRef Feature) const {
2822 return llvm::StringSwitch<bool>(Feature)
2823 .Case("aes", HasAES)
2824 .Case("avx", SSELevel >= AVX)
2825 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002826 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002827 .Case("avx512cd", HasAVX512CD)
2828 .Case("avx512er", HasAVX512ER)
2829 .Case("avx512pf", HasAVX512PF)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002830 .Case("bmi", HasBMI)
2831 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002832 .Case("cx16", HasCX16)
2833 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002834 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002835 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002836 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002837 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002838 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002839 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2840 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2841 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002842 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002843 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002844 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002845 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002846 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002847 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002848 .Case("sse", SSELevel >= SSE1)
2849 .Case("sse2", SSELevel >= SSE2)
2850 .Case("sse3", SSELevel >= SSE3)
2851 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002852 .Case("sse4.1", SSELevel >= SSE41)
2853 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002854 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002855 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002856 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2857 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002858 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002859 .Default(false);
2860}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002861
Eli Friedman3fd920a2008-08-20 02:34:37 +00002862bool
Anders Carlsson58436352009-02-28 17:11:49 +00002863X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002864 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002865 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002866 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002867 case 'Y': // first letter of a pair:
2868 switch (*(Name+1)) {
2869 default: return false;
2870 case '0': // First SSE register.
2871 case 't': // Any SSE register, when SSE2 is enabled.
2872 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2873 case 'm': // any MMX register, when inter-unit moves enabled.
2874 break; // falls through to setAllowsRegister.
2875 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002876 case 'a': // eax.
2877 case 'b': // ebx.
2878 case 'c': // ecx.
2879 case 'd': // edx.
2880 case 'S': // esi.
2881 case 'D': // edi.
2882 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00002883 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002884 case 't': // top of floating point stack.
2885 case 'u': // second from top of floating point stack.
2886 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002887 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002888 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002889 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002890 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2891 case 'l': // "Index" registers: any general register that can be used as an
2892 // index in a base+index memory access.
2893 Info.setAllowsRegister();
2894 return true;
2895 case 'C': // SSE floating point constant.
2896 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002897 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002898 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002899 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002900 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002901 return true;
2902 }
2903}
2904
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002905
Eli Friedman3fd920a2008-08-20 02:34:37 +00002906std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002907X86TargetInfo::convertConstraint(const char *&Constraint) const {
2908 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002909 case 'a': return std::string("{ax}");
2910 case 'b': return std::string("{bx}");
2911 case 'c': return std::string("{cx}");
2912 case 'd': return std::string("{dx}");
2913 case 'S': return std::string("{si}");
2914 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002915 case 'p': // address
2916 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002917 case 't': // top of floating point stack.
2918 return std::string("{st}");
2919 case 'u': // second from top of floating point stack.
2920 return std::string("{st(1)}"); // second from top of floating point stack.
2921 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002922 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002923 }
2924}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002925} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002926
2927namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002928// X86-32 generic target
2929class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002930public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002931 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002932 DoubleAlign = LongLongAlign = 32;
2933 LongDoubleWidth = 96;
2934 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002935 SuitableAlign = 128;
Rafael Espindola2da35322013-12-16 23:27:41 +00002936 DescriptionString = "e-p:32:32"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00002937 "-f64:32:64-"
Rafael Espindola2da35322013-12-16 23:27:41 +00002938 "f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002939 SizeType = UnsignedInt;
2940 PtrDiffType = SignedInt;
2941 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002942 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002943
2944 // Use fpret for all types.
2945 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2946 (1 << TargetInfo::Double) |
2947 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002948
2949 // x86-32 has atomics up to 8 bytes
2950 // FIXME: Check that we actually have cmpxchg8b before setting
2951 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2952 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002953 }
Meador Inge5d3fb222012-06-16 03:34:49 +00002954 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2955 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002956 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002957
Chris Lattnerd545ad12009-09-23 06:06:36 +00002958 int getEHDataRegisterNumber(unsigned RegNo) const {
2959 if (RegNo == 0) return 0;
2960 if (RegNo == 1) return 2;
2961 return -1;
2962 }
Bill Wendling887b4852012-11-12 06:42:51 +00002963 virtual bool validateInputSize(StringRef Constraint,
2964 unsigned Size) const {
2965 switch (Constraint[0]) {
2966 default: break;
2967 case 'a':
2968 case 'b':
2969 case 'c':
2970 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00002971 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00002972 }
2973
2974 return true;
2975 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002976};
2977} // end anonymous namespace
2978
2979namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002980class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2981public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002982 NetBSDI386TargetInfo(const llvm::Triple &Triple)
2983 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002984
2985 virtual unsigned getFloatEvalMethod() const {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00002986 unsigned Major, Minor, Micro;
2987 getTriple().getOSVersion(Major, Minor, Micro);
2988 // New NetBSD uses the default rounding mode.
2989 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
2990 return X86_32TargetInfo::getFloatEvalMethod();
2991 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002992 return 1;
2993 }
2994};
2995} // end anonymous namespace
2996
2997namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00002998class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2999public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003000 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3001 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003002 SizeType = UnsignedLong;
3003 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003004 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003005 }
3006};
3007} // end anonymous namespace
3008
3009namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003010class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3011public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003012 BitrigI386TargetInfo(const llvm::Triple &Triple)
3013 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003014 SizeType = UnsignedLong;
3015 IntPtrType = SignedLong;
3016 PtrDiffType = SignedLong;
3017 }
3018};
3019} // end anonymous namespace
3020
3021namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003022class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003023public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003024 DarwinI386TargetInfo(const llvm::Triple &Triple)
3025 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003026 LongDoubleWidth = 128;
3027 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003028 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003029 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003030 SizeType = UnsignedLong;
3031 IntPtrType = SignedLong;
Rafael Espindola2da35322013-12-16 23:27:41 +00003032 DescriptionString = "e-p:32:32"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00003033 "-f64:32:64-"
Rafael Espindola2da35322013-12-16 23:27:41 +00003034 "f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003035 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003036 }
3037
Eli Friedman3fd920a2008-08-20 02:34:37 +00003038};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003039} // end anonymous namespace
3040
3041namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003042// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003043class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003044public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003045 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3046 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00003047 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00003048 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003049 DoubleAlign = LongLongAlign = 64;
Rafael Espindola2da35322013-12-16 23:27:41 +00003050 DescriptionString = "e-p:32:32-"
3051 "i64:64-"
3052 "f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003053 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003054 virtual void getTargetDefines(const LangOptions &Opts,
3055 MacroBuilder &Builder) const {
3056 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3057 }
3058};
3059} // end anonymous namespace
3060
3061namespace {
3062
3063// x86-32 Windows Visual Studio target
3064class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
3065public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003066 VisualStudioWindowsX86_32TargetInfo(const llvm::Triple &Triple)
3067 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003068 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003069 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3070 }
3071 virtual void getTargetDefines(const LangOptions &Opts,
3072 MacroBuilder &Builder) const {
3073 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3074 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3075 // The value of the following reflects processor type.
3076 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3077 // We lost the original triple, so we use the default.
3078 Builder.defineMacro("_M_IX86", "600");
3079 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003080};
3081} // end anonymous namespace
3082
3083namespace {
3084// x86-32 MinGW target
3085class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3086public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003087 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3088 : WindowsX86_32TargetInfo(Triple) {}
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003089 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003090 MacroBuilder &Builder) const {
3091 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003092 DefineStd(Builder, "WIN32", Opts);
3093 DefineStd(Builder, "WINNT", Opts);
3094 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003095 Builder.defineMacro("__MSVCRT__");
3096 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003097
3098 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3099 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003100 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003101 // Provide "as-is" __declspec.
3102 Builder.defineMacro("__declspec", "__declspec");
3103 else
3104 // Provide alias of __attribute__ like mingw32-gcc.
3105 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003106 }
3107};
3108} // end anonymous namespace
3109
3110namespace {
3111// x86-32 Cygwin target
3112class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3113public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003114 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3115 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003116 TLSSupported = false;
3117 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003118 DoubleAlign = LongLongAlign = 64;
Rafael Espindola2da35322013-12-16 23:27:41 +00003119 DescriptionString = "e-p:32:32-"
3120 "i64:64-"
3121 "f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003122 }
3123 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003124 MacroBuilder &Builder) const {
3125 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003126 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003127 Builder.defineMacro("__CYGWIN__");
3128 Builder.defineMacro("__CYGWIN32__");
3129 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003130 if (Opts.CPlusPlus)
3131 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003132 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003133};
3134} // end anonymous namespace
3135
3136namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003137// x86-32 Haiku target
3138class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3139public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003140 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003141 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003142 IntPtrType = SignedLong;
3143 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003144 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003145 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003146 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003147 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00003148 virtual void getTargetDefines(const LangOptions &Opts,
3149 MacroBuilder &Builder) const {
3150 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3151 Builder.defineMacro("__INTEL__");
3152 Builder.defineMacro("__HAIKU__");
3153 }
3154};
3155} // end anonymous namespace
3156
Douglas Gregor9fabd852011-07-01 22:41:14 +00003157// RTEMS Target
3158template<typename Target>
3159class RTEMSTargetInfo : public OSTargetInfo<Target> {
3160protected:
3161 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3162 MacroBuilder &Builder) const {
3163 // RTEMS defines; list based off of gcc output
3164
Douglas Gregor9fabd852011-07-01 22:41:14 +00003165 Builder.defineMacro("__rtems__");
3166 Builder.defineMacro("__ELF__");
3167 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003168
Douglas Gregor9fabd852011-07-01 22:41:14 +00003169public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003170 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3171 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003172
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003173 switch (Triple.getArch()) {
3174 default:
3175 case llvm::Triple::x86:
3176 // this->MCountName = ".mcount";
3177 break;
3178 case llvm::Triple::mips:
3179 case llvm::Triple::mipsel:
3180 case llvm::Triple::ppc:
3181 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003182 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003183 // this->MCountName = "_mcount";
3184 break;
3185 case llvm::Triple::arm:
3186 // this->MCountName = "__mcount";
3187 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003188 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003189 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003190};
3191
3192namespace {
3193// x86-32 RTEMS target
3194class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3195public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003196 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003197 SizeType = UnsignedLong;
3198 IntPtrType = SignedLong;
3199 PtrDiffType = SignedLong;
3200 this->UserLabelPrefix = "";
3201 }
3202 virtual void getTargetDefines(const LangOptions &Opts,
3203 MacroBuilder &Builder) const {
3204 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3205 Builder.defineMacro("__INTEL__");
3206 Builder.defineMacro("__rtems__");
3207 }
3208};
3209} // end anonymous namespace
3210
Chris Lattnerb986aba2010-04-11 19:29:39 +00003211namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003212// x86-64 generic target
3213class X86_64TargetInfo : public X86TargetInfo {
3214public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003215 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00003216 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003217 LongDoubleWidth = 128;
3218 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003219 LargeArrayMinWidth = 128;
3220 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003221 SuitableAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003222 IntMaxType = SignedLong;
3223 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003224 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003225 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003226
Rafael Espindola47debc02013-12-16 21:59:14 +00003227 DescriptionString = "e-"
Rafael Espindola2da35322013-12-16 23:27:41 +00003228 "i64:64-"
3229 "s:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003230
3231 // Use fpret only for long double.
3232 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003233
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003234 // Use fp2ret for _Complex long double.
3235 ComplexLongDoubleUsesFP2Ret = true;
3236
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003237 // x86-64 has atomics up to 16 bytes.
3238 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3239 // on CPUs with cmpxchg16b
3240 MaxAtomicPromoteWidth = 128;
3241 MaxAtomicInlineWidth = 64;
Chris Lattner10a5b382007-01-29 05:24:35 +00003242 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003243 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3244 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003245 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003246
Chris Lattnerd545ad12009-09-23 06:06:36 +00003247 int getEHDataRegisterNumber(unsigned RegNo) const {
3248 if (RegNo == 0) return 0;
3249 if (RegNo == 1) return 1;
3250 return -1;
3251 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003252
3253 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
Charles Davisb5a214e2013-08-30 04:39:01 +00003254 return (CC == CC_C ||
3255 CC == CC_IntelOclBicc ||
3256 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003257 }
3258
Aaron Ballman02df2e02012-12-09 17:45:41 +00003259 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
3260 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003261 }
3262
Eli Friedman3fd920a2008-08-20 02:34:37 +00003263};
3264} // end anonymous namespace
3265
3266namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003267// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003268class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003269public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003270 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3271 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003272 TLSSupported = false;
3273 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003274 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003275 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003276 IntMaxType = SignedLongLong;
3277 UIntMaxType = UnsignedLongLong;
3278 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003279 SizeType = UnsignedLongLong;
3280 PtrDiffType = SignedLongLong;
3281 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003282 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003283 }
3284 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003285 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003286 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003287 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003288 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003289 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3290 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003291 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003292 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3293 return (CC == CC_C ||
3294 CC == CC_IntelOclBicc ||
3295 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3296 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003297};
3298} // end anonymous namespace
3299
3300namespace {
3301// x86-64 Windows Visual Studio target
3302class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
3303public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003304 VisualStudioWindowsX86_64TargetInfo(const llvm::Triple &Triple)
3305 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003306 LongDoubleWidth = LongDoubleAlign = 64;
3307 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003308 }
3309 virtual void getTargetDefines(const LangOptions &Opts,
3310 MacroBuilder &Builder) const {
3311 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3312 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003313 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003314 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003315 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003316};
3317} // end anonymous namespace
3318
3319namespace {
3320// x86-64 MinGW target
3321class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3322public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003323 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3324 : WindowsX86_64TargetInfo(Triple) {}
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003325 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003326 MacroBuilder &Builder) const {
3327 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003328 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003329 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00003330 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003331 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003332
3333 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3334 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003335 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003336 // Provide "as-is" __declspec.
3337 Builder.defineMacro("__declspec", "__declspec");
3338 else
3339 // Provide alias of __attribute__ like mingw32-gcc.
3340 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003341 }
3342};
3343} // end anonymous namespace
3344
3345namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003346class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3347public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003348 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3349 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003350 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003351 MaxVectorAlign = 256;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003352 }
3353};
3354} // end anonymous namespace
3355
3356namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003357class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3358public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003359 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3360 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003361 IntMaxType = SignedLongLong;
3362 UIntMaxType = UnsignedLongLong;
3363 Int64Type = SignedLongLong;
3364 }
3365};
3366} // end anonymous namespace
3367
3368namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003369class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3370public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003371 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3372 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3373 IntMaxType = SignedLongLong;
3374 UIntMaxType = UnsignedLongLong;
3375 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003376 }
3377};
Tim Northover9bb857a2013-01-31 12:13:10 +00003378}
3379
3380namespace {
3381class AArch64TargetInfo : public TargetInfo {
3382 static const char * const GCCRegNames[];
3383 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003384
Tim Northover2fe823a2013-08-01 09:23:19 +00003385 enum FPUModeEnum {
3386 FPUMode,
3387 NeonMode
3388 };
3389
3390 unsigned FPU;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003391 unsigned Crypto;
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003392 static const Builtin::Info BuiltinInfo[];
Tim Northover2fe823a2013-08-01 09:23:19 +00003393
Tim Northover9bb857a2013-01-31 12:13:10 +00003394public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003395 AArch64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Tim Northover9bb857a2013-01-31 12:13:10 +00003396 BigEndian = false;
3397 LongWidth = LongAlign = 64;
3398 LongDoubleWidth = LongDoubleAlign = 128;
3399 PointerWidth = PointerAlign = 64;
3400 SuitableAlign = 128;
Rafael Espindola91b0cbf2013-12-16 23:03:23 +00003401 DescriptionString = "e-"
Rafael Espindola2da35322013-12-16 23:27:41 +00003402 "i64:64-i128:128-"
3403 "f128:128-n32:64-S128";
Tim Northover9bb857a2013-01-31 12:13:10 +00003404
3405 WCharType = UnsignedInt;
3406 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3407
Tim Northover847d2d42013-02-18 12:11:32 +00003408 // AArch64 backend supports 64-bit operations at the moment. In principle
3409 // 128-bit is possible if register-pairs are used.
3410 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3411
Tim Northover9bb857a2013-01-31 12:13:10 +00003412 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3413 }
3414 virtual void getTargetDefines(const LangOptions &Opts,
3415 MacroBuilder &Builder) const {
3416 // GCC defines theses currently
3417 Builder.defineMacro("__aarch64__");
3418 Builder.defineMacro("__AARCH64EL__");
3419
3420 // ACLE predefines. Many can only have one possible value on v8 AArch64.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003421 Builder.defineMacro("__ARM_ACLE", "200");
Tim Northoverb85654d2013-04-05 14:08:55 +00003422 Builder.defineMacro("__ARM_ARCH", "8");
3423 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
Tim Northover9bb857a2013-01-31 12:13:10 +00003424
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003425 Builder.defineMacro("__ARM_64BIT_STATE");
3426 Builder.defineMacro("__ARM_PCS_AAPCS64");
3427 Builder.defineMacro("__ARM_ARCH_ISA_A64");
3428
Tim Northoverb85654d2013-04-05 14:08:55 +00003429 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
3430 Builder.defineMacro("__ARM_FEATURE_CLZ");
3431 Builder.defineMacro("__ARM_FEATURE_FMA");
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003432 Builder.defineMacro("__ARM_FEATURE_DIV");
Tim Northover9bb857a2013-01-31 12:13:10 +00003433
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003434 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
Tim Northover9bb857a2013-01-31 12:13:10 +00003435
3436 // 0xe implies support for half, single and double precision operations.
Tim Northoverb85654d2013-04-05 14:08:55 +00003437 Builder.defineMacro("__ARM_FP", "0xe");
Tim Northover9bb857a2013-01-31 12:13:10 +00003438
3439 // PCS specifies this for SysV variants, which is all we support. Other ABIs
Tim Northoverb85654d2013-04-05 14:08:55 +00003440 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
3441 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
Tim Northover9bb857a2013-01-31 12:13:10 +00003442
3443 if (Opts.FastMath || Opts.FiniteMathOnly)
Tim Northoverb85654d2013-04-05 14:08:55 +00003444 Builder.defineMacro("__ARM_FP_FAST");
Tim Northover9bb857a2013-01-31 12:13:10 +00003445
3446 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
Tim Northoverb85654d2013-04-05 14:08:55 +00003447 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
Tim Northover9bb857a2013-01-31 12:13:10 +00003448
Tim Northoverb85654d2013-04-05 14:08:55 +00003449 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
Tim Northover9bb857a2013-01-31 12:13:10 +00003450 Opts.ShortWChar ? "2" : "4");
3451
Tim Northoverb85654d2013-04-05 14:08:55 +00003452 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
Tim Northover9bb857a2013-01-31 12:13:10 +00003453 Opts.ShortEnums ? "1" : "4");
3454
3455 if (BigEndian)
Tim Northover2fe823a2013-08-01 09:23:19 +00003456 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3457
3458 if (FPU == NeonMode) {
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003459 Builder.defineMacro("__ARM_NEON");
Tim Northover2fe823a2013-08-01 09:23:19 +00003460 // 64-bit NEON supports half, single and double precision operations.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003461 Builder.defineMacro("__ARM_NEON_FP", "7");
3462 }
3463
3464 if (Crypto) {
3465 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northover2fe823a2013-08-01 09:23:19 +00003466 }
Tim Northover9bb857a2013-01-31 12:13:10 +00003467 }
3468 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3469 unsigned &NumRecords) const {
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003470 Records = BuiltinInfo;
3471 NumRecords = clang::AArch64::LastTSBuiltin-Builtin::FirstTSBuiltin;
Tim Northover9bb857a2013-01-31 12:13:10 +00003472 }
3473 virtual bool hasFeature(StringRef Feature) const {
Tim Northover2fe823a2013-08-01 09:23:19 +00003474 return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode);
Tim Northover9bb857a2013-01-31 12:13:10 +00003475 }
Tim Northover2fe823a2013-08-01 09:23:19 +00003476
Amara Emerson703da2e2013-10-31 09:32:33 +00003477 virtual bool setCPU(const std::string &Name) {
3478 return llvm::StringSwitch<bool>(Name)
3479 .Case("generic", true)
3480 .Cases("cortex-a53", "cortex-a57", true)
3481 .Default(false);
3482 }
3483
Eric Christopher3ff21b32013-10-16 21:26:26 +00003484 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003485 DiagnosticsEngine &Diags) {
Tim Northover2fe823a2013-08-01 09:23:19 +00003486 FPU = FPUMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003487 Crypto = 0;
Tim Northover2fe823a2013-08-01 09:23:19 +00003488 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3489 if (Features[i] == "+neon")
3490 FPU = NeonMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003491 if (Features[i] == "+crypto")
3492 Crypto = 1;
Tim Northover2fe823a2013-08-01 09:23:19 +00003493 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00003494 return true;
Tim Northover2fe823a2013-08-01 09:23:19 +00003495 }
3496
3497 virtual void getGCCRegNames(const char *const *&Names,
Tim Northover9bb857a2013-01-31 12:13:10 +00003498 unsigned &NumNames) const;
3499 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3500 unsigned &NumAliases) const;
3501
3502 virtual bool isCLZForZeroUndef() const { return false; }
3503
3504 virtual bool validateAsmConstraint(const char *&Name,
3505 TargetInfo::ConstraintInfo &Info) const {
3506 switch (*Name) {
3507 default: return false;
3508 case 'w': // An FP/SIMD vector register
3509 Info.setAllowsRegister();
3510 return true;
3511 case 'I': // Constant that can be used with an ADD instruction
3512 case 'J': // Constant that can be used with a SUB instruction
3513 case 'K': // Constant that can be used with a 32-bit logical instruction
3514 case 'L': // Constant that can be used with a 64-bit logical instruction
3515 case 'M': // Constant that can be used as a 32-bit MOV immediate
3516 case 'N': // Constant that can be used as a 64-bit MOV immediate
3517 case 'Y': // Floating point constant zero
3518 case 'Z': // Integer constant zero
3519 return true;
3520 case 'Q': // A memory reference with base register and no offset
3521 Info.setAllowsMemory();
3522 return true;
3523 case 'S': // A symbolic address
3524 Info.setAllowsRegister();
3525 return true;
3526 case 'U':
3527 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3528 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3529 // Usa: An absolute symbolic address
3530 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3531 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3532 }
3533 }
3534
3535 virtual const char *getClobbers() const {
3536 // There are no AArch64 clobbers shared by all asm statements.
3537 return "";
3538 }
3539
3540 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3541 return TargetInfo::AArch64ABIBuiltinVaList;
3542 }
3543};
3544
3545const char * const AArch64TargetInfo::GCCRegNames[] = {
3546 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3547 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3548 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3549 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3550
3551 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3552 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3553 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3554 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3555
3556 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3557 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3558 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3559 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3560
3561 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3562 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3563 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3564 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3565
3566 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3567 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3568 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3569 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3570
3571 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3572 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3573 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3574 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3575
3576 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3577 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3578 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3579 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3580};
3581
3582void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3583 unsigned &NumNames) const {
3584 Names = GCCRegNames;
3585 NumNames = llvm::array_lengthof(GCCRegNames);
3586}
3587
3588const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3589 { { "x16" }, "ip0"},
3590 { { "x17" }, "ip1"},
3591 { { "x29" }, "fp" },
3592 { { "x30" }, "lr" }
3593};
3594
3595void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3596 unsigned &NumAliases) const {
3597 Aliases = GCCRegAliases;
3598 NumAliases = llvm::array_lengthof(GCCRegAliases);
3599
3600}
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003601
3602const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
3603#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3604#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3605 ALL_LANGUAGES },
3606#include "clang/Basic/BuiltinsAArch64.def"
3607};
3608
Eli Friedman9fa28852012-08-08 23:57:20 +00003609} // end anonymous namespace
3610
3611namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003612class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003613 // Possible FPU choices.
3614 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003615 VFP2FPU = (1 << 0),
3616 VFP3FPU = (1 << 1),
3617 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003618 NeonFPU = (1 << 3),
3619 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003620 };
3621
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003622 // Possible HWDiv features.
3623 enum HWDivMode {
3624 HWDivThumb = (1 << 0),
3625 HWDivARM = (1 << 1)
3626 };
3627
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003628 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003629 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003630 }
3631
3632 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3633 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003634
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003635 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003636
Rafael Espindolaeb265472013-08-21 21:59:03 +00003637 enum {
3638 FP_Default,
3639 FP_VFP,
3640 FP_Neon
3641 } FPMath;
3642
Bernard Ogdenda13af32013-10-24 18:32:51 +00003643 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003644
Logan Chien57086ce2012-10-10 06:56:20 +00003645 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003646 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003647 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003648
3649 // Initialized via features.
3650 unsigned SoftFloat : 1;
3651 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003652
Bernard Ogden18b57012013-10-29 09:47:51 +00003653 unsigned CRC : 1;
3654
Chris Lattner5cc15e02010-03-03 19:03:45 +00003655 static const Builtin::Info BuiltinInfo[];
3656
Rafael Espindola101d5b92013-05-13 20:09:47 +00003657 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3658 // On linux, binaries targeting old cpus call functions in libgcc to
3659 // perform atomic operations. The implementation in libgcc then calls into
3660 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3661 // is that if we assume the kernel is at least as recent as the hardware,
3662 // it is safe to use atomic instructions on armv6 and newer.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003663 if (!T.isOSLinux() &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003664 T.getOS() != llvm::Triple::FreeBSD &&
Joerg Sonnenbergerfbd51be2013-12-02 16:12:05 +00003665 T.getOS() != llvm::Triple::NetBSD &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003666 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten60afa2d2013-06-15 09:40:14 +00003667 return false;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003668 StringRef ArchName = T.getArchName();
Rafael Espindola92dbc312013-05-14 00:44:24 +00003669 if (T.getArch() == llvm::Triple::arm) {
3670 if (!ArchName.startswith("armv"))
3671 return false;
3672 StringRef VersionStr = ArchName.substr(4);
3673 unsigned Version;
3674 if (VersionStr.getAsInteger(10, Version))
3675 return false;
3676 return Version >= 6;
3677 }
3678 assert(T.getArch() == llvm::Triple::thumb);
3679 if (!ArchName.startswith("thumbv"))
3680 return false;
3681 StringRef VersionStr = ArchName.substr(6);
3682 unsigned Version;
3683 if (VersionStr.getAsInteger(10, Version))
3684 return false;
3685 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003686 }
3687
Chris Lattner17df24e2008-04-21 18:56:49 +00003688public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003689 ARMTargetInfo(const llvm::Triple &Triple)
3690 : TargetInfo(Triple), ABI("aapcs-linux"), CPU("arm1136j-s"),
Rafael Espindolaeb265472013-08-21 21:59:03 +00003691 FPMath(FP_Default), IsAAPCS(true) {
Eli Friedman803acb32011-12-22 03:51:45 +00003692 BigEndian = false;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003693 switch (getTriple().getOS()) {
3694 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003695 SizeType = UnsignedLong;
3696 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003697 WCharType = SignedInt;
3698 break;
3699 default:
3700 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3701 WCharType = UnsignedInt;
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003702 SizeType = UnsignedInt;
3703 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003704 break;
3705 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003706
Chris Lattner1a8f3942010-04-23 16:29:58 +00003707 // {} in inline assembly are neon specifiers, not assembly variant
3708 // specifiers.
3709 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003710
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003711 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003712 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar03184792009-09-22 21:44:58 +00003713 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00003714 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3715 // so set preferred for small types to 32.
Rafael Espindola2da35322013-12-16 23:27:41 +00003716 DescriptionString = ("e-p:32:32-i1:8:32-i8:8:32-i16:16:32-"
3717 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00003718 "v128:64:128-a:0:32-n32-S64");
Daniel Dunbar03184792009-09-22 21:44:58 +00003719 } else {
Rafael Espindola2da35322013-12-16 23:27:41 +00003720 DescriptionString = ("e-p:32:32-"
3721 "i64:64-"
Rafael Espindola61a69252013-12-16 21:51:30 +00003722 "v128:64:128-n32-S64");
Daniel Dunbar03184792009-09-22 21:44:58 +00003723 }
John McCall86353412010-08-21 22:46:04 +00003724
3725 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003726 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003727
3728 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003729 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003730 if (shouldUseInlineAtomic(getTriple()))
3731 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003732
3733 // Do force alignment of members that follow zero length bitfields. If
3734 // the alignment of the zero-length bitfield is greater than the member
3735 // that follows it, `bar', `bar' will be aligned as the type of the
3736 // zero length bitfield.
3737 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003738 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003739 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003740 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003741 ABI = Name;
3742
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003743 // The defaults (above) are for AAPCS, check if we need to change them.
3744 //
3745 // FIXME: We need support for -meabi... we could just mangle it into the
3746 // name.
3747 if (Name == "apcs-gnu") {
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003748 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003749 // size_t is unsigned int on FreeBSD.
3750 if (getTriple().getOS() != llvm::Triple::FreeBSD)
3751 SizeType = UnsignedLong;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003752
James Molloyc445be42011-11-23 13:35:08 +00003753 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3754 WCharType = SignedInt;
3755
Daniel Dunbarf8125062010-04-22 16:14:54 +00003756 // Do not respect the alignment of bit-field types when laying out
3757 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3758 UseBitFieldTypeAlignment = false;
3759
Chad Rosier18903ee2011-08-04 01:21:14 +00003760 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosiera336c6f2011-08-04 17:52:43 +00003761 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3762 /// gcc.
Chad Rosier18903ee2011-08-04 01:21:14 +00003763 ZeroLengthBitfieldBoundary = 32;
3764
Logan Chien57086ce2012-10-10 06:56:20 +00003765 IsAAPCS = false;
3766
Daniel Dunbar03184792009-09-22 21:44:58 +00003767 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00003768 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3769 // so set preferred for small types to 32.
Rafael Espindola2da35322013-12-16 23:27:41 +00003770 DescriptionString = ("e-p:32:32-i1:8:32-i8:8:32-i16:16:32"
Rafael Espindola20b0d922013-12-16 20:34:33 +00003771 "-f64:32:64"
Rafael Espindola32083d52013-12-16 20:21:07 +00003772 "-v64:32:64-v128:32:128-a:0:32-n32-S32");
Daniel Dunbar03184792009-09-22 21:44:58 +00003773 } else {
Rafael Espindola2da35322013-12-16 23:27:41 +00003774 DescriptionString = ("e-p:32:32"
Rafael Espindola20b0d922013-12-16 20:34:33 +00003775 "-f64:32:64"
Rafael Espindola32083d52013-12-16 20:21:07 +00003776 "-v64:32:64-v128:32:128-a:0:32-n32-S32");
Daniel Dunbar03184792009-09-22 21:44:58 +00003777 }
3778
Chad Rosier99ee7822011-07-26 07:03:04 +00003779 // FIXME: Override "preferred align" for double and long long.
David Tweed8f676532012-10-25 13:33:01 +00003780 } else if (Name == "aapcs" || Name == "aapcs-vfp") {
Bob Wilson87b3a182013-06-18 05:36:04 +00003781 // size_t is unsigned long on Darwin.
3782 if (getTriple().isOSDarwin())
3783 SizeType = UnsignedLong;
Logan Chien57086ce2012-10-10 06:56:20 +00003784 IsAAPCS = true;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003785 // FIXME: Enumerated types are variable width in straight AAPCS.
3786 } else if (Name == "aapcs-linux") {
Logan Chien57086ce2012-10-10 06:56:20 +00003787 IsAAPCS = true;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003788 } else
3789 return false;
3790
3791 return true;
3792 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003793
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00003794 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Silviu Barangae5690462013-10-21 10:59:33 +00003795 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003796 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3797 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003798 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3799 CPU == "cortex-a9-mp") {
3800 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003801 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003802 }
3803 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003804 Features["vfp4"] = true;
3805 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003806 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3807 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3808 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003809 Features["vfp4"] = true;
3810 Features["neon"] = true;
3811 Features["hwdiv"] = true;
3812 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003813 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3814 Features["fp-armv8"] = true;
3815 Features["neon"] = true;
3816 Features["hwdiv"] = true;
3817 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003818 Features["crc"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003819 } else if (CPU == "cortex-r5" || CPU == "cortex-m3" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003820 CPU == "cortex-m4" ||
3821 // Enable the hwdiv extension for all v8a AArch32 cores by
3822 // default.
3823 ArchName == "armv8a" || ArchName == "armv8" ||
3824 ArchName == "thumbv8a" || ArchName == "thumbv8") {
3825 Features["hwdiv"] = true;
3826 Features["hwdiv-arm"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003827 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003828 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003829
Eric Christopher3ff21b32013-10-16 21:26:26 +00003830 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003831 DiagnosticsEngine &Diags) {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003832 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003833 CRC = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003834 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003835 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003836 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3837 if (Features[i] == "+soft-float")
3838 SoftFloat = true;
3839 else if (Features[i] == "+soft-float-abi")
3840 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003841 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003842 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003843 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003844 FPU |= VFP3FPU;
3845 else if (Features[i] == "+vfp4")
3846 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003847 else if (Features[i] == "+fp-armv8")
3848 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003849 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003850 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003851 else if (Features[i] == "+hwdiv")
3852 HWDiv |= HWDivThumb;
3853 else if (Features[i] == "+hwdiv-arm")
3854 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00003855 else if (Features[i] == "+crc")
3856 CRC = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003857 }
3858
Rafael Espindolaeb265472013-08-21 21:59:03 +00003859 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3860 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3861 return false;
3862 }
3863
3864 if (FPMath == FP_Neon)
3865 Features.push_back("+neonfp");
3866 else if (FPMath == FP_VFP)
3867 Features.push_back("-neonfp");
3868
Daniel Dunbar893d4752009-12-19 04:15:38 +00003869 // Remove front-end specific options which the backend handles differently.
3870 std::vector<std::string>::iterator it;
3871 it = std::find(Features.begin(), Features.end(), "+soft-float");
3872 if (it != Features.end())
3873 Features.erase(it);
3874 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3875 if (it != Features.end())
3876 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00003877 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003878 }
3879
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003880 virtual bool hasFeature(StringRef Feature) const {
3881 return llvm::StringSwitch<bool>(Feature)
3882 .Case("arm", true)
3883 .Case("softfloat", SoftFloat)
3884 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003885 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003886 .Case("hwdiv", HWDiv & HWDivThumb)
3887 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003888 .Default(false);
3889 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003890 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003891 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003892 return llvm::StringSwitch<const char*>(Name)
3893 .Cases("arm8", "arm810", "4")
3894 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3895 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3896 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3897 .Case("ep9312", "4T")
3898 .Cases("arm10tdmi", "arm1020t", "5T")
3899 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3900 .Case("arm926ej-s", "5TEJ")
3901 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3902 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003903 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003904 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003905 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003906 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonf643afc2013-03-04 22:37:46 +00003907 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003908 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003909 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003910 .Case("cortex-a9-mp", "7F")
3911 .Case("swift", "7S")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003912 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003913 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003914 .Cases("cortex-a53", "cortex-a57", "8A")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003915 .Default(0);
3916 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003917 static const char *getCPUProfile(StringRef Name) {
3918 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003919 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003920 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003921 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003922 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00003923 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00003924 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003925 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003926 virtual bool setCPU(const std::string &Name) {
3927 if (!getCPUDefineSuffix(Name))
3928 return false;
3929
3930 CPU = Name;
3931 return true;
3932 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00003933 virtual bool setFPMath(StringRef Name);
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003934 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003935 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003936 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003937 Builder.defineMacro("__arm");
3938 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003939
Chris Lattnerecd49032009-03-02 22:27:17 +00003940 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003941 Builder.defineMacro("__ARMEL__");
3942 Builder.defineMacro("__LITTLE_ENDIAN__");
3943 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003944
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003945 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003946 unsigned int CPUArchVer;
3947 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
3948 llvm_unreachable("Invalid char for architecture version number");
3949 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003950 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003951 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3952 StringRef CPUProfile = getCPUProfile(CPU);
3953 if (!CPUProfile.empty())
3954 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3955
Mike Stump9d54bd72009-04-08 02:07:04 +00003956 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003957
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003958 // FIXME: It's more complicated than this and we don't really support
3959 // interworking.
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003960 if (5 <= CPUArchVer && CPUArchVer <= 7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003961 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003962
David Tweed8f676532012-10-25 13:33:01 +00003963 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00003964 // Embedded targets on Darwin follow AAPCS, but not EABI.
3965 if (!getTriple().isOSDarwin())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00003966 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003967 Builder.defineMacro("__ARM_PCS", "1");
3968
David Tweed8f676532012-10-25 13:33:01 +00003969 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003970 Builder.defineMacro("__ARM_PCS_VFP", "1");
3971 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003972
Daniel Dunbar893d4752009-12-19 04:15:38 +00003973 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003974 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003975
3976 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003977 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003978
3979 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003980 Builder.defineMacro("__THUMBEL__");
3981 Builder.defineMacro("__thumb__");
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003982 if (CPUArch == "6T2" || CPUArchVer == 7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003983 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003984 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003985 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
3986 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003987
3988 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003989 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003990
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003991 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003992 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003993 if (FPU & VFP2FPU)
3994 Builder.defineMacro("__ARM_VFPV2__");
3995 if (FPU & VFP3FPU)
3996 Builder.defineMacro("__ARM_VFPV3__");
3997 if (FPU & VFP4FPU)
3998 Builder.defineMacro("__ARM_VFPV4__");
3999 }
4000
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004001 // This only gets set when Neon instructions are actually available, unlike
4002 // the VFP define, hence the soft float and arch check. This is subtly
4003 // different from gcc, we follow the intent which was that it should be set
4004 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004005 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4006 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004007 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004008 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004009
Bernard Ogden18b57012013-10-29 09:47:51 +00004010 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004011 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004012
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004013 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004014 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4015 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4016 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4017 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4018 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004019 }
4020 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4021 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004022 Records = BuiltinInfo;
4023 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004024 }
Bob Wilsona7a61e22012-01-26 22:14:27 +00004025 virtual bool isCLZForZeroUndef() const { return false; }
Meador Inge5d3fb222012-06-16 03:34:49 +00004026 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Logan Chien57086ce2012-10-10 06:56:20 +00004027 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004028 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004029 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004030 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004031 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004032 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004033 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004034 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004035 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004036 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004037 case 'l': // r0-r7
4038 case 'h': // r8-r15
4039 case 'w': // VFP Floating point register single precision
4040 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004041 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004042 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004043 case 'Q': // A memory address that is a single base register.
4044 Info.setAllowsMemory();
4045 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004046 case 'U': // a memory reference...
4047 switch (Name[1]) {
4048 case 'q': // ...ARMV4 ldrsb
4049 case 'v': // ...VFP load/store (reg+constant offset)
4050 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004051 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004052 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004053 case 'n': // valid address for Neon doubleword vector load/store
4054 case 'm': // valid address for Neon element and structure load/store
4055 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004056 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004057 Info.setAllowsMemory();
4058 Name++;
4059 return true;
4060 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004061 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004062 return false;
4063 }
Evan Chengd863adb2011-06-16 19:13:15 +00004064 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004065 std::string R;
4066 switch (*Constraint) {
4067 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004068 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004069 Constraint++;
4070 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004071 case 'p': // 'p' should be translated to 'r' by default.
4072 R = std::string("r");
4073 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004074 default:
4075 return std::string(1, *Constraint);
4076 }
4077 return R;
4078 }
Bill Wendling9d1ee112012-10-25 23:28:48 +00004079 virtual bool validateConstraintModifier(StringRef Constraint,
4080 const char Modifier,
4081 unsigned Size) const {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004082 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004083 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004084
Bill Wendling9d1ee112012-10-25 23:28:48 +00004085 // Strip off constraint modifiers.
4086 while (Constraint[0] == '=' ||
4087 Constraint[0] == '+' ||
4088 Constraint[0] == '&')
4089 Constraint = Constraint.substr(1);
4090
4091 switch (Constraint[0]) {
4092 default: break;
4093 case 'r': {
4094 switch (Modifier) {
4095 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004096 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004097 case 'q':
4098 // A register of size 32 cannot fit a vector type.
4099 return false;
4100 }
4101 }
4102 }
4103
4104 return true;
4105 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004106 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004107 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004108 return "";
4109 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004110
4111 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
4112 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4113 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004114
4115 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4116 if (RegNo == 0) return 0;
4117 if (RegNo == 1) return 1;
4118 return -1;
4119 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004120};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004121
Rafael Espindolaeb265472013-08-21 21:59:03 +00004122bool ARMTargetInfo::setFPMath(StringRef Name) {
4123 if (Name == "neon") {
4124 FPMath = FP_Neon;
4125 return true;
4126 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4127 Name == "vfp4") {
4128 FPMath = FP_VFP;
4129 return true;
4130 }
4131 return false;
4132}
4133
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004134const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004135 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004136 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004137 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4138
4139 // Float registers
4140 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4141 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4142 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004143 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004144
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004145 // Double registers
4146 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4147 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004148 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4149 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004150
4151 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004152 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4153 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004154};
4155
4156void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004157 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004158 Names = GCCRegNames;
4159 NumNames = llvm::array_lengthof(GCCRegNames);
4160}
4161
4162const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004163 { { "a1" }, "r0" },
4164 { { "a2" }, "r1" },
4165 { { "a3" }, "r2" },
4166 { { "a4" }, "r3" },
4167 { { "v1" }, "r4" },
4168 { { "v2" }, "r5" },
4169 { { "v3" }, "r6" },
4170 { { "v4" }, "r7" },
4171 { { "v5" }, "r8" },
4172 { { "v6", "rfp" }, "r9" },
4173 { { "sl" }, "r10" },
4174 { { "fp" }, "r11" },
4175 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004176 { { "r13" }, "sp" },
4177 { { "r14" }, "lr" },
4178 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004179 // The S, D and Q registers overlap, but aren't really aliases; we
4180 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004181};
4182
4183void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4184 unsigned &NumAliases) const {
4185 Aliases = GCCRegAliases;
4186 NumAliases = llvm::array_lengthof(GCCRegAliases);
4187}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004188
4189const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004190#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004191#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004192 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004193#include "clang/Basic/BuiltinsARM.def"
4194};
Chris Lattner17df24e2008-04-21 18:56:49 +00004195} // end anonymous namespace.
4196
Eli Friedmanf05b7722008-08-20 07:44:10 +00004197namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004198class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00004199 public DarwinTargetInfo<ARMTargetInfo> {
4200protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00004201 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004202 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004203 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004204 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004205
Torok Edwinb2b37c62009-06-30 17:10:35 +00004206public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004207 DarwinARMTargetInfo(const llvm::Triple &Triple)
4208 : DarwinTargetInfo<ARMTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004209 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004210 // iOS always has 64-bit atomic instructions.
4211 // FIXME: This should be based off of the target features in ARMTargetInfo.
4212 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004213
4214 // Darwin on iOS uses a variant of the ARM C++ ABI.
4215 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004216 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004217};
4218} // end anonymous namespace.
4219
Tony Linthicum76329bf2011-12-12 21:14:55 +00004220
4221namespace {
4222// Hexagon abstract base class
4223class HexagonTargetInfo : public TargetInfo {
4224 static const Builtin::Info BuiltinInfo[];
4225 static const char * const GCCRegNames[];
4226 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4227 std::string CPU;
4228public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004229 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004230 BigEndian = false;
Rafael Espindola2da35322013-12-16 23:27:41 +00004231 DescriptionString = ("e-p:32:32-"
4232 "i64:64-i1:32"
Rafael Espindola20b0d922013-12-16 20:34:33 +00004233 "-a:0-n32");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004234
4235 // {} in inline assembly are packet specifiers, not assembly variant
4236 // specifiers.
4237 NoAsmVariants = true;
4238 }
4239
4240 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4241 unsigned &NumRecords) const {
4242 Records = BuiltinInfo;
4243 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4244 }
4245
4246 virtual bool validateAsmConstraint(const char *&Name,
4247 TargetInfo::ConstraintInfo &Info) const {
4248 return true;
4249 }
4250
4251 virtual void getTargetDefines(const LangOptions &Opts,
4252 MacroBuilder &Builder) const;
4253
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004254 virtual bool hasFeature(StringRef Feature) const {
4255 return Feature == "hexagon";
4256 }
4257
Meador Inge5d3fb222012-06-16 03:34:49 +00004258 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4259 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004260 }
4261 virtual void getGCCRegNames(const char * const *&Names,
4262 unsigned &NumNames) const;
4263 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4264 unsigned &NumAliases) const;
4265 virtual const char *getClobbers() const {
4266 return "";
4267 }
Sebastian Pop86500282012-01-13 20:37:10 +00004268
4269 static const char *getHexagonCPUSuffix(StringRef Name) {
4270 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004271 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004272 .Case("hexagonv5", "5")
Sebastian Pop86500282012-01-13 20:37:10 +00004273 .Default(0);
4274 }
4275
Tony Linthicum76329bf2011-12-12 21:14:55 +00004276 virtual bool setCPU(const std::string &Name) {
Sebastian Pop86500282012-01-13 20:37:10 +00004277 if (!getHexagonCPUSuffix(Name))
4278 return false;
4279
Tony Linthicum76329bf2011-12-12 21:14:55 +00004280 CPU = Name;
4281 return true;
4282 }
4283};
4284
4285void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4286 MacroBuilder &Builder) const {
4287 Builder.defineMacro("qdsp6");
4288 Builder.defineMacro("__qdsp6", "1");
4289 Builder.defineMacro("__qdsp6__", "1");
4290
4291 Builder.defineMacro("hexagon");
4292 Builder.defineMacro("__hexagon", "1");
4293 Builder.defineMacro("__hexagon__", "1");
4294
4295 if(CPU == "hexagonv1") {
4296 Builder.defineMacro("__HEXAGON_V1__");
4297 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4298 if(Opts.HexagonQdsp6Compat) {
4299 Builder.defineMacro("__QDSP6_V1__");
4300 Builder.defineMacro("__QDSP6_ARCH__", "1");
4301 }
4302 }
4303 else if(CPU == "hexagonv2") {
4304 Builder.defineMacro("__HEXAGON_V2__");
4305 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4306 if(Opts.HexagonQdsp6Compat) {
4307 Builder.defineMacro("__QDSP6_V2__");
4308 Builder.defineMacro("__QDSP6_ARCH__", "2");
4309 }
4310 }
4311 else if(CPU == "hexagonv3") {
4312 Builder.defineMacro("__HEXAGON_V3__");
4313 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4314 if(Opts.HexagonQdsp6Compat) {
4315 Builder.defineMacro("__QDSP6_V3__");
4316 Builder.defineMacro("__QDSP6_ARCH__", "3");
4317 }
4318 }
4319 else if(CPU == "hexagonv4") {
4320 Builder.defineMacro("__HEXAGON_V4__");
4321 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4322 if(Opts.HexagonQdsp6Compat) {
4323 Builder.defineMacro("__QDSP6_V4__");
4324 Builder.defineMacro("__QDSP6_ARCH__", "4");
4325 }
4326 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004327 else if(CPU == "hexagonv5") {
4328 Builder.defineMacro("__HEXAGON_V5__");
4329 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4330 if(Opts.HexagonQdsp6Compat) {
4331 Builder.defineMacro("__QDSP6_V5__");
4332 Builder.defineMacro("__QDSP6_ARCH__", "5");
4333 }
4334 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004335}
4336
4337const char * const HexagonTargetInfo::GCCRegNames[] = {
4338 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4339 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4340 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4341 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4342 "p0", "p1", "p2", "p3",
4343 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4344};
4345
4346void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4347 unsigned &NumNames) const {
4348 Names = GCCRegNames;
4349 NumNames = llvm::array_lengthof(GCCRegNames);
4350}
4351
4352
4353const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4354 { { "sp" }, "r29" },
4355 { { "fp" }, "r30" },
4356 { { "lr" }, "r31" },
4357 };
4358
4359void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4360 unsigned &NumAliases) const {
4361 Aliases = GCCRegAliases;
4362 NumAliases = llvm::array_lengthof(GCCRegAliases);
4363}
4364
4365
4366const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4367#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4368#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4369 ALL_LANGUAGES },
4370#include "clang/Basic/BuiltinsHexagon.def"
4371};
4372}
4373
4374
Chris Lattner5ba61f02006-10-14 07:39:34 +00004375namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004376// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4377class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004378 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4379 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004380 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004381public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004382 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004383
Eric Christopher3ff21b32013-10-16 21:26:26 +00004384 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00004385 DiagnosticsEngine &Diags) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004386 SoftFloat = false;
4387 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4388 if (Features[i] == "+soft-float")
4389 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004390 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004391 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00004392 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004393 MacroBuilder &Builder) const {
4394 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004395 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004396
4397 if (SoftFloat)
4398 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004399 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004400
4401 virtual bool hasFeature(StringRef Feature) const {
4402 return llvm::StringSwitch<bool>(Feature)
4403 .Case("softfloat", SoftFloat)
4404 .Case("sparc", true)
4405 .Default(false);
4406 }
4407
Gabor Greif49991682008-02-21 16:29:08 +00004408 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4409 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004410 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00004411 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004412 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4413 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00004414 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004415 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00004416 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004417 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00004418 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004419 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00004420 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004421 // FIXME: Implement!
4422 return false;
Gabor Greif49991682008-02-21 16:29:08 +00004423 }
4424 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004425 // FIXME: Implement!
4426 return "";
Gabor Greif49991682008-02-21 16:29:08 +00004427 }
4428};
4429
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004430const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00004431 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4432 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4433 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4434 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4435};
4436
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004437void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4438 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004439 Names = GCCRegNames;
4440 NumNames = llvm::array_lengthof(GCCRegNames);
4441}
4442
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004443const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004444 { { "g0" }, "r0" },
4445 { { "g1" }, "r1" },
4446 { { "g2" }, "r2" },
4447 { { "g3" }, "r3" },
4448 { { "g4" }, "r4" },
4449 { { "g5" }, "r5" },
4450 { { "g6" }, "r6" },
4451 { { "g7" }, "r7" },
4452 { { "o0" }, "r8" },
4453 { { "o1" }, "r9" },
4454 { { "o2" }, "r10" },
4455 { { "o3" }, "r11" },
4456 { { "o4" }, "r12" },
4457 { { "o5" }, "r13" },
4458 { { "o6", "sp" }, "r14" },
4459 { { "o7" }, "r15" },
4460 { { "l0" }, "r16" },
4461 { { "l1" }, "r17" },
4462 { { "l2" }, "r18" },
4463 { { "l3" }, "r19" },
4464 { { "l4" }, "r20" },
4465 { { "l5" }, "r21" },
4466 { { "l6" }, "r22" },
4467 { { "l7" }, "r23" },
4468 { { "i0" }, "r24" },
4469 { { "i1" }, "r25" },
4470 { { "i2" }, "r26" },
4471 { { "i3" }, "r27" },
4472 { { "i4" }, "r28" },
4473 { { "i5" }, "r29" },
4474 { { "i6", "fp" }, "r30" },
4475 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00004476};
4477
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004478void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4479 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004480 Aliases = GCCRegAliases;
4481 NumAliases = llvm::array_lengthof(GCCRegAliases);
4482}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004483
4484// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4485class SparcV8TargetInfo : public SparcTargetInfo {
4486public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004487 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004488 // FIXME: Support Sparc quad-precision long double?
Rafael Espindola2da35322013-12-16 23:27:41 +00004489 DescriptionString = "E-p:32:32-"
4490 "i64:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004491 }
4492
4493 virtual void getTargetDefines(const LangOptions &Opts,
4494 MacroBuilder &Builder) const {
4495 SparcTargetInfo::getTargetDefines(Opts, Builder);
4496 Builder.defineMacro("__sparcv8");
4497 }
4498};
4499
4500// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4501class SparcV9TargetInfo : public SparcTargetInfo {
4502public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004503 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004504 // FIXME: Support Sparc quad-precision long double?
Rafael Espindola47debc02013-12-16 21:59:14 +00004505 DescriptionString = "E-"
Rafael Espindola2da35322013-12-16 23:27:41 +00004506 "i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00004507 // This is an LP64 platform.
4508 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004509
4510 // OpenBSD uses long long for int64_t and intmax_t.
4511 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
4512 IntMaxType = SignedLongLong;
4513 UIntMaxType = UnsignedLongLong;
4514 } else {
4515 IntMaxType = SignedLong;
4516 UIntMaxType = UnsignedLong;
4517 }
4518 Int64Type = IntMaxType;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004519 }
4520
4521 virtual void getTargetDefines(const LangOptions &Opts,
4522 MacroBuilder &Builder) const {
4523 SparcTargetInfo::getTargetDefines(Opts, Builder);
4524 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00004525 Builder.defineMacro("__arch64__");
4526 // Solaris and its derivative AuroraUX don't need these variants, but the
4527 // BSDs do.
4528 if (getTriple().getOS() != llvm::Triple::Solaris &&
4529 getTriple().getOS() != llvm::Triple::AuroraUX) {
4530 Builder.defineMacro("__sparc64__");
4531 Builder.defineMacro("__sparc_v9__");
4532 Builder.defineMacro("__sparcv9__");
4533 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004534 }
4535};
4536
Gabor Greif49991682008-02-21 16:29:08 +00004537} // end anonymous namespace.
4538
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004539namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004540class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4541public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004542 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
4543 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004544 SizeType = UnsignedInt;
4545 PtrDiffType = SignedInt;
4546 }
4547};
Torok Edwinb2b37c62009-06-30 17:10:35 +00004548class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004549public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004550 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
4551 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00004552 SizeType = UnsignedInt;
4553 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004554 }
4555};
4556} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00004557
Chris Lattnerb781dc792008-05-08 05:58:21 +00004558namespace {
Ulrich Weigand47445072013-05-06 16:26:41 +00004559 class SystemZTargetInfo : public TargetInfo {
4560 static const char *const GCCRegNames[];
4561
4562 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004563 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Ulrich Weigand47445072013-05-06 16:26:41 +00004564 TLSSupported = true;
4565 IntWidth = IntAlign = 32;
4566 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
4567 PointerWidth = PointerAlign = 64;
4568 LongDoubleWidth = 128;
4569 LongDoubleAlign = 64;
4570 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4571 MinGlobalAlign = 16;
Rafael Espindola04c685b2013-12-16 22:50:41 +00004572 DescriptionString = "E-i1:8:16-i8:8:16-i64:64"
4573 "-f128:64-a:8:16-n32:64";
Ulrich Weigand47445072013-05-06 16:26:41 +00004574 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4575 }
4576 virtual void getTargetDefines(const LangOptions &Opts,
4577 MacroBuilder &Builder) const {
4578 Builder.defineMacro("__s390__");
4579 Builder.defineMacro("__s390x__");
4580 Builder.defineMacro("__zarch__");
4581 Builder.defineMacro("__LONG_DOUBLE_128__");
4582 }
4583 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4584 unsigned &NumRecords) const {
4585 // FIXME: Implement.
4586 Records = 0;
4587 NumRecords = 0;
4588 }
4589
4590 virtual void getGCCRegNames(const char *const *&Names,
4591 unsigned &NumNames) const;
4592 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4593 unsigned &NumAliases) const {
4594 // No aliases.
4595 Aliases = 0;
4596 NumAliases = 0;
4597 }
4598 virtual bool validateAsmConstraint(const char *&Name,
4599 TargetInfo::ConstraintInfo &info) const;
4600 virtual const char *getClobbers() const {
4601 // FIXME: Is this really right?
4602 return "";
4603 }
4604 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4605 return TargetInfo::SystemZBuiltinVaList;
4606 }
Richard Sandiford4652d892013-07-19 16:51:51 +00004607 virtual bool setCPU(const std::string &Name) {
4608 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4609 .Case("z10", true)
4610 .Case("z196", true)
4611 .Case("zEC12", true)
4612 .Default(false);
4613
4614 // No need to store the CPU yet. There aren't any CPU-specific
4615 // macros to define.
4616 return CPUKnown;
4617 }
Ulrich Weigand47445072013-05-06 16:26:41 +00004618 };
4619
4620 const char *const SystemZTargetInfo::GCCRegNames[] = {
4621 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4622 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4623 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
4624 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
4625 };
4626
4627 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
4628 unsigned &NumNames) const {
4629 Names = GCCRegNames;
4630 NumNames = llvm::array_lengthof(GCCRegNames);
4631 }
4632
4633 bool SystemZTargetInfo::
4634 validateAsmConstraint(const char *&Name,
4635 TargetInfo::ConstraintInfo &Info) const {
4636 switch (*Name) {
4637 default:
4638 return false;
4639
4640 case 'a': // Address register
4641 case 'd': // Data register (equivalent to 'r')
4642 case 'f': // Floating-point register
4643 Info.setAllowsRegister();
4644 return true;
4645
4646 case 'I': // Unsigned 8-bit constant
4647 case 'J': // Unsigned 12-bit constant
4648 case 'K': // Signed 16-bit constant
4649 case 'L': // Signed 20-bit displacement (on all targets we support)
4650 case 'M': // 0x7fffffff
4651 return true;
4652
4653 case 'Q': // Memory with base and unsigned 12-bit displacement
4654 case 'R': // Likewise, plus an index
4655 case 'S': // Memory with base and signed 20-bit displacement
4656 case 'T': // Likewise, plus an index
4657 Info.setAllowsMemory();
4658 return true;
4659 }
4660 }
4661}
4662
4663namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004664 class MSP430TargetInfo : public TargetInfo {
4665 static const char * const GCCRegNames[];
4666 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004667 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004668 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004669 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00004670 IntWidth = 16; IntAlign = 16;
4671 LongWidth = 32; LongLongWidth = 64;
4672 LongAlign = LongLongAlign = 16;
4673 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004674 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004675 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00004676 IntMaxType = SignedLongLong;
4677 UIntMaxType = UnsignedLongLong;
4678 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004679 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00004680 SigAtomicType = SignedLong;
Rafael Espindola2da35322013-12-16 23:27:41 +00004681 DescriptionString = "e-p:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004682 }
4683 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004684 MacroBuilder &Builder) const {
4685 Builder.defineMacro("MSP430");
4686 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004687 // FIXME: defines for different 'flavours' of MCU
4688 }
4689 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4690 unsigned &NumRecords) const {
4691 // FIXME: Implement.
4692 Records = 0;
4693 NumRecords = 0;
4694 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004695 virtual bool hasFeature(StringRef Feature) const {
4696 return Feature == "msp430";
4697 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004698 virtual void getGCCRegNames(const char * const *&Names,
4699 unsigned &NumNames) const;
4700 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4701 unsigned &NumAliases) const {
4702 // No aliases.
4703 Aliases = 0;
4704 NumAliases = 0;
4705 }
4706 virtual bool validateAsmConstraint(const char *&Name,
4707 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00004708 // No target constraints for now.
4709 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004710 }
4711 virtual const char *getClobbers() const {
4712 // FIXME: Is this really right?
4713 return "";
4714 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004715 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004716 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00004717 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004718 }
4719 };
4720
4721 const char * const MSP430TargetInfo::GCCRegNames[] = {
4722 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4723 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4724 };
4725
4726 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4727 unsigned &NumNames) const {
4728 Names = GCCRegNames;
4729 NumNames = llvm::array_lengthof(GCCRegNames);
4730 }
4731}
4732
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00004733namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004734
Mike Stump11289f42009-09-09 15:08:12 +00004735 // LLVM and Clang cannot be used directly to output native binaries for
4736 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00004737 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00004738 //
4739 // TCE uses the llvm bitcode as input and uses it for generating customized
4740 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00004741 // publicly available in http://tce.cs.tut.fi
4742
Eli Friedman1f191002011-10-07 19:51:42 +00004743 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4744 3, // opencl_global
4745 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00004746 5, // opencl_constant
4747 0, // cuda_device
4748 0, // cuda_constant
4749 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00004750 };
4751
Eli Friedmana9c3d712009-08-19 20:47:07 +00004752 class TCETargetInfo : public TargetInfo{
4753 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004754 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004755 TLSSupported = false;
4756 IntWidth = 32;
4757 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004758 PointerWidth = 32;
4759 IntAlign = 32;
4760 LongAlign = LongLongAlign = 32;
4761 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004762 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004763 SizeType = UnsignedInt;
4764 IntMaxType = SignedLong;
4765 UIntMaxType = UnsignedLong;
4766 IntPtrType = SignedInt;
4767 PtrDiffType = SignedInt;
4768 FloatWidth = 32;
4769 FloatAlign = 32;
4770 DoubleWidth = 32;
4771 DoubleAlign = 32;
4772 LongDoubleWidth = 32;
4773 LongDoubleAlign = 32;
4774 FloatFormat = &llvm::APFloat::IEEEsingle;
4775 DoubleFormat = &llvm::APFloat::IEEEsingle;
4776 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola2da35322013-12-16 23:27:41 +00004777 DescriptionString = "E-p:32:32-i8:8:32-"
4778 "i16:16:32-i64:32"
4779 "-f64:32-v64:32-"
4780 "v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00004781 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00004782 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004783 }
4784
4785 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004786 MacroBuilder &Builder) const {
4787 DefineStd(Builder, "tce", Opts);
4788 Builder.defineMacro("__TCE__");
4789 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00004790 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004791 virtual bool hasFeature(StringRef Feature) const {
4792 return Feature == "tce";
4793 }
4794
Eli Friedmana9c3d712009-08-19 20:47:07 +00004795 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4796 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00004797 virtual const char *getClobbers() const {
4798 return "";
4799 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004800 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4801 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004802 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00004803 virtual void getGCCRegNames(const char * const *&Names,
4804 unsigned &NumNames) const {}
4805 virtual bool validateAsmConstraint(const char *&Name,
4806 TargetInfo::ConstraintInfo &info) const {
4807 return true;
4808 }
4809 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4810 unsigned &NumAliases) const {}
4811 };
4812}
4813
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004814namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004815class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00004816 virtual void setDescriptionString() = 0;
4817
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004818 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004819 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00004820 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00004821 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004822 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00004823 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004824 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00004825 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004826 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004827 enum DspRevEnum {
4828 NoDSP, DSP1, DSP2
4829 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00004830 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004831
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004832protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00004833 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004834 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004835
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004836public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004837 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
4838 const std::string &CPUStr)
4839 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004840 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004841 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004842
Eric Christopher0b26a612010-03-02 02:41:08 +00004843 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004844 virtual bool setABI(const std::string &Name) = 0;
Eric Christopher0b26a612010-03-02 02:41:08 +00004845 virtual bool setCPU(const std::string &Name) {
4846 CPU = Name;
4847 return true;
4848 }
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00004849 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christopher0b26a612010-03-02 02:41:08 +00004850 Features[ABI] = true;
4851 Features[CPU] = true;
4852 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004853
Simon Atanasyan16ee0052012-08-29 19:59:32 +00004854 virtual void getTargetDefines(const LangOptions &Opts,
4855 MacroBuilder &Builder) const {
Simon Atanasyan683535b2012-08-29 19:14:58 +00004856 DefineStd(Builder, "mips", Opts);
4857 Builder.defineMacro("_mips");
4858 Builder.defineMacro("__REGISTER_PREFIX__", "");
4859
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004860 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004861 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004862 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004863 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004864 case SoftFloat:
4865 Builder.defineMacro("__mips_soft_float", Twine(1));
4866 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004867 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00004868
Simon Atanasyan16071912013-04-14 14:07:30 +00004869 if (IsSingleFloat)
4870 Builder.defineMacro("__mips_single_float", Twine(1));
4871
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004872 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
4873 Builder.defineMacro("_MIPS_FPSET",
4874 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
4875
Simon Atanasyan72244b62012-07-05 16:06:06 +00004876 if (IsMips16)
4877 Builder.defineMacro("__mips16", Twine(1));
4878
Simon Atanasyan60777612013-04-14 14:07:51 +00004879 if (IsMicromips)
4880 Builder.defineMacro("__mips_micromips", Twine(1));
4881
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004882 if (IsNan2008)
4883 Builder.defineMacro("__mips_nan2008", Twine(1));
4884
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004885 switch (DspRev) {
4886 default:
4887 break;
4888 case DSP1:
4889 Builder.defineMacro("__mips_dsp_rev", Twine(1));
4890 Builder.defineMacro("__mips_dsp", Twine(1));
4891 break;
4892 case DSP2:
4893 Builder.defineMacro("__mips_dsp_rev", Twine(2));
4894 Builder.defineMacro("__mips_dspr2", Twine(1));
4895 Builder.defineMacro("__mips_dsp", Twine(1));
4896 break;
4897 }
4898
Jack Carter44ff1e52013-08-12 17:20:29 +00004899 if (HasMSA)
4900 Builder.defineMacro("__mips_msa", Twine(1));
4901
Simon Atanasyan26f19672012-04-05 19:28:31 +00004902 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
4903 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
4904 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00004905
4906 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
4907 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004908 }
4909
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004910 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4911 unsigned &NumRecords) const {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004912 Records = BuiltinInfo;
4913 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004914 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004915 virtual bool hasFeature(StringRef Feature) const {
Akira Hatanaka618b2982013-10-29 19:00:35 +00004916 return llvm::StringSwitch<bool>(Feature)
4917 .Case("mips", true)
4918 .Case("fp64", HasFP64)
4919 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004920 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004921 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4922 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004923 }
4924 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004925 unsigned &NumNames) const {
Daniel Sanders8b59af12013-11-12 12:56:01 +00004926 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00004927 // CPU register names
4928 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004929 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
4930 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
4931 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00004932 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
4933 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004934 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
4935 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
4936 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
4937 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00004938 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004939 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00004940 "$fcc5","$fcc6","$fcc7",
4941 // MSA register names
4942 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
4943 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
4944 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
4945 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
4946 // MSA control register names
4947 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
4948 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004949 };
4950 Names = GCCRegNames;
4951 NumNames = llvm::array_lengthof(GCCRegNames);
4952 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004953 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004954 unsigned &NumAliases) const = 0;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004955 virtual bool validateAsmConstraint(const char *&Name,
4956 TargetInfo::ConstraintInfo &Info) const {
4957 switch (*Name) {
4958 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00004959 return false;
4960
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004961 case 'r': // CPU registers.
4962 case 'd': // Equivalent to "r" unless generating MIPS16 code.
4963 case 'y': // Equivalent to "r", backwards compatibility only.
4964 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00004965 case 'c': // $25 for indirect jumps
4966 case 'l': // lo register
4967 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004968 Info.setAllowsRegister();
4969 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00004970 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00004971 Info.setAllowsMemory();
4972 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004973 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004974 }
4975
4976 virtual const char *getClobbers() const {
4977 // FIXME: Implement!
4978 return "";
4979 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004980
Eric Christopher3ff21b32013-10-16 21:26:26 +00004981 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00004982 DiagnosticsEngine &Diags) {
Simon Atanasyan72244b62012-07-05 16:06:06 +00004983 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00004984 IsMicromips = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004985 IsNan2008 = false;
Simon Atanasyan16071912013-04-14 14:07:30 +00004986 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004987 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004988 DspRev = NoDSP;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004989 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004990
4991 for (std::vector<std::string>::iterator it = Features.begin(),
4992 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004993 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00004994 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004995 else if (*it == "+soft-float")
4996 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00004997 else if (*it == "+mips16")
4998 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00004999 else if (*it == "+micromips")
5000 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005001 else if (*it == "+dsp")
5002 DspRev = std::max(DspRev, DSP1);
5003 else if (*it == "+dspr2")
5004 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005005 else if (*it == "+msa")
5006 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005007 else if (*it == "+fp64")
5008 HasFP64 = true;
5009 else if (*it == "-fp64")
5010 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005011 else if (*it == "+nan2008")
5012 IsNan2008 = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005013 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005014
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005015 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005016 std::vector<std::string>::iterator it =
5017 std::find(Features.begin(), Features.end(), "+soft-float");
5018 if (it != Features.end())
5019 Features.erase(it);
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005020 it = std::find(Features.begin(), Features.end(), "+nan2008");
5021 if (it != Features.end())
5022 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005023
Akira Hatanaka9064e362013-10-29 18:30:33 +00005024 setDescriptionString();
5025
Rafael Espindolaeb265472013-08-21 21:59:03 +00005026 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005027 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005028
5029 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
5030 if (RegNo == 0) return 4;
5031 if (RegNo == 1) return 5;
5032 return -1;
5033 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005034};
5035
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005036const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5037#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5038#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5039 ALL_LANGUAGES },
5040#include "clang/Basic/BuiltinsMips.def"
5041};
5042
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005043class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005044public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005045 Mips32TargetInfoBase(const llvm::Triple &Triple)
5046 : MipsTargetInfoBase(Triple, "o32", "mips32") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005047 SizeType = UnsignedInt;
5048 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005049 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005050 }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005051 virtual bool setABI(const std::string &Name) {
5052 if ((Name == "o32") || (Name == "eabi")) {
5053 ABI = Name;
5054 return true;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005055 } else if (Name == "32") {
5056 ABI = "o32";
5057 return true;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005058 } else
5059 return false;
5060 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005061 virtual void getTargetDefines(const LangOptions &Opts,
5062 MacroBuilder &Builder) const {
5063 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005064
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005065 if (ABI == "o32") {
5066 Builder.defineMacro("__mips_o32");
5067 Builder.defineMacro("_ABIO32", "1");
5068 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5069 }
5070 else if (ABI == "eabi")
5071 Builder.defineMacro("__mips_eabi");
5072 else
David Blaikie83d382b2011-09-23 05:06:16 +00005073 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005074 }
5075 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5076 unsigned &NumAliases) const {
5077 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5078 { { "at" }, "$1" },
5079 { { "v0" }, "$2" },
5080 { { "v1" }, "$3" },
5081 { { "a0" }, "$4" },
5082 { { "a1" }, "$5" },
5083 { { "a2" }, "$6" },
5084 { { "a3" }, "$7" },
5085 { { "t0" }, "$8" },
5086 { { "t1" }, "$9" },
5087 { { "t2" }, "$10" },
5088 { { "t3" }, "$11" },
5089 { { "t4" }, "$12" },
5090 { { "t5" }, "$13" },
5091 { { "t6" }, "$14" },
5092 { { "t7" }, "$15" },
5093 { { "s0" }, "$16" },
5094 { { "s1" }, "$17" },
5095 { { "s2" }, "$18" },
5096 { { "s3" }, "$19" },
5097 { { "s4" }, "$20" },
5098 { { "s5" }, "$21" },
5099 { { "s6" }, "$22" },
5100 { { "s7" }, "$23" },
5101 { { "t8" }, "$24" },
5102 { { "t9" }, "$25" },
5103 { { "k0" }, "$26" },
5104 { { "k1" }, "$27" },
5105 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005106 { { "sp","$sp" }, "$29" },
5107 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005108 { { "ra" }, "$31" }
5109 };
5110 Aliases = GCCRegAliases;
5111 NumAliases = llvm::array_lengthof(GCCRegAliases);
5112 }
5113};
5114
5115class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005116 virtual void setDescriptionString() {
Rafael Espindola2da35322013-12-16 23:27:41 +00005117 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-"
5118 "i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005119 }
5120
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005121public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005122 Mips32EBTargetInfo(const llvm::Triple &Triple)
5123 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005124 }
5125 virtual void getTargetDefines(const LangOptions &Opts,
5126 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005127 DefineStd(Builder, "MIPSEB", Opts);
5128 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005129 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005130 }
5131};
5132
5133class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005134 virtual void setDescriptionString() {
Rafael Espindola2da35322013-12-16 23:27:41 +00005135 DescriptionString = "e-p:32:32-i8:8:32-i16:16:32-"
5136 "i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005137 }
5138
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005139public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005140 Mips32ELTargetInfo(const llvm::Triple &Triple)
5141 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005142 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005143 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005144 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005145 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005146 DefineStd(Builder, "MIPSEL", Opts);
5147 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005148 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005149 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005150};
Akira Hatanakabef17452011-09-20 19:21:49 +00005151
5152class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005153public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005154 Mips64TargetInfoBase(const llvm::Triple &Triple)
5155 : MipsTargetInfoBase(Triple, "n64", "mips64") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005156 LongWidth = LongAlign = 64;
5157 PointerWidth = PointerAlign = 64;
5158 LongDoubleWidth = LongDoubleAlign = 128;
5159 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005160 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5161 LongDoubleWidth = LongDoubleAlign = 64;
5162 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5163 }
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005164 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005165 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005166 }
Akira Hatanakabef17452011-09-20 19:21:49 +00005167 virtual bool setABI(const std::string &Name) {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005168 if (Name == "n32") {
5169 LongWidth = LongAlign = 32;
5170 PointerWidth = PointerAlign = 32;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005171 ABI = Name;
5172 return true;
5173 } else if (Name == "n64") {
5174 ABI = Name;
5175 return true;
5176 } else if (Name == "64") {
5177 ABI = "n64";
5178 return true;
5179 } else
5180 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005181 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005182 virtual void getTargetDefines(const LangOptions &Opts,
5183 MacroBuilder &Builder) const {
5184 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005185
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005186 Builder.defineMacro("__mips64");
5187 Builder.defineMacro("__mips64__");
5188
Akira Hatanakabef17452011-09-20 19:21:49 +00005189 if (ABI == "n32") {
5190 Builder.defineMacro("__mips_n32");
5191 Builder.defineMacro("_ABIN32", "2");
5192 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5193 }
5194 else if (ABI == "n64") {
5195 Builder.defineMacro("__mips_n64");
5196 Builder.defineMacro("_ABI64", "3");
5197 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5198 }
5199 else
David Blaikie83d382b2011-09-23 05:06:16 +00005200 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005201 }
5202 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5203 unsigned &NumAliases) const {
5204 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5205 { { "at" }, "$1" },
5206 { { "v0" }, "$2" },
5207 { { "v1" }, "$3" },
5208 { { "a0" }, "$4" },
5209 { { "a1" }, "$5" },
5210 { { "a2" }, "$6" },
5211 { { "a3" }, "$7" },
5212 { { "a4" }, "$8" },
5213 { { "a5" }, "$9" },
5214 { { "a6" }, "$10" },
5215 { { "a7" }, "$11" },
5216 { { "t0" }, "$12" },
5217 { { "t1" }, "$13" },
5218 { { "t2" }, "$14" },
5219 { { "t3" }, "$15" },
5220 { { "s0" }, "$16" },
5221 { { "s1" }, "$17" },
5222 { { "s2" }, "$18" },
5223 { { "s3" }, "$19" },
5224 { { "s4" }, "$20" },
5225 { { "s5" }, "$21" },
5226 { { "s6" }, "$22" },
5227 { { "s7" }, "$23" },
5228 { { "t8" }, "$24" },
5229 { { "t9" }, "$25" },
5230 { { "k0" }, "$26" },
5231 { { "k1" }, "$27" },
5232 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005233 { { "sp","$sp" }, "$29" },
5234 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005235 { { "ra" }, "$31" }
5236 };
5237 Aliases = GCCRegAliases;
5238 NumAliases = llvm::array_lengthof(GCCRegAliases);
5239 }
5240};
5241
5242class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005243 virtual void setDescriptionString() {
5244 if (ABI == "n32")
Rafael Espindola2da35322013-12-16 23:27:41 +00005245 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-"
5246 "i64:64-f128:128-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005247 "n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005248 else
Rafael Espindola47debc02013-12-16 21:59:14 +00005249 DescriptionString = "E-i8:8:32-i16:16:32-"
Rafael Espindola2da35322013-12-16 23:27:41 +00005250 "i64:64-f128:128-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005251 "n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005252
Akira Hatanakabef17452011-09-20 19:21:49 +00005253 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005254
Akira Hatanakabef17452011-09-20 19:21:49 +00005255public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005256 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005257 : Mips64TargetInfoBase(Triple) {}
Akira Hatanakabef17452011-09-20 19:21:49 +00005258 virtual void getTargetDefines(const LangOptions &Opts,
5259 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00005260 DefineStd(Builder, "MIPSEB", Opts);
5261 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005262 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005263 }
5264};
5265
5266class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005267 virtual void setDescriptionString() {
5268 if (ABI == "n32")
Rafael Espindola2da35322013-12-16 23:27:41 +00005269 DescriptionString = "e-p:32:32-i8:8:32-i16:16:32-"
5270 "i64:64-f128:128"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005271 "-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005272 else
Rafael Espindola47debc02013-12-16 21:59:14 +00005273 DescriptionString = "e-i8:8:32-i16:16:32-"
Rafael Espindola2da35322013-12-16 23:27:41 +00005274 "i64:64-f128:128-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005275 "n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005276 }
5277public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005278 Mips64ELTargetInfo(const llvm::Triple &Triple)
5279 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005280 // Default ABI is n64.
5281 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005282 }
5283 virtual void getTargetDefines(const LangOptions &Opts,
5284 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00005285 DefineStd(Builder, "MIPSEL", Opts);
5286 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005287 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005288 }
5289};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005290} // end anonymous namespace.
5291
Ivan Krasindd7403e2011-08-24 20:22:22 +00005292namespace {
5293class PNaClTargetInfo : public TargetInfo {
5294public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005295 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005296 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005297 this->UserLabelPrefix = "";
5298 this->LongAlign = 32;
5299 this->LongWidth = 32;
5300 this->PointerAlign = 32;
5301 this->PointerWidth = 32;
5302 this->IntMaxType = TargetInfo::SignedLongLong;
5303 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5304 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005305 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005306 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005307 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005308 this->SizeType = TargetInfo::UnsignedInt;
5309 this->PtrDiffType = TargetInfo::SignedInt;
5310 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005311 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005312 }
5313
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005314 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005315 }
5316 virtual void getArchDefines(const LangOptions &Opts,
5317 MacroBuilder &Builder) const {
5318 Builder.defineMacro("__le32__");
5319 Builder.defineMacro("__pnacl__");
5320 }
5321 virtual void getTargetDefines(const LangOptions &Opts,
5322 MacroBuilder &Builder) const {
Jan Wen Voung1d4c2d92012-03-29 00:05:59 +00005323 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasindd7403e2011-08-24 20:22:22 +00005324 getArchDefines(Opts, Builder);
5325 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005326 virtual bool hasFeature(StringRef Feature) const {
5327 return Feature == "pnacl";
5328 }
Ivan Krasindd7403e2011-08-24 20:22:22 +00005329 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5330 unsigned &NumRecords) const {
5331 }
Meador Inge5d3fb222012-06-16 03:34:49 +00005332 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5333 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005334 }
5335 virtual void getGCCRegNames(const char * const *&Names,
5336 unsigned &NumNames) const;
5337 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5338 unsigned &NumAliases) const;
5339 virtual bool validateAsmConstraint(const char *&Name,
5340 TargetInfo::ConstraintInfo &Info) const {
5341 return false;
5342 }
5343
5344 virtual const char *getClobbers() const {
5345 return "";
5346 }
5347};
5348
5349void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5350 unsigned &NumNames) const {
5351 Names = NULL;
5352 NumNames = 0;
5353}
5354
5355void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5356 unsigned &NumAliases) const {
5357 Aliases = NULL;
5358 NumAliases = 0;
5359}
5360} // end anonymous namespace.
5361
Guy Benyeib798fc92012-12-11 21:38:14 +00005362namespace {
5363 static const unsigned SPIRAddrSpaceMap[] = {
5364 1, // opencl_global
5365 3, // opencl_local
5366 2, // opencl_constant
5367 0, // cuda_device
5368 0, // cuda_constant
5369 0 // cuda_shared
5370 };
5371 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00005372 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005373 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005374 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5375 "SPIR target must use unknown OS");
5376 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5377 "SPIR target must use unknown environment type");
5378 BigEndian = false;
5379 TLSSupported = false;
5380 LongWidth = LongAlign = 64;
5381 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005382 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00005383 // Define available target features
5384 // These must be defined in sorted order!
5385 NoAsmVariants = true;
5386 }
5387 virtual void getTargetDefines(const LangOptions &Opts,
5388 MacroBuilder &Builder) const {
5389 DefineStd(Builder, "SPIR", Opts);
5390 }
5391 virtual bool hasFeature(StringRef Feature) const {
5392 return Feature == "spir";
5393 }
5394
5395 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5396 unsigned &NumRecords) const {}
5397 virtual const char *getClobbers() const {
5398 return "";
5399 }
5400 virtual void getGCCRegNames(const char * const *&Names,
5401 unsigned &NumNames) const {}
5402 virtual bool validateAsmConstraint(const char *&Name,
5403 TargetInfo::ConstraintInfo &info) const {
5404 return true;
5405 }
5406 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5407 unsigned &NumAliases) const {}
5408 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5409 return TargetInfo::VoidPtrBuiltinVaList;
5410 }
5411 };
5412
5413
5414 class SPIR32TargetInfo : public SPIRTargetInfo {
5415 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005416 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005417 PointerWidth = PointerAlign = 32;
5418 SizeType = TargetInfo::UnsignedInt;
5419 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5420 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00005421 = "e-p:32:32-i64:64"
5422 "-v16:16-v24:32-v32:32-v48:64-"
5423 "v96:128-v192:256-v256:256-"
5424 "v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005425 }
5426 virtual void getTargetDefines(const LangOptions &Opts,
5427 MacroBuilder &Builder) const {
5428 DefineStd(Builder, "SPIR32", Opts);
5429 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005430 };
5431
5432 class SPIR64TargetInfo : public SPIRTargetInfo {
5433 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005434 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005435 PointerWidth = PointerAlign = 64;
5436 SizeType = TargetInfo::UnsignedLong;
5437 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
5438 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00005439 = "e-i64:64"
5440 "-v16:16-v24:32-v32:32-v48:64-"
5441 "v96:128-v192:256-v256:256-"
5442 "v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005443 }
5444 virtual void getTargetDefines(const LangOptions &Opts,
5445 MacroBuilder &Builder) const {
5446 DefineStd(Builder, "SPIR64", Opts);
5447 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005448 };
5449}
5450
Robert Lytton0e076492013-08-13 09:43:10 +00005451namespace {
5452class XCoreTargetInfo : public TargetInfo {
5453 static const Builtin::Info BuiltinInfo[];
5454public:
5455 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5456 BigEndian = false;
5457 NoAsmVariants = true;
5458 LongLongAlign = 32;
5459 SuitableAlign = 32;
5460 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00005461 SizeType = UnsignedInt;
5462 PtrDiffType = SignedInt;
5463 IntPtrType = SignedInt;
5464 WCharType = UnsignedChar;
5465 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00005466 UseZeroLengthBitfieldAlignment = true;
Rafael Espindola2da35322013-12-16 23:27:41 +00005467 DescriptionString = "e-p:32:32-a:0:32-n32"
5468 "-i1:8:32-i8:8:32-i16:16:32-i64:32"
5469 "-f16:16:32-f64:32";
Robert Lytton0e076492013-08-13 09:43:10 +00005470 }
5471 virtual void getTargetDefines(const LangOptions &Opts,
5472 MacroBuilder &Builder) const {
5473 Builder.defineMacro("__XS1B__");
5474 }
5475 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5476 unsigned &NumRecords) const {
5477 Records = BuiltinInfo;
5478 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5479 }
5480 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5481 return TargetInfo::VoidPtrBuiltinVaList;
5482 }
5483 virtual const char *getClobbers() const {
5484 return "";
5485 }
5486 virtual void getGCCRegNames(const char * const *&Names,
5487 unsigned &NumNames) const {
5488 static const char * const GCCRegNames[] = {
5489 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5490 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
5491 };
5492 Names = GCCRegNames;
5493 NumNames = llvm::array_lengthof(GCCRegNames);
5494 }
5495 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5496 unsigned &NumAliases) const {
5497 Aliases = NULL;
5498 NumAliases = 0;
5499 }
5500 virtual bool validateAsmConstraint(const char *&Name,
5501 TargetInfo::ConstraintInfo &Info) const {
5502 return false;
5503 }
5504};
5505
5506const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
5507#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5508#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5509 ALL_LANGUAGES },
5510#include "clang/Basic/BuiltinsXCore.def"
5511};
5512} // end anonymous namespace.
5513
Ivan Krasindd7403e2011-08-24 20:22:22 +00005514
Chris Lattner5ba61f02006-10-14 07:39:34 +00005515//===----------------------------------------------------------------------===//
5516// Driver code
5517//===----------------------------------------------------------------------===//
5518
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005519static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00005520 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00005521
Daniel Dunbar52322032009-08-18 05:47:58 +00005522 switch (Triple.getArch()) {
5523 default:
5524 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00005525
Robert Lytton0e076492013-08-13 09:43:10 +00005526 case llvm::Triple::xcore:
5527 return new XCoreTargetInfo(Triple);
5528
Tony Linthicum76329bf2011-12-12 21:14:55 +00005529 case llvm::Triple::hexagon:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005530 return new HexagonTargetInfo(Triple);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005531
Tim Northover9bb857a2013-01-31 12:13:10 +00005532 case llvm::Triple::aarch64:
5533 switch (os) {
5534 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005535 return new LinuxTargetInfo<AArch64TargetInfo>(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005536 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005537 return new AArch64TargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005538 }
5539
Daniel Dunbar52322032009-08-18 05:47:58 +00005540 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00005541 case llvm::Triple::thumb:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005542 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005543 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005544
Daniel Dunbar52322032009-08-18 05:47:58 +00005545 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00005546 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005547 return new LinuxTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005548 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005549 return new FreeBSDTargetInfo<ARMTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005550 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005551 return new NetBSDTargetInfo<ARMTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005552 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005553 return new OpenBSDTargetInfo<ARMTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005554 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005555 return new BitrigTargetInfo<ARMTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005556 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005557 return new RTEMSTargetInfo<ARMTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005558 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005559 return new NaClTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005560 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005561 return new ARMTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005562 }
Eli Friedmanb5366062008-05-20 14:21:01 +00005563
Daniel Dunbar52322032009-08-18 05:47:58 +00005564 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005565 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00005566
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005567 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005568 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005569 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005570 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005571 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005572 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005573 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005574 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005575 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005576 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005577 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005578 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005579 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005580
5581 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005582 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005583 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005584 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005585 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005586 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005587 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005588 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005589 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005590 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00005591 case llvm::Triple::NaCl:
5592 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005593 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005594 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005595 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005596
Akira Hatanakabef17452011-09-20 19:21:49 +00005597 case llvm::Triple::mips64:
5598 switch (os) {
5599 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005600 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005601 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005602 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005603 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005604 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005605 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005606 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005607 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005608 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005609 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005610 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005611 }
5612
5613 case llvm::Triple::mips64el:
5614 switch (os) {
5615 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005616 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005617 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005618 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005619 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005620 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005621 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005622 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005623 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005624 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005625 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005626 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005627 }
5628
Ivan Krasindd7403e2011-08-24 20:22:22 +00005629 case llvm::Triple::le32:
5630 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00005631 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005632 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00005633 default:
5634 return NULL;
5635 }
5636
Daniel Dunbar52322032009-08-18 05:47:58 +00005637 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005638 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005639 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005640 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005641 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005642 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005643 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005644 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005645 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005646 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005647 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005648 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005649 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005650 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005651 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005652 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005653 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005654
5655 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005656 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005657 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005658 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005659 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005660 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005661 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005662 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005663 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005664 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005665 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005666 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005667 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005668 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005669 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005670
Bill Schmidt778d3872013-07-26 01:36:11 +00005671 case llvm::Triple::ppc64le:
5672 switch (os) {
5673 case llvm::Triple::Linux:
5674 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
5675 default:
5676 return new PPC64TargetInfo(Triple);
5677 }
5678
Peter Collingbournec947aae2012-05-20 23:28:41 +00005679 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005680 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005681 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005682 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005683
Eli Friedmand13b41e2012-10-12 23:32:00 +00005684 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005685 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00005686
Daniel Dunbar52322032009-08-18 05:47:58 +00005687 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005688 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005689 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005690 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005691 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005692 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005693 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005694 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005695 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005696 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005697 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005698 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005699 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005700 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005701 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005702 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005703 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005704
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005705 case llvm::Triple::sparcv9:
5706 switch (os) {
5707 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005708 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005709 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005710 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005711 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005712 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005713 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005714 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005715 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005716 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005717 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005718 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005719 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005720 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005721 }
5722
Ulrich Weigand47445072013-05-06 16:26:41 +00005723 case llvm::Triple::systemz:
5724 switch (os) {
5725 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005726 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005727 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005728 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005729 }
5730
Eli Friedmana9c3d712009-08-19 20:47:07 +00005731 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005732 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00005733
Daniel Dunbar52322032009-08-18 05:47:58 +00005734 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005735 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005736 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005737
Daniel Dunbar52322032009-08-18 05:47:58 +00005738 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005739 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005740 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005741 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005742 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005743 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005744 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005745 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005746 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005747 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005748 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005749 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005750 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005751 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005752 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005753 case llvm::Triple::KFreeBSD:
5754 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005755 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005756 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005757 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005758 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005759 case llvm::Triple::Cygwin:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005760 return new CygwinX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005761 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005762 return new MinGWX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005763 case llvm::Triple::Win32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005764 return new VisualStudioWindowsX86_32TargetInfo(Triple);
Chris Lattnerb986aba2010-04-11 19:29:39 +00005765 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005766 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005767 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005768 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005769 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005770 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005771 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005772 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005773 }
5774
5775 case llvm::Triple::x86_64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005776 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005777 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005778
Daniel Dunbar52322032009-08-18 05:47:58 +00005779 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005780 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005781 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005782 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005783 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00005784 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005785 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005786 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005787 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005788 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005789 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005790 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005791 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005792 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005793 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005794 case llvm::Triple::KFreeBSD:
5795 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005796 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005797 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00005798 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005799 return new MinGWX86_64TargetInfo(Triple);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00005800 case llvm::Triple::Win32: // This is what Triple.h supports now.
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005801 return new VisualStudioWindowsX86_64TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005802 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005803 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005804 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005805 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005806 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005807
5808 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005809 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005810 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005811 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005812 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005813 }
5814 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005815 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005816 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005817 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005818 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005819 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005820 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00005821}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005822
5823/// CreateTargetInfo - Return the target info object for the specified target
5824/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00005825TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregorf8715de2012-11-16 04:24:59 +00005826 TargetOptions *Opts) {
5827 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005828
5829 // Construct the target
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005830 OwningPtr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005831 if (!Target) {
5832 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5833 return 0;
5834 }
Douglas Gregorbc10b9f2012-10-15 16:45:32 +00005835 Target->setTargetOpts(Opts);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005836
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005837 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005838 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5839 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005840 return 0;
5841 }
5842
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005843 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005844 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5845 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005846 return 0;
5847 }
5848
Charles Davis95a546e2010-06-11 01:06:47 +00005849 // Set the target C++ ABI.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005850 if (!Opts->CXXABI.empty() && !Target->setCXXABI(Opts->CXXABI)) {
5851 Diags.Report(diag::err_target_unknown_cxxabi) << Opts->CXXABI;
Charles Davis95a546e2010-06-11 01:06:47 +00005852 return 0;
5853 }
5854
Rafael Espindolaeb265472013-08-21 21:59:03 +00005855 // Set the fp math unit.
5856 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
5857 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
5858 return 0;
5859 }
5860
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005861 // Compute the default target features, we need the target to handle this
5862 // because features may have dependencies on one another.
5863 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005864 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005865
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005866 // Apply the user specified deltas.
5867 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
5868 I < N; ++I) {
5869 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00005870 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005871 bool Enabled = Name[0] == '+';
5872 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005873 }
5874
5875 // Add the features to the compile options.
5876 //
5877 // FIXME: If we are completely confident that we have the right set, we only
5878 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005879 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005880 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5881 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00005882 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00005883 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Rafael Espindolaeb265472013-08-21 21:59:03 +00005884 return 0;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005885
5886 return Target.take();
5887}