blob: 41c527c55646e2cd6a55326408efd882effd0138 [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 Espindola8ddf8bc2013-12-17 00:04:48 +00003227 DescriptionString = "e-i64:64-f80:128-s:64-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003228
3229 // Use fpret only for long double.
3230 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003231
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003232 // Use fp2ret for _Complex long double.
3233 ComplexLongDoubleUsesFP2Ret = true;
3234
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003235 // x86-64 has atomics up to 16 bytes.
3236 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3237 // on CPUs with cmpxchg16b
3238 MaxAtomicPromoteWidth = 128;
3239 MaxAtomicInlineWidth = 64;
Chris Lattner10a5b382007-01-29 05:24:35 +00003240 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003241 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3242 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003243 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003244
Chris Lattnerd545ad12009-09-23 06:06:36 +00003245 int getEHDataRegisterNumber(unsigned RegNo) const {
3246 if (RegNo == 0) return 0;
3247 if (RegNo == 1) return 1;
3248 return -1;
3249 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003250
3251 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
Charles Davisb5a214e2013-08-30 04:39:01 +00003252 return (CC == CC_C ||
3253 CC == CC_IntelOclBicc ||
3254 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003255 }
3256
Aaron Ballman02df2e02012-12-09 17:45:41 +00003257 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
3258 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003259 }
3260
Eli Friedman3fd920a2008-08-20 02:34:37 +00003261};
3262} // end anonymous namespace
3263
3264namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003265// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003266class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003267public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003268 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3269 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003270 TLSSupported = false;
3271 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003272 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003273 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003274 IntMaxType = SignedLongLong;
3275 UIntMaxType = UnsignedLongLong;
3276 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003277 SizeType = UnsignedLongLong;
3278 PtrDiffType = SignedLongLong;
3279 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003280 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003281 }
3282 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003283 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003284 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003285 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003286 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003287 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3288 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003289 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003290 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3291 return (CC == CC_C ||
3292 CC == CC_IntelOclBicc ||
3293 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3294 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003295};
3296} // end anonymous namespace
3297
3298namespace {
3299// x86-64 Windows Visual Studio target
3300class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
3301public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003302 VisualStudioWindowsX86_64TargetInfo(const llvm::Triple &Triple)
3303 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003304 LongDoubleWidth = LongDoubleAlign = 64;
3305 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003306 }
3307 virtual void getTargetDefines(const LangOptions &Opts,
3308 MacroBuilder &Builder) const {
3309 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3310 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003311 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003312 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003313 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003314};
3315} // end anonymous namespace
3316
3317namespace {
3318// x86-64 MinGW target
3319class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3320public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003321 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3322 : WindowsX86_64TargetInfo(Triple) {}
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003323 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003324 MacroBuilder &Builder) const {
3325 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003326 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003327 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00003328 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003329 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003330
3331 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3332 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003333 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003334 // Provide "as-is" __declspec.
3335 Builder.defineMacro("__declspec", "__declspec");
3336 else
3337 // Provide alias of __attribute__ like mingw32-gcc.
3338 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003339 }
3340};
3341} // end anonymous namespace
3342
3343namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003344class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3345public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003346 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3347 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003348 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003349 MaxVectorAlign = 256;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003350 }
3351};
3352} // end anonymous namespace
3353
3354namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003355class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3356public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003357 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3358 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003359 IntMaxType = SignedLongLong;
3360 UIntMaxType = UnsignedLongLong;
3361 Int64Type = SignedLongLong;
3362 }
3363};
3364} // end anonymous namespace
3365
3366namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003367class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3368public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003369 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3370 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3371 IntMaxType = SignedLongLong;
3372 UIntMaxType = UnsignedLongLong;
3373 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003374 }
3375};
Tim Northover9bb857a2013-01-31 12:13:10 +00003376}
3377
3378namespace {
3379class AArch64TargetInfo : public TargetInfo {
3380 static const char * const GCCRegNames[];
3381 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003382
Tim Northover2fe823a2013-08-01 09:23:19 +00003383 enum FPUModeEnum {
3384 FPUMode,
3385 NeonMode
3386 };
3387
3388 unsigned FPU;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003389 unsigned Crypto;
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003390 static const Builtin::Info BuiltinInfo[];
Tim Northover2fe823a2013-08-01 09:23:19 +00003391
Tim Northover9bb857a2013-01-31 12:13:10 +00003392public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003393 AArch64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Tim Northover9bb857a2013-01-31 12:13:10 +00003394 BigEndian = false;
3395 LongWidth = LongAlign = 64;
3396 LongDoubleWidth = LongDoubleAlign = 128;
3397 PointerWidth = PointerAlign = 64;
3398 SuitableAlign = 128;
Rafael Espindola91b0cbf2013-12-16 23:03:23 +00003399 DescriptionString = "e-"
Rafael Espindola2da35322013-12-16 23:27:41 +00003400 "i64:64-i128:128-"
3401 "f128:128-n32:64-S128";
Tim Northover9bb857a2013-01-31 12:13:10 +00003402
3403 WCharType = UnsignedInt;
3404 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3405
Tim Northover847d2d42013-02-18 12:11:32 +00003406 // AArch64 backend supports 64-bit operations at the moment. In principle
3407 // 128-bit is possible if register-pairs are used.
3408 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3409
Tim Northover9bb857a2013-01-31 12:13:10 +00003410 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3411 }
3412 virtual void getTargetDefines(const LangOptions &Opts,
3413 MacroBuilder &Builder) const {
3414 // GCC defines theses currently
3415 Builder.defineMacro("__aarch64__");
3416 Builder.defineMacro("__AARCH64EL__");
3417
3418 // ACLE predefines. Many can only have one possible value on v8 AArch64.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003419 Builder.defineMacro("__ARM_ACLE", "200");
Tim Northoverb85654d2013-04-05 14:08:55 +00003420 Builder.defineMacro("__ARM_ARCH", "8");
3421 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
Tim Northover9bb857a2013-01-31 12:13:10 +00003422
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003423 Builder.defineMacro("__ARM_64BIT_STATE");
3424 Builder.defineMacro("__ARM_PCS_AAPCS64");
3425 Builder.defineMacro("__ARM_ARCH_ISA_A64");
3426
Tim Northoverb85654d2013-04-05 14:08:55 +00003427 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
3428 Builder.defineMacro("__ARM_FEATURE_CLZ");
3429 Builder.defineMacro("__ARM_FEATURE_FMA");
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003430 Builder.defineMacro("__ARM_FEATURE_DIV");
Tim Northover9bb857a2013-01-31 12:13:10 +00003431
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003432 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
Tim Northover9bb857a2013-01-31 12:13:10 +00003433
3434 // 0xe implies support for half, single and double precision operations.
Tim Northoverb85654d2013-04-05 14:08:55 +00003435 Builder.defineMacro("__ARM_FP", "0xe");
Tim Northover9bb857a2013-01-31 12:13:10 +00003436
3437 // PCS specifies this for SysV variants, which is all we support. Other ABIs
Tim Northoverb85654d2013-04-05 14:08:55 +00003438 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
3439 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
Tim Northover9bb857a2013-01-31 12:13:10 +00003440
3441 if (Opts.FastMath || Opts.FiniteMathOnly)
Tim Northoverb85654d2013-04-05 14:08:55 +00003442 Builder.defineMacro("__ARM_FP_FAST");
Tim Northover9bb857a2013-01-31 12:13:10 +00003443
3444 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
Tim Northoverb85654d2013-04-05 14:08:55 +00003445 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
Tim Northover9bb857a2013-01-31 12:13:10 +00003446
Tim Northoverb85654d2013-04-05 14:08:55 +00003447 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
Tim Northover9bb857a2013-01-31 12:13:10 +00003448 Opts.ShortWChar ? "2" : "4");
3449
Tim Northoverb85654d2013-04-05 14:08:55 +00003450 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
Tim Northover9bb857a2013-01-31 12:13:10 +00003451 Opts.ShortEnums ? "1" : "4");
3452
3453 if (BigEndian)
Tim Northover2fe823a2013-08-01 09:23:19 +00003454 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3455
3456 if (FPU == NeonMode) {
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003457 Builder.defineMacro("__ARM_NEON");
Tim Northover2fe823a2013-08-01 09:23:19 +00003458 // 64-bit NEON supports half, single and double precision operations.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003459 Builder.defineMacro("__ARM_NEON_FP", "7");
3460 }
3461
3462 if (Crypto) {
3463 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northover2fe823a2013-08-01 09:23:19 +00003464 }
Tim Northover9bb857a2013-01-31 12:13:10 +00003465 }
3466 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3467 unsigned &NumRecords) const {
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003468 Records = BuiltinInfo;
3469 NumRecords = clang::AArch64::LastTSBuiltin-Builtin::FirstTSBuiltin;
Tim Northover9bb857a2013-01-31 12:13:10 +00003470 }
3471 virtual bool hasFeature(StringRef Feature) const {
Tim Northover2fe823a2013-08-01 09:23:19 +00003472 return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode);
Tim Northover9bb857a2013-01-31 12:13:10 +00003473 }
Tim Northover2fe823a2013-08-01 09:23:19 +00003474
Amara Emerson703da2e2013-10-31 09:32:33 +00003475 virtual bool setCPU(const std::string &Name) {
3476 return llvm::StringSwitch<bool>(Name)
3477 .Case("generic", true)
3478 .Cases("cortex-a53", "cortex-a57", true)
3479 .Default(false);
3480 }
3481
Eric Christopher3ff21b32013-10-16 21:26:26 +00003482 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003483 DiagnosticsEngine &Diags) {
Tim Northover2fe823a2013-08-01 09:23:19 +00003484 FPU = FPUMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003485 Crypto = 0;
Tim Northover2fe823a2013-08-01 09:23:19 +00003486 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3487 if (Features[i] == "+neon")
3488 FPU = NeonMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003489 if (Features[i] == "+crypto")
3490 Crypto = 1;
Tim Northover2fe823a2013-08-01 09:23:19 +00003491 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00003492 return true;
Tim Northover2fe823a2013-08-01 09:23:19 +00003493 }
3494
3495 virtual void getGCCRegNames(const char *const *&Names,
Tim Northover9bb857a2013-01-31 12:13:10 +00003496 unsigned &NumNames) const;
3497 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3498 unsigned &NumAliases) const;
3499
3500 virtual bool isCLZForZeroUndef() const { return false; }
3501
3502 virtual bool validateAsmConstraint(const char *&Name,
3503 TargetInfo::ConstraintInfo &Info) const {
3504 switch (*Name) {
3505 default: return false;
3506 case 'w': // An FP/SIMD vector register
3507 Info.setAllowsRegister();
3508 return true;
3509 case 'I': // Constant that can be used with an ADD instruction
3510 case 'J': // Constant that can be used with a SUB instruction
3511 case 'K': // Constant that can be used with a 32-bit logical instruction
3512 case 'L': // Constant that can be used with a 64-bit logical instruction
3513 case 'M': // Constant that can be used as a 32-bit MOV immediate
3514 case 'N': // Constant that can be used as a 64-bit MOV immediate
3515 case 'Y': // Floating point constant zero
3516 case 'Z': // Integer constant zero
3517 return true;
3518 case 'Q': // A memory reference with base register and no offset
3519 Info.setAllowsMemory();
3520 return true;
3521 case 'S': // A symbolic address
3522 Info.setAllowsRegister();
3523 return true;
3524 case 'U':
3525 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3526 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3527 // Usa: An absolute symbolic address
3528 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3529 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3530 }
3531 }
3532
3533 virtual const char *getClobbers() const {
3534 // There are no AArch64 clobbers shared by all asm statements.
3535 return "";
3536 }
3537
3538 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3539 return TargetInfo::AArch64ABIBuiltinVaList;
3540 }
3541};
3542
3543const char * const AArch64TargetInfo::GCCRegNames[] = {
3544 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3545 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3546 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3547 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3548
3549 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3550 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3551 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3552 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3553
3554 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3555 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3556 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3557 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3558
3559 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3560 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3561 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3562 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3563
3564 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3565 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3566 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3567 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3568
3569 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3570 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3571 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3572 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3573
3574 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3575 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3576 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3577 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3578};
3579
3580void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3581 unsigned &NumNames) const {
3582 Names = GCCRegNames;
3583 NumNames = llvm::array_lengthof(GCCRegNames);
3584}
3585
3586const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3587 { { "x16" }, "ip0"},
3588 { { "x17" }, "ip1"},
3589 { { "x29" }, "fp" },
3590 { { "x30" }, "lr" }
3591};
3592
3593void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3594 unsigned &NumAliases) const {
3595 Aliases = GCCRegAliases;
3596 NumAliases = llvm::array_lengthof(GCCRegAliases);
3597
3598}
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003599
3600const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
3601#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3602#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3603 ALL_LANGUAGES },
3604#include "clang/Basic/BuiltinsAArch64.def"
3605};
3606
Eli Friedman9fa28852012-08-08 23:57:20 +00003607} // end anonymous namespace
3608
3609namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003610class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003611 // Possible FPU choices.
3612 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003613 VFP2FPU = (1 << 0),
3614 VFP3FPU = (1 << 1),
3615 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003616 NeonFPU = (1 << 3),
3617 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003618 };
3619
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003620 // Possible HWDiv features.
3621 enum HWDivMode {
3622 HWDivThumb = (1 << 0),
3623 HWDivARM = (1 << 1)
3624 };
3625
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003626 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003627 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003628 }
3629
3630 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3631 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003632
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003633 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003634
Rafael Espindolaeb265472013-08-21 21:59:03 +00003635 enum {
3636 FP_Default,
3637 FP_VFP,
3638 FP_Neon
3639 } FPMath;
3640
Bernard Ogdenda13af32013-10-24 18:32:51 +00003641 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003642
Logan Chien57086ce2012-10-10 06:56:20 +00003643 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003644 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003645 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003646
3647 // Initialized via features.
3648 unsigned SoftFloat : 1;
3649 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003650
Bernard Ogden18b57012013-10-29 09:47:51 +00003651 unsigned CRC : 1;
3652
Chris Lattner5cc15e02010-03-03 19:03:45 +00003653 static const Builtin::Info BuiltinInfo[];
3654
Rafael Espindola101d5b92013-05-13 20:09:47 +00003655 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3656 // On linux, binaries targeting old cpus call functions in libgcc to
3657 // perform atomic operations. The implementation in libgcc then calls into
3658 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3659 // is that if we assume the kernel is at least as recent as the hardware,
3660 // it is safe to use atomic instructions on armv6 and newer.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003661 if (!T.isOSLinux() &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003662 T.getOS() != llvm::Triple::FreeBSD &&
Joerg Sonnenbergerfbd51be2013-12-02 16:12:05 +00003663 T.getOS() != llvm::Triple::NetBSD &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003664 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten60afa2d2013-06-15 09:40:14 +00003665 return false;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003666 StringRef ArchName = T.getArchName();
Rafael Espindola92dbc312013-05-14 00:44:24 +00003667 if (T.getArch() == llvm::Triple::arm) {
3668 if (!ArchName.startswith("armv"))
3669 return false;
3670 StringRef VersionStr = ArchName.substr(4);
3671 unsigned Version;
3672 if (VersionStr.getAsInteger(10, Version))
3673 return false;
3674 return Version >= 6;
3675 }
3676 assert(T.getArch() == llvm::Triple::thumb);
3677 if (!ArchName.startswith("thumbv"))
3678 return false;
3679 StringRef VersionStr = ArchName.substr(6);
3680 unsigned Version;
3681 if (VersionStr.getAsInteger(10, Version))
3682 return false;
3683 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003684 }
3685
Chris Lattner17df24e2008-04-21 18:56:49 +00003686public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003687 ARMTargetInfo(const llvm::Triple &Triple)
3688 : TargetInfo(Triple), ABI("aapcs-linux"), CPU("arm1136j-s"),
Rafael Espindolaeb265472013-08-21 21:59:03 +00003689 FPMath(FP_Default), IsAAPCS(true) {
Eli Friedman803acb32011-12-22 03:51:45 +00003690 BigEndian = false;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003691 switch (getTriple().getOS()) {
3692 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003693 SizeType = UnsignedLong;
3694 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003695 WCharType = SignedInt;
3696 break;
3697 default:
3698 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3699 WCharType = UnsignedInt;
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003700 SizeType = UnsignedInt;
3701 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003702 break;
3703 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003704
Chris Lattner1a8f3942010-04-23 16:29:58 +00003705 // {} in inline assembly are neon specifiers, not assembly variant
3706 // specifiers.
3707 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003708
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003709 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003710 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar03184792009-09-22 21:44:58 +00003711 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00003712 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3713 // so set preferred for small types to 32.
Rafael Espindola2da35322013-12-16 23:27:41 +00003714 DescriptionString = ("e-p:32:32-i1:8:32-i8:8:32-i16:16:32-"
3715 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00003716 "v128:64:128-a:0:32-n32-S64");
Daniel Dunbar03184792009-09-22 21:44:58 +00003717 } else {
Rafael Espindola2da35322013-12-16 23:27:41 +00003718 DescriptionString = ("e-p:32:32-"
3719 "i64:64-"
Rafael Espindola61a69252013-12-16 21:51:30 +00003720 "v128:64:128-n32-S64");
Daniel Dunbar03184792009-09-22 21:44:58 +00003721 }
John McCall86353412010-08-21 22:46:04 +00003722
3723 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003724 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003725
3726 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003727 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003728 if (shouldUseInlineAtomic(getTriple()))
3729 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003730
3731 // Do force alignment of members that follow zero length bitfields. If
3732 // the alignment of the zero-length bitfield is greater than the member
3733 // that follows it, `bar', `bar' will be aligned as the type of the
3734 // zero length bitfield.
3735 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003736 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003737 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003738 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003739 ABI = Name;
3740
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003741 // The defaults (above) are for AAPCS, check if we need to change them.
3742 //
3743 // FIXME: We need support for -meabi... we could just mangle it into the
3744 // name.
3745 if (Name == "apcs-gnu") {
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003746 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003747 // size_t is unsigned int on FreeBSD.
3748 if (getTriple().getOS() != llvm::Triple::FreeBSD)
3749 SizeType = UnsignedLong;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003750
James Molloyc445be42011-11-23 13:35:08 +00003751 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3752 WCharType = SignedInt;
3753
Daniel Dunbarf8125062010-04-22 16:14:54 +00003754 // Do not respect the alignment of bit-field types when laying out
3755 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3756 UseBitFieldTypeAlignment = false;
3757
Chad Rosier18903ee2011-08-04 01:21:14 +00003758 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosiera336c6f2011-08-04 17:52:43 +00003759 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3760 /// gcc.
Chad Rosier18903ee2011-08-04 01:21:14 +00003761 ZeroLengthBitfieldBoundary = 32;
3762
Logan Chien57086ce2012-10-10 06:56:20 +00003763 IsAAPCS = false;
3764
Daniel Dunbar03184792009-09-22 21:44:58 +00003765 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00003766 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3767 // so set preferred for small types to 32.
Rafael Espindola2da35322013-12-16 23:27:41 +00003768 DescriptionString = ("e-p:32:32-i1:8:32-i8:8:32-i16:16:32"
Rafael Espindola20b0d922013-12-16 20:34:33 +00003769 "-f64:32:64"
Rafael Espindola32083d52013-12-16 20:21:07 +00003770 "-v64:32:64-v128:32:128-a:0:32-n32-S32");
Daniel Dunbar03184792009-09-22 21:44:58 +00003771 } else {
Rafael Espindola2da35322013-12-16 23:27:41 +00003772 DescriptionString = ("e-p:32:32"
Rafael Espindola20b0d922013-12-16 20:34:33 +00003773 "-f64:32:64"
Rafael Espindola32083d52013-12-16 20:21:07 +00003774 "-v64:32:64-v128:32:128-a:0:32-n32-S32");
Daniel Dunbar03184792009-09-22 21:44:58 +00003775 }
3776
Chad Rosier99ee7822011-07-26 07:03:04 +00003777 // FIXME: Override "preferred align" for double and long long.
David Tweed8f676532012-10-25 13:33:01 +00003778 } else if (Name == "aapcs" || Name == "aapcs-vfp") {
Bob Wilson87b3a182013-06-18 05:36:04 +00003779 // size_t is unsigned long on Darwin.
3780 if (getTriple().isOSDarwin())
3781 SizeType = UnsignedLong;
Logan Chien57086ce2012-10-10 06:56:20 +00003782 IsAAPCS = true;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003783 // FIXME: Enumerated types are variable width in straight AAPCS.
3784 } else if (Name == "aapcs-linux") {
Logan Chien57086ce2012-10-10 06:56:20 +00003785 IsAAPCS = true;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003786 } else
3787 return false;
3788
3789 return true;
3790 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003791
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00003792 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Silviu Barangae5690462013-10-21 10:59:33 +00003793 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003794 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3795 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003796 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3797 CPU == "cortex-a9-mp") {
3798 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003799 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003800 }
3801 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003802 Features["vfp4"] = true;
3803 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003804 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3805 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3806 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003807 Features["vfp4"] = true;
3808 Features["neon"] = true;
3809 Features["hwdiv"] = true;
3810 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003811 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3812 Features["fp-armv8"] = true;
3813 Features["neon"] = true;
3814 Features["hwdiv"] = true;
3815 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003816 Features["crc"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003817 } else if (CPU == "cortex-r5" || CPU == "cortex-m3" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003818 CPU == "cortex-m4" ||
3819 // Enable the hwdiv extension for all v8a AArch32 cores by
3820 // default.
3821 ArchName == "armv8a" || ArchName == "armv8" ||
3822 ArchName == "thumbv8a" || ArchName == "thumbv8") {
3823 Features["hwdiv"] = true;
3824 Features["hwdiv-arm"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003825 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003826 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003827
Eric Christopher3ff21b32013-10-16 21:26:26 +00003828 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003829 DiagnosticsEngine &Diags) {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003830 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003831 CRC = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003832 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003833 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003834 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3835 if (Features[i] == "+soft-float")
3836 SoftFloat = true;
3837 else if (Features[i] == "+soft-float-abi")
3838 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003839 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003840 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003841 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003842 FPU |= VFP3FPU;
3843 else if (Features[i] == "+vfp4")
3844 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003845 else if (Features[i] == "+fp-armv8")
3846 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003847 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003848 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003849 else if (Features[i] == "+hwdiv")
3850 HWDiv |= HWDivThumb;
3851 else if (Features[i] == "+hwdiv-arm")
3852 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00003853 else if (Features[i] == "+crc")
3854 CRC = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003855 }
3856
Rafael Espindolaeb265472013-08-21 21:59:03 +00003857 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3858 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3859 return false;
3860 }
3861
3862 if (FPMath == FP_Neon)
3863 Features.push_back("+neonfp");
3864 else if (FPMath == FP_VFP)
3865 Features.push_back("-neonfp");
3866
Daniel Dunbar893d4752009-12-19 04:15:38 +00003867 // Remove front-end specific options which the backend handles differently.
3868 std::vector<std::string>::iterator it;
3869 it = std::find(Features.begin(), Features.end(), "+soft-float");
3870 if (it != Features.end())
3871 Features.erase(it);
3872 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3873 if (it != Features.end())
3874 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00003875 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003876 }
3877
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003878 virtual bool hasFeature(StringRef Feature) const {
3879 return llvm::StringSwitch<bool>(Feature)
3880 .Case("arm", true)
3881 .Case("softfloat", SoftFloat)
3882 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003883 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003884 .Case("hwdiv", HWDiv & HWDivThumb)
3885 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003886 .Default(false);
3887 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003888 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003889 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003890 return llvm::StringSwitch<const char*>(Name)
3891 .Cases("arm8", "arm810", "4")
3892 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3893 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3894 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3895 .Case("ep9312", "4T")
3896 .Cases("arm10tdmi", "arm1020t", "5T")
3897 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3898 .Case("arm926ej-s", "5TEJ")
3899 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3900 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003901 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003902 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003903 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003904 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonf643afc2013-03-04 22:37:46 +00003905 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003906 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003907 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003908 .Case("cortex-a9-mp", "7F")
3909 .Case("swift", "7S")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003910 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003911 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003912 .Cases("cortex-a53", "cortex-a57", "8A")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003913 .Default(0);
3914 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003915 static const char *getCPUProfile(StringRef Name) {
3916 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003917 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003918 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003919 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003920 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00003921 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00003922 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003923 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003924 virtual bool setCPU(const std::string &Name) {
3925 if (!getCPUDefineSuffix(Name))
3926 return false;
3927
3928 CPU = Name;
3929 return true;
3930 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00003931 virtual bool setFPMath(StringRef Name);
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003932 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003933 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003934 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003935 Builder.defineMacro("__arm");
3936 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003937
Chris Lattnerecd49032009-03-02 22:27:17 +00003938 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003939 Builder.defineMacro("__ARMEL__");
3940 Builder.defineMacro("__LITTLE_ENDIAN__");
3941 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003942
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003943 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003944 unsigned int CPUArchVer;
3945 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
3946 llvm_unreachable("Invalid char for architecture version number");
3947 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003948 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003949 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3950 StringRef CPUProfile = getCPUProfile(CPU);
3951 if (!CPUProfile.empty())
3952 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3953
Mike Stump9d54bd72009-04-08 02:07:04 +00003954 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003955
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003956 // FIXME: It's more complicated than this and we don't really support
3957 // interworking.
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003958 if (5 <= CPUArchVer && CPUArchVer <= 7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003959 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003960
David Tweed8f676532012-10-25 13:33:01 +00003961 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00003962 // Embedded targets on Darwin follow AAPCS, but not EABI.
3963 if (!getTriple().isOSDarwin())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00003964 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003965 Builder.defineMacro("__ARM_PCS", "1");
3966
David Tweed8f676532012-10-25 13:33:01 +00003967 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003968 Builder.defineMacro("__ARM_PCS_VFP", "1");
3969 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003970
Daniel Dunbar893d4752009-12-19 04:15:38 +00003971 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003972 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003973
3974 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003975 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003976
3977 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003978 Builder.defineMacro("__THUMBEL__");
3979 Builder.defineMacro("__thumb__");
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003980 if (CPUArch == "6T2" || CPUArchVer == 7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003981 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003982 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003983 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
3984 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003985
3986 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003987 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003988
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003989 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003990 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003991 if (FPU & VFP2FPU)
3992 Builder.defineMacro("__ARM_VFPV2__");
3993 if (FPU & VFP3FPU)
3994 Builder.defineMacro("__ARM_VFPV3__");
3995 if (FPU & VFP4FPU)
3996 Builder.defineMacro("__ARM_VFPV4__");
3997 }
3998
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003999 // This only gets set when Neon instructions are actually available, unlike
4000 // the VFP define, hence the soft float and arch check. This is subtly
4001 // different from gcc, we follow the intent which was that it should be set
4002 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004003 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4004 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004005 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004006 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004007
Bernard Ogden18b57012013-10-29 09:47:51 +00004008 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004009 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004010
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004011 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004012 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4013 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4014 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4015 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4016 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004017 }
4018 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4019 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004020 Records = BuiltinInfo;
4021 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004022 }
Bob Wilsona7a61e22012-01-26 22:14:27 +00004023 virtual bool isCLZForZeroUndef() const { return false; }
Meador Inge5d3fb222012-06-16 03:34:49 +00004024 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Logan Chien57086ce2012-10-10 06:56:20 +00004025 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004026 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004027 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004028 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004029 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004030 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004031 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004032 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004033 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004034 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004035 case 'l': // r0-r7
4036 case 'h': // r8-r15
4037 case 'w': // VFP Floating point register single precision
4038 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004039 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004040 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004041 case 'Q': // A memory address that is a single base register.
4042 Info.setAllowsMemory();
4043 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004044 case 'U': // a memory reference...
4045 switch (Name[1]) {
4046 case 'q': // ...ARMV4 ldrsb
4047 case 'v': // ...VFP load/store (reg+constant offset)
4048 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004049 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004050 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004051 case 'n': // valid address for Neon doubleword vector load/store
4052 case 'm': // valid address for Neon element and structure load/store
4053 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004054 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004055 Info.setAllowsMemory();
4056 Name++;
4057 return true;
4058 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004059 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004060 return false;
4061 }
Evan Chengd863adb2011-06-16 19:13:15 +00004062 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004063 std::string R;
4064 switch (*Constraint) {
4065 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004066 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004067 Constraint++;
4068 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004069 case 'p': // 'p' should be translated to 'r' by default.
4070 R = std::string("r");
4071 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004072 default:
4073 return std::string(1, *Constraint);
4074 }
4075 return R;
4076 }
Bill Wendling9d1ee112012-10-25 23:28:48 +00004077 virtual bool validateConstraintModifier(StringRef Constraint,
4078 const char Modifier,
4079 unsigned Size) const {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004080 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004081 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004082
Bill Wendling9d1ee112012-10-25 23:28:48 +00004083 // Strip off constraint modifiers.
4084 while (Constraint[0] == '=' ||
4085 Constraint[0] == '+' ||
4086 Constraint[0] == '&')
4087 Constraint = Constraint.substr(1);
4088
4089 switch (Constraint[0]) {
4090 default: break;
4091 case 'r': {
4092 switch (Modifier) {
4093 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004094 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004095 case 'q':
4096 // A register of size 32 cannot fit a vector type.
4097 return false;
4098 }
4099 }
4100 }
4101
4102 return true;
4103 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004104 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004105 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004106 return "";
4107 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004108
4109 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
4110 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4111 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004112
4113 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4114 if (RegNo == 0) return 0;
4115 if (RegNo == 1) return 1;
4116 return -1;
4117 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004118};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004119
Rafael Espindolaeb265472013-08-21 21:59:03 +00004120bool ARMTargetInfo::setFPMath(StringRef Name) {
4121 if (Name == "neon") {
4122 FPMath = FP_Neon;
4123 return true;
4124 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4125 Name == "vfp4") {
4126 FPMath = FP_VFP;
4127 return true;
4128 }
4129 return false;
4130}
4131
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004132const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004133 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004134 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004135 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4136
4137 // Float registers
4138 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4139 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4140 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004141 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004142
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004143 // Double registers
4144 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4145 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004146 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4147 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004148
4149 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004150 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4151 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004152};
4153
4154void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004155 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004156 Names = GCCRegNames;
4157 NumNames = llvm::array_lengthof(GCCRegNames);
4158}
4159
4160const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004161 { { "a1" }, "r0" },
4162 { { "a2" }, "r1" },
4163 { { "a3" }, "r2" },
4164 { { "a4" }, "r3" },
4165 { { "v1" }, "r4" },
4166 { { "v2" }, "r5" },
4167 { { "v3" }, "r6" },
4168 { { "v4" }, "r7" },
4169 { { "v5" }, "r8" },
4170 { { "v6", "rfp" }, "r9" },
4171 { { "sl" }, "r10" },
4172 { { "fp" }, "r11" },
4173 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004174 { { "r13" }, "sp" },
4175 { { "r14" }, "lr" },
4176 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004177 // The S, D and Q registers overlap, but aren't really aliases; we
4178 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004179};
4180
4181void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4182 unsigned &NumAliases) const {
4183 Aliases = GCCRegAliases;
4184 NumAliases = llvm::array_lengthof(GCCRegAliases);
4185}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004186
4187const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004188#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004189#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004190 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004191#include "clang/Basic/BuiltinsARM.def"
4192};
Chris Lattner17df24e2008-04-21 18:56:49 +00004193} // end anonymous namespace.
4194
Eli Friedmanf05b7722008-08-20 07:44:10 +00004195namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004196class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00004197 public DarwinTargetInfo<ARMTargetInfo> {
4198protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00004199 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004200 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004201 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004202 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004203
Torok Edwinb2b37c62009-06-30 17:10:35 +00004204public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004205 DarwinARMTargetInfo(const llvm::Triple &Triple)
4206 : DarwinTargetInfo<ARMTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004207 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004208 // iOS always has 64-bit atomic instructions.
4209 // FIXME: This should be based off of the target features in ARMTargetInfo.
4210 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004211
4212 // Darwin on iOS uses a variant of the ARM C++ ABI.
4213 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004214 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004215};
4216} // end anonymous namespace.
4217
Tony Linthicum76329bf2011-12-12 21:14:55 +00004218
4219namespace {
4220// Hexagon abstract base class
4221class HexagonTargetInfo : public TargetInfo {
4222 static const Builtin::Info BuiltinInfo[];
4223 static const char * const GCCRegNames[];
4224 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4225 std::string CPU;
4226public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004227 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004228 BigEndian = false;
Rafael Espindola8ddf8bc2013-12-17 00:04:48 +00004229 DescriptionString = ("e-p:32:32-i1:32-i64:64-a:0-n32");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004230
4231 // {} in inline assembly are packet specifiers, not assembly variant
4232 // specifiers.
4233 NoAsmVariants = true;
4234 }
4235
4236 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4237 unsigned &NumRecords) const {
4238 Records = BuiltinInfo;
4239 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4240 }
4241
4242 virtual bool validateAsmConstraint(const char *&Name,
4243 TargetInfo::ConstraintInfo &Info) const {
4244 return true;
4245 }
4246
4247 virtual void getTargetDefines(const LangOptions &Opts,
4248 MacroBuilder &Builder) const;
4249
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004250 virtual bool hasFeature(StringRef Feature) const {
4251 return Feature == "hexagon";
4252 }
4253
Meador Inge5d3fb222012-06-16 03:34:49 +00004254 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4255 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004256 }
4257 virtual void getGCCRegNames(const char * const *&Names,
4258 unsigned &NumNames) const;
4259 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4260 unsigned &NumAliases) const;
4261 virtual const char *getClobbers() const {
4262 return "";
4263 }
Sebastian Pop86500282012-01-13 20:37:10 +00004264
4265 static const char *getHexagonCPUSuffix(StringRef Name) {
4266 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004267 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004268 .Case("hexagonv5", "5")
Sebastian Pop86500282012-01-13 20:37:10 +00004269 .Default(0);
4270 }
4271
Tony Linthicum76329bf2011-12-12 21:14:55 +00004272 virtual bool setCPU(const std::string &Name) {
Sebastian Pop86500282012-01-13 20:37:10 +00004273 if (!getHexagonCPUSuffix(Name))
4274 return false;
4275
Tony Linthicum76329bf2011-12-12 21:14:55 +00004276 CPU = Name;
4277 return true;
4278 }
4279};
4280
4281void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4282 MacroBuilder &Builder) const {
4283 Builder.defineMacro("qdsp6");
4284 Builder.defineMacro("__qdsp6", "1");
4285 Builder.defineMacro("__qdsp6__", "1");
4286
4287 Builder.defineMacro("hexagon");
4288 Builder.defineMacro("__hexagon", "1");
4289 Builder.defineMacro("__hexagon__", "1");
4290
4291 if(CPU == "hexagonv1") {
4292 Builder.defineMacro("__HEXAGON_V1__");
4293 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4294 if(Opts.HexagonQdsp6Compat) {
4295 Builder.defineMacro("__QDSP6_V1__");
4296 Builder.defineMacro("__QDSP6_ARCH__", "1");
4297 }
4298 }
4299 else if(CPU == "hexagonv2") {
4300 Builder.defineMacro("__HEXAGON_V2__");
4301 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4302 if(Opts.HexagonQdsp6Compat) {
4303 Builder.defineMacro("__QDSP6_V2__");
4304 Builder.defineMacro("__QDSP6_ARCH__", "2");
4305 }
4306 }
4307 else if(CPU == "hexagonv3") {
4308 Builder.defineMacro("__HEXAGON_V3__");
4309 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4310 if(Opts.HexagonQdsp6Compat) {
4311 Builder.defineMacro("__QDSP6_V3__");
4312 Builder.defineMacro("__QDSP6_ARCH__", "3");
4313 }
4314 }
4315 else if(CPU == "hexagonv4") {
4316 Builder.defineMacro("__HEXAGON_V4__");
4317 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4318 if(Opts.HexagonQdsp6Compat) {
4319 Builder.defineMacro("__QDSP6_V4__");
4320 Builder.defineMacro("__QDSP6_ARCH__", "4");
4321 }
4322 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004323 else if(CPU == "hexagonv5") {
4324 Builder.defineMacro("__HEXAGON_V5__");
4325 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4326 if(Opts.HexagonQdsp6Compat) {
4327 Builder.defineMacro("__QDSP6_V5__");
4328 Builder.defineMacro("__QDSP6_ARCH__", "5");
4329 }
4330 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004331}
4332
4333const char * const HexagonTargetInfo::GCCRegNames[] = {
4334 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4335 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4336 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4337 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4338 "p0", "p1", "p2", "p3",
4339 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4340};
4341
4342void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4343 unsigned &NumNames) const {
4344 Names = GCCRegNames;
4345 NumNames = llvm::array_lengthof(GCCRegNames);
4346}
4347
4348
4349const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4350 { { "sp" }, "r29" },
4351 { { "fp" }, "r30" },
4352 { { "lr" }, "r31" },
4353 };
4354
4355void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4356 unsigned &NumAliases) const {
4357 Aliases = GCCRegAliases;
4358 NumAliases = llvm::array_lengthof(GCCRegAliases);
4359}
4360
4361
4362const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4363#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4364#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4365 ALL_LANGUAGES },
4366#include "clang/Basic/BuiltinsHexagon.def"
4367};
4368}
4369
4370
Chris Lattner5ba61f02006-10-14 07:39:34 +00004371namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004372// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4373class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004374 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4375 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004376 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004377public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004378 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004379
Eric Christopher3ff21b32013-10-16 21:26:26 +00004380 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00004381 DiagnosticsEngine &Diags) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004382 SoftFloat = false;
4383 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4384 if (Features[i] == "+soft-float")
4385 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004386 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004387 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00004388 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004389 MacroBuilder &Builder) const {
4390 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004391 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004392
4393 if (SoftFloat)
4394 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004395 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004396
4397 virtual bool hasFeature(StringRef Feature) const {
4398 return llvm::StringSwitch<bool>(Feature)
4399 .Case("softfloat", SoftFloat)
4400 .Case("sparc", true)
4401 .Default(false);
4402 }
4403
Gabor Greif49991682008-02-21 16:29:08 +00004404 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4405 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004406 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00004407 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004408 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4409 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00004410 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004411 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00004412 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004413 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00004414 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004415 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00004416 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004417 // FIXME: Implement!
4418 return false;
Gabor Greif49991682008-02-21 16:29:08 +00004419 }
4420 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004421 // FIXME: Implement!
4422 return "";
Gabor Greif49991682008-02-21 16:29:08 +00004423 }
4424};
4425
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004426const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00004427 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4428 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4429 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4430 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4431};
4432
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004433void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4434 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004435 Names = GCCRegNames;
4436 NumNames = llvm::array_lengthof(GCCRegNames);
4437}
4438
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004439const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004440 { { "g0" }, "r0" },
4441 { { "g1" }, "r1" },
4442 { { "g2" }, "r2" },
4443 { { "g3" }, "r3" },
4444 { { "g4" }, "r4" },
4445 { { "g5" }, "r5" },
4446 { { "g6" }, "r6" },
4447 { { "g7" }, "r7" },
4448 { { "o0" }, "r8" },
4449 { { "o1" }, "r9" },
4450 { { "o2" }, "r10" },
4451 { { "o3" }, "r11" },
4452 { { "o4" }, "r12" },
4453 { { "o5" }, "r13" },
4454 { { "o6", "sp" }, "r14" },
4455 { { "o7" }, "r15" },
4456 { { "l0" }, "r16" },
4457 { { "l1" }, "r17" },
4458 { { "l2" }, "r18" },
4459 { { "l3" }, "r19" },
4460 { { "l4" }, "r20" },
4461 { { "l5" }, "r21" },
4462 { { "l6" }, "r22" },
4463 { { "l7" }, "r23" },
4464 { { "i0" }, "r24" },
4465 { { "i1" }, "r25" },
4466 { { "i2" }, "r26" },
4467 { { "i3" }, "r27" },
4468 { { "i4" }, "r28" },
4469 { { "i5" }, "r29" },
4470 { { "i6", "fp" }, "r30" },
4471 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00004472};
4473
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004474void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4475 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004476 Aliases = GCCRegAliases;
4477 NumAliases = llvm::array_lengthof(GCCRegAliases);
4478}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004479
4480// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4481class SparcV8TargetInfo : public SparcTargetInfo {
4482public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004483 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004484 // FIXME: Support Sparc quad-precision long double?
Rafael Espindola2da35322013-12-16 23:27:41 +00004485 DescriptionString = "E-p:32:32-"
4486 "i64:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004487 }
4488
4489 virtual void getTargetDefines(const LangOptions &Opts,
4490 MacroBuilder &Builder) const {
4491 SparcTargetInfo::getTargetDefines(Opts, Builder);
4492 Builder.defineMacro("__sparcv8");
4493 }
4494};
4495
4496// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4497class SparcV9TargetInfo : public SparcTargetInfo {
4498public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004499 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004500 // FIXME: Support Sparc quad-precision long double?
Rafael Espindola47debc02013-12-16 21:59:14 +00004501 DescriptionString = "E-"
Rafael Espindola2da35322013-12-16 23:27:41 +00004502 "i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00004503 // This is an LP64 platform.
4504 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004505
4506 // OpenBSD uses long long for int64_t and intmax_t.
4507 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
4508 IntMaxType = SignedLongLong;
4509 UIntMaxType = UnsignedLongLong;
4510 } else {
4511 IntMaxType = SignedLong;
4512 UIntMaxType = UnsignedLong;
4513 }
4514 Int64Type = IntMaxType;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004515 }
4516
4517 virtual void getTargetDefines(const LangOptions &Opts,
4518 MacroBuilder &Builder) const {
4519 SparcTargetInfo::getTargetDefines(Opts, Builder);
4520 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00004521 Builder.defineMacro("__arch64__");
4522 // Solaris and its derivative AuroraUX don't need these variants, but the
4523 // BSDs do.
4524 if (getTriple().getOS() != llvm::Triple::Solaris &&
4525 getTriple().getOS() != llvm::Triple::AuroraUX) {
4526 Builder.defineMacro("__sparc64__");
4527 Builder.defineMacro("__sparc_v9__");
4528 Builder.defineMacro("__sparcv9__");
4529 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004530 }
4531};
4532
Gabor Greif49991682008-02-21 16:29:08 +00004533} // end anonymous namespace.
4534
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004535namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004536class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4537public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004538 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
4539 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004540 SizeType = UnsignedInt;
4541 PtrDiffType = SignedInt;
4542 }
4543};
Torok Edwinb2b37c62009-06-30 17:10:35 +00004544class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004545public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004546 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
4547 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00004548 SizeType = UnsignedInt;
4549 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004550 }
4551};
4552} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00004553
Chris Lattnerb781dc792008-05-08 05:58:21 +00004554namespace {
Ulrich Weigand47445072013-05-06 16:26:41 +00004555 class SystemZTargetInfo : public TargetInfo {
4556 static const char *const GCCRegNames[];
4557
4558 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004559 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Ulrich Weigand47445072013-05-06 16:26:41 +00004560 TLSSupported = true;
4561 IntWidth = IntAlign = 32;
4562 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
4563 PointerWidth = PointerAlign = 64;
4564 LongDoubleWidth = 128;
4565 LongDoubleAlign = 64;
4566 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4567 MinGlobalAlign = 16;
Rafael Espindola04c685b2013-12-16 22:50:41 +00004568 DescriptionString = "E-i1:8:16-i8:8:16-i64:64"
4569 "-f128:64-a:8:16-n32:64";
Ulrich Weigand47445072013-05-06 16:26:41 +00004570 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4571 }
4572 virtual void getTargetDefines(const LangOptions &Opts,
4573 MacroBuilder &Builder) const {
4574 Builder.defineMacro("__s390__");
4575 Builder.defineMacro("__s390x__");
4576 Builder.defineMacro("__zarch__");
4577 Builder.defineMacro("__LONG_DOUBLE_128__");
4578 }
4579 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4580 unsigned &NumRecords) const {
4581 // FIXME: Implement.
4582 Records = 0;
4583 NumRecords = 0;
4584 }
4585
4586 virtual void getGCCRegNames(const char *const *&Names,
4587 unsigned &NumNames) const;
4588 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4589 unsigned &NumAliases) const {
4590 // No aliases.
4591 Aliases = 0;
4592 NumAliases = 0;
4593 }
4594 virtual bool validateAsmConstraint(const char *&Name,
4595 TargetInfo::ConstraintInfo &info) const;
4596 virtual const char *getClobbers() const {
4597 // FIXME: Is this really right?
4598 return "";
4599 }
4600 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4601 return TargetInfo::SystemZBuiltinVaList;
4602 }
Richard Sandiford4652d892013-07-19 16:51:51 +00004603 virtual bool setCPU(const std::string &Name) {
4604 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4605 .Case("z10", true)
4606 .Case("z196", true)
4607 .Case("zEC12", true)
4608 .Default(false);
4609
4610 // No need to store the CPU yet. There aren't any CPU-specific
4611 // macros to define.
4612 return CPUKnown;
4613 }
Ulrich Weigand47445072013-05-06 16:26:41 +00004614 };
4615
4616 const char *const SystemZTargetInfo::GCCRegNames[] = {
4617 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4618 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4619 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
4620 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
4621 };
4622
4623 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
4624 unsigned &NumNames) const {
4625 Names = GCCRegNames;
4626 NumNames = llvm::array_lengthof(GCCRegNames);
4627 }
4628
4629 bool SystemZTargetInfo::
4630 validateAsmConstraint(const char *&Name,
4631 TargetInfo::ConstraintInfo &Info) const {
4632 switch (*Name) {
4633 default:
4634 return false;
4635
4636 case 'a': // Address register
4637 case 'd': // Data register (equivalent to 'r')
4638 case 'f': // Floating-point register
4639 Info.setAllowsRegister();
4640 return true;
4641
4642 case 'I': // Unsigned 8-bit constant
4643 case 'J': // Unsigned 12-bit constant
4644 case 'K': // Signed 16-bit constant
4645 case 'L': // Signed 20-bit displacement (on all targets we support)
4646 case 'M': // 0x7fffffff
4647 return true;
4648
4649 case 'Q': // Memory with base and unsigned 12-bit displacement
4650 case 'R': // Likewise, plus an index
4651 case 'S': // Memory with base and signed 20-bit displacement
4652 case 'T': // Likewise, plus an index
4653 Info.setAllowsMemory();
4654 return true;
4655 }
4656 }
4657}
4658
4659namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004660 class MSP430TargetInfo : public TargetInfo {
4661 static const char * const GCCRegNames[];
4662 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004663 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004664 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004665 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00004666 IntWidth = 16; IntAlign = 16;
4667 LongWidth = 32; LongLongWidth = 64;
4668 LongAlign = LongLongAlign = 16;
4669 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004670 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004671 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00004672 IntMaxType = SignedLongLong;
4673 UIntMaxType = UnsignedLongLong;
4674 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004675 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00004676 SigAtomicType = SignedLong;
Rafael Espindola2da35322013-12-16 23:27:41 +00004677 DescriptionString = "e-p:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004678 }
4679 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004680 MacroBuilder &Builder) const {
4681 Builder.defineMacro("MSP430");
4682 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004683 // FIXME: defines for different 'flavours' of MCU
4684 }
4685 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4686 unsigned &NumRecords) const {
4687 // FIXME: Implement.
4688 Records = 0;
4689 NumRecords = 0;
4690 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004691 virtual bool hasFeature(StringRef Feature) const {
4692 return Feature == "msp430";
4693 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004694 virtual void getGCCRegNames(const char * const *&Names,
4695 unsigned &NumNames) const;
4696 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4697 unsigned &NumAliases) const {
4698 // No aliases.
4699 Aliases = 0;
4700 NumAliases = 0;
4701 }
4702 virtual bool validateAsmConstraint(const char *&Name,
4703 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00004704 // No target constraints for now.
4705 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004706 }
4707 virtual const char *getClobbers() const {
4708 // FIXME: Is this really right?
4709 return "";
4710 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004711 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004712 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00004713 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004714 }
4715 };
4716
4717 const char * const MSP430TargetInfo::GCCRegNames[] = {
4718 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4719 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4720 };
4721
4722 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4723 unsigned &NumNames) const {
4724 Names = GCCRegNames;
4725 NumNames = llvm::array_lengthof(GCCRegNames);
4726 }
4727}
4728
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00004729namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004730
Mike Stump11289f42009-09-09 15:08:12 +00004731 // LLVM and Clang cannot be used directly to output native binaries for
4732 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00004733 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00004734 //
4735 // TCE uses the llvm bitcode as input and uses it for generating customized
4736 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00004737 // publicly available in http://tce.cs.tut.fi
4738
Eli Friedman1f191002011-10-07 19:51:42 +00004739 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4740 3, // opencl_global
4741 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00004742 5, // opencl_constant
4743 0, // cuda_device
4744 0, // cuda_constant
4745 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00004746 };
4747
Eli Friedmana9c3d712009-08-19 20:47:07 +00004748 class TCETargetInfo : public TargetInfo{
4749 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004750 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004751 TLSSupported = false;
4752 IntWidth = 32;
4753 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004754 PointerWidth = 32;
4755 IntAlign = 32;
4756 LongAlign = LongLongAlign = 32;
4757 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004758 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004759 SizeType = UnsignedInt;
4760 IntMaxType = SignedLong;
4761 UIntMaxType = UnsignedLong;
4762 IntPtrType = SignedInt;
4763 PtrDiffType = SignedInt;
4764 FloatWidth = 32;
4765 FloatAlign = 32;
4766 DoubleWidth = 32;
4767 DoubleAlign = 32;
4768 LongDoubleWidth = 32;
4769 LongDoubleAlign = 32;
4770 FloatFormat = &llvm::APFloat::IEEEsingle;
4771 DoubleFormat = &llvm::APFloat::IEEEsingle;
4772 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola2da35322013-12-16 23:27:41 +00004773 DescriptionString = "E-p:32:32-i8:8:32-"
4774 "i16:16:32-i64:32"
4775 "-f64:32-v64:32-"
4776 "v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00004777 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00004778 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004779 }
4780
4781 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004782 MacroBuilder &Builder) const {
4783 DefineStd(Builder, "tce", Opts);
4784 Builder.defineMacro("__TCE__");
4785 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00004786 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004787 virtual bool hasFeature(StringRef Feature) const {
4788 return Feature == "tce";
4789 }
4790
Eli Friedmana9c3d712009-08-19 20:47:07 +00004791 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4792 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00004793 virtual const char *getClobbers() const {
4794 return "";
4795 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004796 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4797 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004798 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00004799 virtual void getGCCRegNames(const char * const *&Names,
4800 unsigned &NumNames) const {}
4801 virtual bool validateAsmConstraint(const char *&Name,
4802 TargetInfo::ConstraintInfo &info) const {
4803 return true;
4804 }
4805 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4806 unsigned &NumAliases) const {}
4807 };
4808}
4809
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004810namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004811class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00004812 virtual void setDescriptionString() = 0;
4813
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004814 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004815 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00004816 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00004817 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004818 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00004819 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004820 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00004821 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004822 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004823 enum DspRevEnum {
4824 NoDSP, DSP1, DSP2
4825 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00004826 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004827
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004828protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00004829 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004830 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004831
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004832public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004833 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
4834 const std::string &CPUStr)
4835 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004836 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004837 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004838
Eric Christopher0b26a612010-03-02 02:41:08 +00004839 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004840 virtual bool setABI(const std::string &Name) = 0;
Eric Christopher0b26a612010-03-02 02:41:08 +00004841 virtual bool setCPU(const std::string &Name) {
4842 CPU = Name;
4843 return true;
4844 }
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00004845 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christopher0b26a612010-03-02 02:41:08 +00004846 Features[ABI] = true;
4847 Features[CPU] = true;
4848 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004849
Simon Atanasyan16ee0052012-08-29 19:59:32 +00004850 virtual void getTargetDefines(const LangOptions &Opts,
4851 MacroBuilder &Builder) const {
Simon Atanasyan683535b2012-08-29 19:14:58 +00004852 DefineStd(Builder, "mips", Opts);
4853 Builder.defineMacro("_mips");
4854 Builder.defineMacro("__REGISTER_PREFIX__", "");
4855
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004856 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004857 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004858 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004859 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004860 case SoftFloat:
4861 Builder.defineMacro("__mips_soft_float", Twine(1));
4862 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004863 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00004864
Simon Atanasyan16071912013-04-14 14:07:30 +00004865 if (IsSingleFloat)
4866 Builder.defineMacro("__mips_single_float", Twine(1));
4867
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004868 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
4869 Builder.defineMacro("_MIPS_FPSET",
4870 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
4871
Simon Atanasyan72244b62012-07-05 16:06:06 +00004872 if (IsMips16)
4873 Builder.defineMacro("__mips16", Twine(1));
4874
Simon Atanasyan60777612013-04-14 14:07:51 +00004875 if (IsMicromips)
4876 Builder.defineMacro("__mips_micromips", Twine(1));
4877
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004878 if (IsNan2008)
4879 Builder.defineMacro("__mips_nan2008", Twine(1));
4880
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004881 switch (DspRev) {
4882 default:
4883 break;
4884 case DSP1:
4885 Builder.defineMacro("__mips_dsp_rev", Twine(1));
4886 Builder.defineMacro("__mips_dsp", Twine(1));
4887 break;
4888 case DSP2:
4889 Builder.defineMacro("__mips_dsp_rev", Twine(2));
4890 Builder.defineMacro("__mips_dspr2", Twine(1));
4891 Builder.defineMacro("__mips_dsp", Twine(1));
4892 break;
4893 }
4894
Jack Carter44ff1e52013-08-12 17:20:29 +00004895 if (HasMSA)
4896 Builder.defineMacro("__mips_msa", Twine(1));
4897
Simon Atanasyan26f19672012-04-05 19:28:31 +00004898 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
4899 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
4900 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00004901
4902 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
4903 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004904 }
4905
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004906 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4907 unsigned &NumRecords) const {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004908 Records = BuiltinInfo;
4909 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004910 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004911 virtual bool hasFeature(StringRef Feature) const {
Akira Hatanaka618b2982013-10-29 19:00:35 +00004912 return llvm::StringSwitch<bool>(Feature)
4913 .Case("mips", true)
4914 .Case("fp64", HasFP64)
4915 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004916 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004917 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4918 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004919 }
4920 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004921 unsigned &NumNames) const {
Daniel Sanders8b59af12013-11-12 12:56:01 +00004922 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00004923 // CPU register names
4924 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004925 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
4926 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
4927 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00004928 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
4929 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004930 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
4931 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
4932 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
4933 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00004934 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004935 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00004936 "$fcc5","$fcc6","$fcc7",
4937 // MSA register names
4938 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
4939 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
4940 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
4941 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
4942 // MSA control register names
4943 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
4944 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004945 };
4946 Names = GCCRegNames;
4947 NumNames = llvm::array_lengthof(GCCRegNames);
4948 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004949 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004950 unsigned &NumAliases) const = 0;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004951 virtual bool validateAsmConstraint(const char *&Name,
4952 TargetInfo::ConstraintInfo &Info) const {
4953 switch (*Name) {
4954 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00004955 return false;
4956
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004957 case 'r': // CPU registers.
4958 case 'd': // Equivalent to "r" unless generating MIPS16 code.
4959 case 'y': // Equivalent to "r", backwards compatibility only.
4960 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00004961 case 'c': // $25 for indirect jumps
4962 case 'l': // lo register
4963 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004964 Info.setAllowsRegister();
4965 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00004966 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00004967 Info.setAllowsMemory();
4968 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004969 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004970 }
4971
4972 virtual const char *getClobbers() const {
4973 // FIXME: Implement!
4974 return "";
4975 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004976
Eric Christopher3ff21b32013-10-16 21:26:26 +00004977 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00004978 DiagnosticsEngine &Diags) {
Simon Atanasyan72244b62012-07-05 16:06:06 +00004979 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00004980 IsMicromips = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004981 IsNan2008 = false;
Simon Atanasyan16071912013-04-14 14:07:30 +00004982 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004983 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004984 DspRev = NoDSP;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004985 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004986
4987 for (std::vector<std::string>::iterator it = Features.begin(),
4988 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004989 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00004990 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004991 else if (*it == "+soft-float")
4992 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00004993 else if (*it == "+mips16")
4994 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00004995 else if (*it == "+micromips")
4996 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004997 else if (*it == "+dsp")
4998 DspRev = std::max(DspRev, DSP1);
4999 else if (*it == "+dspr2")
5000 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005001 else if (*it == "+msa")
5002 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005003 else if (*it == "+fp64")
5004 HasFP64 = true;
5005 else if (*it == "-fp64")
5006 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005007 else if (*it == "+nan2008")
5008 IsNan2008 = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005009 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005010
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005011 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005012 std::vector<std::string>::iterator it =
5013 std::find(Features.begin(), Features.end(), "+soft-float");
5014 if (it != Features.end())
5015 Features.erase(it);
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005016 it = std::find(Features.begin(), Features.end(), "+nan2008");
5017 if (it != Features.end())
5018 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005019
Akira Hatanaka9064e362013-10-29 18:30:33 +00005020 setDescriptionString();
5021
Rafael Espindolaeb265472013-08-21 21:59:03 +00005022 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005023 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005024
5025 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
5026 if (RegNo == 0) return 4;
5027 if (RegNo == 1) return 5;
5028 return -1;
5029 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005030};
5031
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005032const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5033#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5034#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5035 ALL_LANGUAGES },
5036#include "clang/Basic/BuiltinsMips.def"
5037};
5038
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005039class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005040public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005041 Mips32TargetInfoBase(const llvm::Triple &Triple)
5042 : MipsTargetInfoBase(Triple, "o32", "mips32") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005043 SizeType = UnsignedInt;
5044 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005045 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005046 }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005047 virtual bool setABI(const std::string &Name) {
5048 if ((Name == "o32") || (Name == "eabi")) {
5049 ABI = Name;
5050 return true;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005051 } else if (Name == "32") {
5052 ABI = "o32";
5053 return true;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005054 } else
5055 return false;
5056 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005057 virtual void getTargetDefines(const LangOptions &Opts,
5058 MacroBuilder &Builder) const {
5059 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005060
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005061 if (ABI == "o32") {
5062 Builder.defineMacro("__mips_o32");
5063 Builder.defineMacro("_ABIO32", "1");
5064 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5065 }
5066 else if (ABI == "eabi")
5067 Builder.defineMacro("__mips_eabi");
5068 else
David Blaikie83d382b2011-09-23 05:06:16 +00005069 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005070 }
5071 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5072 unsigned &NumAliases) const {
5073 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5074 { { "at" }, "$1" },
5075 { { "v0" }, "$2" },
5076 { { "v1" }, "$3" },
5077 { { "a0" }, "$4" },
5078 { { "a1" }, "$5" },
5079 { { "a2" }, "$6" },
5080 { { "a3" }, "$7" },
5081 { { "t0" }, "$8" },
5082 { { "t1" }, "$9" },
5083 { { "t2" }, "$10" },
5084 { { "t3" }, "$11" },
5085 { { "t4" }, "$12" },
5086 { { "t5" }, "$13" },
5087 { { "t6" }, "$14" },
5088 { { "t7" }, "$15" },
5089 { { "s0" }, "$16" },
5090 { { "s1" }, "$17" },
5091 { { "s2" }, "$18" },
5092 { { "s3" }, "$19" },
5093 { { "s4" }, "$20" },
5094 { { "s5" }, "$21" },
5095 { { "s6" }, "$22" },
5096 { { "s7" }, "$23" },
5097 { { "t8" }, "$24" },
5098 { { "t9" }, "$25" },
5099 { { "k0" }, "$26" },
5100 { { "k1" }, "$27" },
5101 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005102 { { "sp","$sp" }, "$29" },
5103 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005104 { { "ra" }, "$31" }
5105 };
5106 Aliases = GCCRegAliases;
5107 NumAliases = llvm::array_lengthof(GCCRegAliases);
5108 }
5109};
5110
5111class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005112 virtual void setDescriptionString() {
Rafael Espindola2da35322013-12-16 23:27:41 +00005113 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-"
5114 "i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005115 }
5116
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005117public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005118 Mips32EBTargetInfo(const llvm::Triple &Triple)
5119 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005120 }
5121 virtual void getTargetDefines(const LangOptions &Opts,
5122 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005123 DefineStd(Builder, "MIPSEB", Opts);
5124 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005125 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005126 }
5127};
5128
5129class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005130 virtual void setDescriptionString() {
Rafael Espindola2da35322013-12-16 23:27:41 +00005131 DescriptionString = "e-p:32:32-i8:8:32-i16:16:32-"
5132 "i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005133 }
5134
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005135public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005136 Mips32ELTargetInfo(const llvm::Triple &Triple)
5137 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005138 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005139 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005140 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005141 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005142 DefineStd(Builder, "MIPSEL", Opts);
5143 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005144 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005145 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005146};
Akira Hatanakabef17452011-09-20 19:21:49 +00005147
5148class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005149public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005150 Mips64TargetInfoBase(const llvm::Triple &Triple)
5151 : MipsTargetInfoBase(Triple, "n64", "mips64") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005152 LongWidth = LongAlign = 64;
5153 PointerWidth = PointerAlign = 64;
5154 LongDoubleWidth = LongDoubleAlign = 128;
5155 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005156 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5157 LongDoubleWidth = LongDoubleAlign = 64;
5158 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5159 }
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005160 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005161 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005162 }
Akira Hatanakabef17452011-09-20 19:21:49 +00005163 virtual bool setABI(const std::string &Name) {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005164 if (Name == "n32") {
5165 LongWidth = LongAlign = 32;
5166 PointerWidth = PointerAlign = 32;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005167 ABI = Name;
5168 return true;
5169 } else if (Name == "n64") {
5170 ABI = Name;
5171 return true;
5172 } else if (Name == "64") {
5173 ABI = "n64";
5174 return true;
5175 } else
5176 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005177 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005178 virtual void getTargetDefines(const LangOptions &Opts,
5179 MacroBuilder &Builder) const {
5180 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005181
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005182 Builder.defineMacro("__mips64");
5183 Builder.defineMacro("__mips64__");
5184
Akira Hatanakabef17452011-09-20 19:21:49 +00005185 if (ABI == "n32") {
5186 Builder.defineMacro("__mips_n32");
5187 Builder.defineMacro("_ABIN32", "2");
5188 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5189 }
5190 else if (ABI == "n64") {
5191 Builder.defineMacro("__mips_n64");
5192 Builder.defineMacro("_ABI64", "3");
5193 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5194 }
5195 else
David Blaikie83d382b2011-09-23 05:06:16 +00005196 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005197 }
5198 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5199 unsigned &NumAliases) const {
5200 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5201 { { "at" }, "$1" },
5202 { { "v0" }, "$2" },
5203 { { "v1" }, "$3" },
5204 { { "a0" }, "$4" },
5205 { { "a1" }, "$5" },
5206 { { "a2" }, "$6" },
5207 { { "a3" }, "$7" },
5208 { { "a4" }, "$8" },
5209 { { "a5" }, "$9" },
5210 { { "a6" }, "$10" },
5211 { { "a7" }, "$11" },
5212 { { "t0" }, "$12" },
5213 { { "t1" }, "$13" },
5214 { { "t2" }, "$14" },
5215 { { "t3" }, "$15" },
5216 { { "s0" }, "$16" },
5217 { { "s1" }, "$17" },
5218 { { "s2" }, "$18" },
5219 { { "s3" }, "$19" },
5220 { { "s4" }, "$20" },
5221 { { "s5" }, "$21" },
5222 { { "s6" }, "$22" },
5223 { { "s7" }, "$23" },
5224 { { "t8" }, "$24" },
5225 { { "t9" }, "$25" },
5226 { { "k0" }, "$26" },
5227 { { "k1" }, "$27" },
5228 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005229 { { "sp","$sp" }, "$29" },
5230 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005231 { { "ra" }, "$31" }
5232 };
5233 Aliases = GCCRegAliases;
5234 NumAliases = llvm::array_lengthof(GCCRegAliases);
5235 }
5236};
5237
5238class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005239 virtual void setDescriptionString() {
5240 if (ABI == "n32")
Rafael Espindola2da35322013-12-16 23:27:41 +00005241 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-"
5242 "i64:64-f128:128-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005243 "n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005244 else
Rafael Espindola47debc02013-12-16 21:59:14 +00005245 DescriptionString = "E-i8:8:32-i16:16:32-"
Rafael Espindola2da35322013-12-16 23:27:41 +00005246 "i64:64-f128:128-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005247 "n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005248
Akira Hatanakabef17452011-09-20 19:21:49 +00005249 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005250
Akira Hatanakabef17452011-09-20 19:21:49 +00005251public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005252 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005253 : Mips64TargetInfoBase(Triple) {}
Akira Hatanakabef17452011-09-20 19:21:49 +00005254 virtual void getTargetDefines(const LangOptions &Opts,
5255 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00005256 DefineStd(Builder, "MIPSEB", Opts);
5257 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005258 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005259 }
5260};
5261
5262class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005263 virtual void setDescriptionString() {
5264 if (ABI == "n32")
Rafael Espindola2da35322013-12-16 23:27:41 +00005265 DescriptionString = "e-p:32:32-i8:8:32-i16:16:32-"
5266 "i64:64-f128:128"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005267 "-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005268 else
Rafael Espindola47debc02013-12-16 21:59:14 +00005269 DescriptionString = "e-i8:8:32-i16:16:32-"
Rafael Espindola2da35322013-12-16 23:27:41 +00005270 "i64:64-f128:128-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005271 "n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005272 }
5273public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005274 Mips64ELTargetInfo(const llvm::Triple &Triple)
5275 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005276 // Default ABI is n64.
5277 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005278 }
5279 virtual void getTargetDefines(const LangOptions &Opts,
5280 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00005281 DefineStd(Builder, "MIPSEL", Opts);
5282 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005283 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005284 }
5285};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005286} // end anonymous namespace.
5287
Ivan Krasindd7403e2011-08-24 20:22:22 +00005288namespace {
5289class PNaClTargetInfo : public TargetInfo {
5290public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005291 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005292 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005293 this->UserLabelPrefix = "";
5294 this->LongAlign = 32;
5295 this->LongWidth = 32;
5296 this->PointerAlign = 32;
5297 this->PointerWidth = 32;
5298 this->IntMaxType = TargetInfo::SignedLongLong;
5299 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5300 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005301 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005302 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005303 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005304 this->SizeType = TargetInfo::UnsignedInt;
5305 this->PtrDiffType = TargetInfo::SignedInt;
5306 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005307 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005308 }
5309
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005310 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005311 }
5312 virtual void getArchDefines(const LangOptions &Opts,
5313 MacroBuilder &Builder) const {
5314 Builder.defineMacro("__le32__");
5315 Builder.defineMacro("__pnacl__");
5316 }
5317 virtual void getTargetDefines(const LangOptions &Opts,
5318 MacroBuilder &Builder) const {
Jan Wen Voung1d4c2d92012-03-29 00:05:59 +00005319 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasindd7403e2011-08-24 20:22:22 +00005320 getArchDefines(Opts, Builder);
5321 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005322 virtual bool hasFeature(StringRef Feature) const {
5323 return Feature == "pnacl";
5324 }
Ivan Krasindd7403e2011-08-24 20:22:22 +00005325 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5326 unsigned &NumRecords) const {
5327 }
Meador Inge5d3fb222012-06-16 03:34:49 +00005328 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5329 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005330 }
5331 virtual void getGCCRegNames(const char * const *&Names,
5332 unsigned &NumNames) const;
5333 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5334 unsigned &NumAliases) const;
5335 virtual bool validateAsmConstraint(const char *&Name,
5336 TargetInfo::ConstraintInfo &Info) const {
5337 return false;
5338 }
5339
5340 virtual const char *getClobbers() const {
5341 return "";
5342 }
5343};
5344
5345void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5346 unsigned &NumNames) const {
5347 Names = NULL;
5348 NumNames = 0;
5349}
5350
5351void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5352 unsigned &NumAliases) const {
5353 Aliases = NULL;
5354 NumAliases = 0;
5355}
5356} // end anonymous namespace.
5357
Guy Benyeib798fc92012-12-11 21:38:14 +00005358namespace {
5359 static const unsigned SPIRAddrSpaceMap[] = {
5360 1, // opencl_global
5361 3, // opencl_local
5362 2, // opencl_constant
5363 0, // cuda_device
5364 0, // cuda_constant
5365 0 // cuda_shared
5366 };
5367 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00005368 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005369 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005370 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5371 "SPIR target must use unknown OS");
5372 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5373 "SPIR target must use unknown environment type");
5374 BigEndian = false;
5375 TLSSupported = false;
5376 LongWidth = LongAlign = 64;
5377 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005378 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00005379 // Define available target features
5380 // These must be defined in sorted order!
5381 NoAsmVariants = true;
5382 }
5383 virtual void getTargetDefines(const LangOptions &Opts,
5384 MacroBuilder &Builder) const {
5385 DefineStd(Builder, "SPIR", Opts);
5386 }
5387 virtual bool hasFeature(StringRef Feature) const {
5388 return Feature == "spir";
5389 }
5390
5391 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5392 unsigned &NumRecords) const {}
5393 virtual const char *getClobbers() const {
5394 return "";
5395 }
5396 virtual void getGCCRegNames(const char * const *&Names,
5397 unsigned &NumNames) const {}
5398 virtual bool validateAsmConstraint(const char *&Name,
5399 TargetInfo::ConstraintInfo &info) const {
5400 return true;
5401 }
5402 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5403 unsigned &NumAliases) const {}
5404 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5405 return TargetInfo::VoidPtrBuiltinVaList;
5406 }
5407 };
5408
5409
5410 class SPIR32TargetInfo : public SPIRTargetInfo {
5411 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005412 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005413 PointerWidth = PointerAlign = 32;
5414 SizeType = TargetInfo::UnsignedInt;
5415 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5416 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00005417 = "e-p:32:32-i64:64"
5418 "-v16:16-v24:32-v32:32-v48:64-"
5419 "v96:128-v192:256-v256:256-"
5420 "v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005421 }
5422 virtual void getTargetDefines(const LangOptions &Opts,
5423 MacroBuilder &Builder) const {
5424 DefineStd(Builder, "SPIR32", Opts);
5425 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005426 };
5427
5428 class SPIR64TargetInfo : public SPIRTargetInfo {
5429 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005430 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005431 PointerWidth = PointerAlign = 64;
5432 SizeType = TargetInfo::UnsignedLong;
5433 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
5434 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00005435 = "e-i64:64"
5436 "-v16:16-v24:32-v32:32-v48:64-"
5437 "v96:128-v192:256-v256:256-"
5438 "v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005439 }
5440 virtual void getTargetDefines(const LangOptions &Opts,
5441 MacroBuilder &Builder) const {
5442 DefineStd(Builder, "SPIR64", Opts);
5443 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005444 };
5445}
5446
Robert Lytton0e076492013-08-13 09:43:10 +00005447namespace {
5448class XCoreTargetInfo : public TargetInfo {
5449 static const Builtin::Info BuiltinInfo[];
5450public:
5451 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5452 BigEndian = false;
5453 NoAsmVariants = true;
5454 LongLongAlign = 32;
5455 SuitableAlign = 32;
5456 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00005457 SizeType = UnsignedInt;
5458 PtrDiffType = SignedInt;
5459 IntPtrType = SignedInt;
5460 WCharType = UnsignedChar;
5461 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00005462 UseZeroLengthBitfieldAlignment = true;
Rafael Espindola8ddf8bc2013-12-17 00:04:48 +00005463 DescriptionString = "e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
Rafael Espindola26c67b72013-12-17 14:34:42 +00005464 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00005465 }
5466 virtual void getTargetDefines(const LangOptions &Opts,
5467 MacroBuilder &Builder) const {
5468 Builder.defineMacro("__XS1B__");
5469 }
5470 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5471 unsigned &NumRecords) const {
5472 Records = BuiltinInfo;
5473 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5474 }
5475 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5476 return TargetInfo::VoidPtrBuiltinVaList;
5477 }
5478 virtual const char *getClobbers() const {
5479 return "";
5480 }
5481 virtual void getGCCRegNames(const char * const *&Names,
5482 unsigned &NumNames) const {
5483 static const char * const GCCRegNames[] = {
5484 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5485 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
5486 };
5487 Names = GCCRegNames;
5488 NumNames = llvm::array_lengthof(GCCRegNames);
5489 }
5490 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5491 unsigned &NumAliases) const {
5492 Aliases = NULL;
5493 NumAliases = 0;
5494 }
5495 virtual bool validateAsmConstraint(const char *&Name,
5496 TargetInfo::ConstraintInfo &Info) const {
5497 return false;
5498 }
5499};
5500
5501const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
5502#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5503#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5504 ALL_LANGUAGES },
5505#include "clang/Basic/BuiltinsXCore.def"
5506};
5507} // end anonymous namespace.
5508
Ivan Krasindd7403e2011-08-24 20:22:22 +00005509
Chris Lattner5ba61f02006-10-14 07:39:34 +00005510//===----------------------------------------------------------------------===//
5511// Driver code
5512//===----------------------------------------------------------------------===//
5513
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005514static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00005515 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00005516
Daniel Dunbar52322032009-08-18 05:47:58 +00005517 switch (Triple.getArch()) {
5518 default:
5519 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00005520
Robert Lytton0e076492013-08-13 09:43:10 +00005521 case llvm::Triple::xcore:
5522 return new XCoreTargetInfo(Triple);
5523
Tony Linthicum76329bf2011-12-12 21:14:55 +00005524 case llvm::Triple::hexagon:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005525 return new HexagonTargetInfo(Triple);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005526
Tim Northover9bb857a2013-01-31 12:13:10 +00005527 case llvm::Triple::aarch64:
5528 switch (os) {
5529 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005530 return new LinuxTargetInfo<AArch64TargetInfo>(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005531 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005532 return new AArch64TargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005533 }
5534
Daniel Dunbar52322032009-08-18 05:47:58 +00005535 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00005536 case llvm::Triple::thumb:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005537 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005538 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005539
Daniel Dunbar52322032009-08-18 05:47:58 +00005540 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00005541 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005542 return new LinuxTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005543 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005544 return new FreeBSDTargetInfo<ARMTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005545 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005546 return new NetBSDTargetInfo<ARMTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005547 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005548 return new OpenBSDTargetInfo<ARMTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005549 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005550 return new BitrigTargetInfo<ARMTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005551 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005552 return new RTEMSTargetInfo<ARMTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005553 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005554 return new NaClTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005555 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005556 return new ARMTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005557 }
Eli Friedmanb5366062008-05-20 14:21:01 +00005558
Daniel Dunbar52322032009-08-18 05:47:58 +00005559 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005560 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00005561
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005562 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005563 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005564 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005565 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005566 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005567 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005568 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005569 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005570 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005571 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005572 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005573 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005574 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005575
5576 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005577 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005578 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005579 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005580 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005581 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005582 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005583 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005584 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005585 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00005586 case llvm::Triple::NaCl:
5587 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005588 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005589 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005590 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005591
Akira Hatanakabef17452011-09-20 19:21:49 +00005592 case llvm::Triple::mips64:
5593 switch (os) {
5594 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005595 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005596 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005597 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005598 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005599 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005600 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005601 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005602 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005603 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005604 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005605 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005606 }
5607
5608 case llvm::Triple::mips64el:
5609 switch (os) {
5610 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005611 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005612 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005613 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005614 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005615 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005616 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005617 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005618 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005619 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005620 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005621 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005622 }
5623
Ivan Krasindd7403e2011-08-24 20:22:22 +00005624 case llvm::Triple::le32:
5625 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00005626 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005627 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00005628 default:
5629 return NULL;
5630 }
5631
Daniel Dunbar52322032009-08-18 05:47:58 +00005632 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005633 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005634 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005635 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005636 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005637 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005638 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005639 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005640 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005641 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005642 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005643 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005644 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005645 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005646 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005647 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005648 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005649
5650 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005651 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005652 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005653 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005654 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005655 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005656 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005657 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005658 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005659 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005660 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005661 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005662 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005663 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005664 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005665
Bill Schmidt778d3872013-07-26 01:36:11 +00005666 case llvm::Triple::ppc64le:
5667 switch (os) {
5668 case llvm::Triple::Linux:
5669 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
5670 default:
5671 return new PPC64TargetInfo(Triple);
5672 }
5673
Peter Collingbournec947aae2012-05-20 23:28:41 +00005674 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005675 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005676 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005677 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005678
Eli Friedmand13b41e2012-10-12 23:32:00 +00005679 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005680 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00005681
Daniel Dunbar52322032009-08-18 05:47:58 +00005682 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005683 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005684 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005685 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005686 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005687 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005688 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005689 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005690 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005691 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005692 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005693 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005694 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005695 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005696 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005697 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005698 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005699
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005700 case llvm::Triple::sparcv9:
5701 switch (os) {
5702 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005703 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005704 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005705 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005706 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005707 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005708 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005709 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005710 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005711 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005712 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005713 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005714 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005715 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005716 }
5717
Ulrich Weigand47445072013-05-06 16:26:41 +00005718 case llvm::Triple::systemz:
5719 switch (os) {
5720 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005721 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005722 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005723 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005724 }
5725
Eli Friedmana9c3d712009-08-19 20:47:07 +00005726 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005727 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00005728
Daniel Dunbar52322032009-08-18 05:47:58 +00005729 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005730 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005731 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005732
Daniel Dunbar52322032009-08-18 05:47:58 +00005733 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005734 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005735 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005736 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005737 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005738 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005739 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005740 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005741 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005742 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005743 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005744 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005745 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005746 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005747 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005748 case llvm::Triple::KFreeBSD:
5749 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005750 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005751 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005752 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005753 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005754 case llvm::Triple::Cygwin:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005755 return new CygwinX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005756 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005757 return new MinGWX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005758 case llvm::Triple::Win32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005759 return new VisualStudioWindowsX86_32TargetInfo(Triple);
Chris Lattnerb986aba2010-04-11 19:29:39 +00005760 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005761 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005762 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005763 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005764 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005765 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005766 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005767 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005768 }
5769
5770 case llvm::Triple::x86_64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005771 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005772 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005773
Daniel Dunbar52322032009-08-18 05:47:58 +00005774 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005775 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005776 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005777 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005778 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00005779 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005780 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005781 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005782 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005783 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005784 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005785 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005786 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005787 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005788 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005789 case llvm::Triple::KFreeBSD:
5790 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005791 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005792 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00005793 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005794 return new MinGWX86_64TargetInfo(Triple);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00005795 case llvm::Triple::Win32: // This is what Triple.h supports now.
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005796 return new VisualStudioWindowsX86_64TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005797 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005798 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005799 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005800 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005801 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005802
5803 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005804 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005805 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005806 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005807 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005808 }
5809 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005810 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005811 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005812 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005813 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005814 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005815 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00005816}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005817
5818/// CreateTargetInfo - Return the target info object for the specified target
5819/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00005820TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregorf8715de2012-11-16 04:24:59 +00005821 TargetOptions *Opts) {
5822 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005823
5824 // Construct the target
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005825 OwningPtr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005826 if (!Target) {
5827 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5828 return 0;
5829 }
Douglas Gregorbc10b9f2012-10-15 16:45:32 +00005830 Target->setTargetOpts(Opts);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005831
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005832 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005833 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5834 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005835 return 0;
5836 }
5837
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005838 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005839 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5840 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005841 return 0;
5842 }
5843
Charles Davis95a546e2010-06-11 01:06:47 +00005844 // Set the target C++ ABI.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005845 if (!Opts->CXXABI.empty() && !Target->setCXXABI(Opts->CXXABI)) {
5846 Diags.Report(diag::err_target_unknown_cxxabi) << Opts->CXXABI;
Charles Davis95a546e2010-06-11 01:06:47 +00005847 return 0;
5848 }
5849
Rafael Espindolaeb265472013-08-21 21:59:03 +00005850 // Set the fp math unit.
5851 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
5852 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
5853 return 0;
5854 }
5855
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005856 // Compute the default target features, we need the target to handle this
5857 // because features may have dependencies on one another.
5858 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005859 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005860
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005861 // Apply the user specified deltas.
5862 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
5863 I < N; ++I) {
5864 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00005865 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005866 bool Enabled = Name[0] == '+';
5867 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005868 }
5869
5870 // Add the features to the compile options.
5871 //
5872 // FIXME: If we are completely confident that we have the right set, we only
5873 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005874 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005875 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5876 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00005877 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00005878 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Rafael Espindolaeb265472013-08-21 21:59:03 +00005879 return 0;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005880
5881 return Target.take();
5882}