blob: d6980909d564272340d76d539412858c08ac5f87 [file] [log] [blame]
Chris Lattner5ba61f02006-10-14 07:39:34 +00001//===--- Targets.cpp - Implement -arch option and targets -----------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000022#include "llvm/ADT/APFloat.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000023#include "llvm/ADT/OwningPtr.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000028#include "llvm/IR/Type.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
Chris Lattner5ba61f02006-10-14 07:39:34 +000032using namespace clang;
33
Chris Lattner5ba61f02006-10-14 07:39:34 +000034//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000035// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000036//===----------------------------------------------------------------------===//
37
Chris Lattner1e1c0b92009-03-20 16:06:38 +000038/// DefineStd - Define a macro name and standard variants. For example if
39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000041static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000042 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000044
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46 // in the user's namespace.
47 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000048 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055}
56
Benjamin Kramere3b442d2012-01-10 11:50:09 +000057static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58 bool Tuning = true) {
59 Builder.defineMacro("__" + CPUName);
60 Builder.defineMacro("__" + CPUName + "__");
61 if (Tuning)
62 Builder.defineMacro("__tune_" + CPUName + "__");
63}
64
Chris Lattner09d98f52008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000068
Torok Edwinb2b37c62009-06-30 17:10:35 +000069namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000072protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000074 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000075public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000076 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Torok Edwinb2b37c62009-06-30 17:10:35 +000077 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000078 MacroBuilder &Builder) const {
79 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000081 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000082
83};
Chris Lattner859c37a2009-08-12 06:24:27 +000084} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000085
Chris Lattner30ba6742009-08-10 19:03:04 +000086
Daniel Dunbard86666f2010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000091 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000092 Builder.defineMacro("__APPLE__");
93 Builder.defineMacro("__MACH__");
94 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000095 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
Will Dietzf54319c2013-01-18 11:30:38 +000097 if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000098
John McCall5d36a8c2011-06-16 00:03:19 +000099 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000100 // __weak is always defined, for use in blocks and with objc pointers.
101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000102
John McCall31168b02011-06-15 23:02:42 +0000103 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000104 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
106 else
107 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000108
John McCall31168b02011-06-15 23:02:42 +0000109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
110 // allow this in C, since one might have block pointers in structs that
111 // are used in pure C code and in Objective-C ARC.
112 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000113 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000114
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000115 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000116 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000117 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000119
120 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000121 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000122
Daniel Dunbarecf13562011-04-19 21:40:34 +0000123 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000124 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000125 if (Triple.isMacOSX()) {
126 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000127 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000129 Triple.getOSVersion(Maj, Min, Rev);
130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000131 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000132
Sebastian Pop422377c2012-01-20 22:01:23 +0000133 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000134 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
136 if (PlatformName == "win32") {
137 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138 return;
139 }
140
Jim Grosbache2bfac42013-11-19 20:18:39 +0000141 // If there's an environment specified in the triple, that means we're dealing
142 // with an embedded variant of some sort and don't want the platform
143 // version-min defines, so only add them if there's not one.
144 if (Triple.getEnvironmentName().empty()) {
145 // Set the appropriate OS version define.
146 if (Triple.isiOS()) {
147 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
148 char Str[6];
149 Str[0] = '0' + Maj;
150 Str[1] = '0' + (Min / 10);
151 Str[2] = '0' + (Min % 10);
152 Str[3] = '0' + (Rev / 10);
153 Str[4] = '0' + (Rev % 10);
154 Str[5] = '\0';
155 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
156 Str);
157 } else {
158 // Note that the Driver allows versions which aren't representable in the
159 // define (because we only get a single digit for the minor and micro
160 // revision numbers). So, we limit them to the maximum representable
161 // version.
162 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
163 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
164 char Str[5];
165 Str[0] = '0' + (Maj / 10);
166 Str[1] = '0' + (Maj % 10);
167 Str[2] = '0' + std::min(Min, 9U);
168 Str[3] = '0' + std::min(Rev, 9U);
169 Str[4] = '\0';
170 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
171 }
Daniel Dunbar497ff132009-04-10 19:52:24 +0000172 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000173
174 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000175}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000176
Chris Lattner30ba6742009-08-10 19:03:04 +0000177namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000178template<typename Target>
179class DarwinTargetInfo : public OSTargetInfo<Target> {
180protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000181 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000182 MacroBuilder &Builder) const {
Eric Christopher0c912c52011-07-07 22:55:26 +0000183 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000184 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000185 }
Mike Stump11289f42009-09-09 15:08:12 +0000186
Torok Edwinb2b37c62009-06-30 17:10:35 +0000187public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000188 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
189 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
190 this->MCountName = "\01mcount";
191 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000192
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000193 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner30ba6742009-08-10 19:03:04 +0000194 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000195 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000196 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000197 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000198 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000199 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000200 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000201
Anders Carlsson851318a2010-06-08 22:47:50 +0000202 virtual const char *getStaticInitSectionSpecifier() const {
203 // FIXME: We should return 0 when building kexts.
204 return "__TEXT,__StaticInit,regular,pure_instructions";
205 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000206
John McCalleed64c72012-01-29 01:20:30 +0000207 /// Darwin does not support protected visibility. Darwin's "default"
208 /// is very similar to ELF's "protected"; Darwin requires a "weak"
209 /// attribute on declarations that can be dynamically replaced.
210 virtual bool hasProtectedVisibility() const {
211 return false;
212 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000213};
214
Chris Lattner30ba6742009-08-10 19:03:04 +0000215
Torok Edwinb2b37c62009-06-30 17:10:35 +0000216// DragonFlyBSD Target
217template<typename Target>
218class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
219protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000220 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000221 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000223 Builder.defineMacro("__DragonFly__");
224 Builder.defineMacro("__DragonFly_cc_version", "100001");
225 Builder.defineMacro("__ELF__");
226 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
227 Builder.defineMacro("__tune_i386__");
228 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000229 }
230public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000231 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
232 : OSTargetInfo<Target>(Triple) {
233 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000234
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000235 switch (Triple.getArch()) {
236 default:
237 case llvm::Triple::x86:
238 case llvm::Triple::x86_64:
239 this->MCountName = ".mcount";
240 break;
241 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000242 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243};
244
245// FreeBSD Target
246template<typename Target>
247class FreeBSDTargetInfo : public OSTargetInfo<Target> {
248protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000249 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000250 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000251 // FreeBSD defines; list based off of gcc output
252
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000253 unsigned Release = Triple.getOSMajorVersion();
254 if (Release == 0U)
255 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000256
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000257 Builder.defineMacro("__FreeBSD__", Twine(Release));
258 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000259 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
260 DefineStd(Builder, "unix", Opts);
261 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000262
263 // On FreeBSD, wchar_t contains the number of the code point as
264 // used by the character set of the locale. These character sets are
265 // not necessarily a superset of ASCII.
266 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000267 }
268public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000269 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
270 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000271
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000272 switch (Triple.getArch()) {
273 default:
274 case llvm::Triple::x86:
275 case llvm::Triple::x86_64:
276 this->MCountName = ".mcount";
277 break;
278 case llvm::Triple::mips:
279 case llvm::Triple::mipsel:
280 case llvm::Triple::ppc:
281 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000282 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000283 this->MCountName = "_mcount";
284 break;
285 case llvm::Triple::arm:
286 this->MCountName = "__mcount";
287 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000288 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000289 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000290};
291
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000292// GNU/kFreeBSD Target
293template<typename Target>
294class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
295protected:
296 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
297 MacroBuilder &Builder) const {
298 // GNU/kFreeBSD defines; list based off of gcc output
299
300 DefineStd(Builder, "unix", Opts);
301 Builder.defineMacro("__FreeBSD_kernel__");
302 Builder.defineMacro("__GLIBC__");
303 Builder.defineMacro("__ELF__");
304 if (Opts.POSIXThreads)
305 Builder.defineMacro("_REENTRANT");
306 if (Opts.CPlusPlus)
307 Builder.defineMacro("_GNU_SOURCE");
308 }
309public:
Sylvestre Ledru15832282013-09-05 13:58:07 +0000310 KFreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000311 this->UserLabelPrefix = "";
312 }
313};
314
Chris Lattner3e2ee142010-07-07 16:01:42 +0000315// Minix Target
316template<typename Target>
317class MinixTargetInfo : public OSTargetInfo<Target> {
318protected:
319 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
320 MacroBuilder &Builder) const {
321 // Minix defines
322
323 Builder.defineMacro("__minix", "3");
324 Builder.defineMacro("_EM_WSIZE", "4");
325 Builder.defineMacro("_EM_PSIZE", "4");
326 Builder.defineMacro("_EM_SSIZE", "2");
327 Builder.defineMacro("_EM_LSIZE", "4");
328 Builder.defineMacro("_EM_FSIZE", "4");
329 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000330 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000331 DefineStd(Builder, "unix", Opts);
332 }
333public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000334 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
335 this->UserLabelPrefix = "";
336 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000337};
338
Torok Edwinb2b37c62009-06-30 17:10:35 +0000339// Linux target
340template<typename Target>
341class LinuxTargetInfo : public OSTargetInfo<Target> {
342protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000343 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000344 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000345 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000346 DefineStd(Builder, "unix", Opts);
347 DefineStd(Builder, "linux", Opts);
348 Builder.defineMacro("__gnu_linux__");
349 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000350 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000351 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000352 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000353 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000354 if (Opts.CPlusPlus)
355 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000356 }
357public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000358 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000360 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000361 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000362
363 virtual const char *getStaticInitSectionSpecifier() const {
364 return ".text.startup";
365 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000366};
367
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000368// NetBSD Target
369template<typename Target>
370class NetBSDTargetInfo : public OSTargetInfo<Target> {
371protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000372 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000373 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000374 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000375 Builder.defineMacro("__NetBSD__");
376 Builder.defineMacro("__unix__");
377 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000378 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000379 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000380 }
381public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000382 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
383 this->UserLabelPrefix = "";
384 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000385};
386
Torok Edwinb2b37c62009-06-30 17:10:35 +0000387// OpenBSD Target
388template<typename Target>
389class OpenBSDTargetInfo : public OSTargetInfo<Target> {
390protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000391 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000392 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000393 // OpenBSD defines; list based off of gcc output
394
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000395 Builder.defineMacro("__OpenBSD__");
396 DefineStd(Builder, "unix", Opts);
397 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000398 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000399 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000400 }
401public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000402 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
403 this->UserLabelPrefix = "";
404 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000405
Eli Friedman3715d1f2011-12-15 02:15:56 +0000406 switch (Triple.getArch()) {
407 default:
408 case llvm::Triple::x86:
409 case llvm::Triple::x86_64:
410 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000411 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000412 this->MCountName = "__mcount";
413 break;
414 case llvm::Triple::mips64:
415 case llvm::Triple::mips64el:
416 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000417 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000418 this->MCountName = "_mcount";
419 break;
420 }
421 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000422};
423
Eli Friedman9fa28852012-08-08 23:57:20 +0000424// Bitrig Target
425template<typename Target>
426class BitrigTargetInfo : public OSTargetInfo<Target> {
427protected:
428 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
429 MacroBuilder &Builder) const {
430 // Bitrig defines; list based off of gcc output
431
432 Builder.defineMacro("__Bitrig__");
433 DefineStd(Builder, "unix", Opts);
434 Builder.defineMacro("__ELF__");
435 if (Opts.POSIXThreads)
436 Builder.defineMacro("_REENTRANT");
437 }
438public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000439 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
440 this->UserLabelPrefix = "";
441 this->TLSSupported = false;
442 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000443 }
444};
445
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000446// PSP Target
447template<typename Target>
448class PSPTargetInfo : public OSTargetInfo<Target> {
449protected:
450 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000451 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000452 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000453 Builder.defineMacro("PSP");
454 Builder.defineMacro("_PSP");
455 Builder.defineMacro("__psp__");
456 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000457 }
458public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000459 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000460 this->UserLabelPrefix = "";
461 }
462};
463
John Thompsone467e192009-11-19 17:18:50 +0000464// PS3 PPU Target
465template<typename Target>
466class PS3PPUTargetInfo : public OSTargetInfo<Target> {
467protected:
468 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000469 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000470 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000471 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000472 Builder.defineMacro("__PPU__");
473 Builder.defineMacro("__CELLOS_LV2__");
474 Builder.defineMacro("__ELF__");
475 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000476 Builder.defineMacro("_ARCH_PPC64");
477 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000478 }
479public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000480 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000481 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000482 this->LongWidth = this->LongAlign = 32;
483 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000484 this->IntMaxType = TargetInfo::SignedLongLong;
485 this->UIntMaxType = TargetInfo::UnsignedLongLong;
486 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000487 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindola12256302013-12-17 15:40:00 +0000488 this->DescriptionString = "E-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000489 }
490};
491
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000492// AuroraUX target
493template<typename Target>
494class AuroraUXTargetInfo : public OSTargetInfo<Target> {
495protected:
496 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000497 MacroBuilder &Builder) const {
498 DefineStd(Builder, "sun", Opts);
499 DefineStd(Builder, "unix", Opts);
500 Builder.defineMacro("__ELF__");
501 Builder.defineMacro("__svr4__");
502 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000503 }
504public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000505 AuroraUXTargetInfo(const llvm::Triple &Triple)
506 : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000507 this->UserLabelPrefix = "";
508 this->WCharType = this->SignedLong;
509 // FIXME: WIntType should be SignedLong
510 }
511};
512
Torok Edwinb2b37c62009-06-30 17:10:35 +0000513// Solaris target
514template<typename Target>
515class SolarisTargetInfo : public OSTargetInfo<Target> {
516protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000517 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000518 MacroBuilder &Builder) const {
519 DefineStd(Builder, "sun", Opts);
520 DefineStd(Builder, "unix", Opts);
521 Builder.defineMacro("__ELF__");
522 Builder.defineMacro("__svr4__");
523 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000524 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
525 // newer, but to 500 for everything else. feature_test.h has a check to
526 // ensure that you are not using C99 with an old version of X/Open or C89
527 // with a new version.
528 if (Opts.C99 || Opts.C11)
529 Builder.defineMacro("_XOPEN_SOURCE", "600");
530 else
531 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000532 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000533 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000534 Builder.defineMacro("_LARGEFILE_SOURCE");
535 Builder.defineMacro("_LARGEFILE64_SOURCE");
536 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000537 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000538 }
539public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000540 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000541 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000542 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000543 // FIXME: WIntType should be SignedLong
544 }
545};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000546
547// Windows target
548template<typename Target>
549class WindowsTargetInfo : public OSTargetInfo<Target> {
550protected:
551 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
552 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000553 Builder.defineMacro("_WIN32");
554 }
555 void getVisualStudioDefines(const LangOptions &Opts,
556 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000557 if (Opts.CPlusPlus) {
558 if (Opts.RTTI)
559 Builder.defineMacro("_CPPRTTI");
560
561 if (Opts.Exceptions)
562 Builder.defineMacro("_CPPUNWIND");
563 }
564
565 if (!Opts.CharIsSigned)
566 Builder.defineMacro("_CHAR_UNSIGNED");
567
568 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
569 // but it works for now.
570 if (Opts.POSIXThreads)
571 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000572
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000573 if (Opts.MSCVersion != 0)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000574 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000575
Francois Pichet0706d202011-09-17 17:15:52 +0000576 if (Opts.MicrosoftExt) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000577 Builder.defineMacro("_MSC_EXTENSIONS");
578
Richard Smith2bf7fdb2013-01-02 11:42:31 +0000579 if (Opts.CPlusPlus11) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000580 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
581 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
582 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
583 }
584 }
585
586 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000587 }
588
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000589public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000590 WindowsTargetInfo(const llvm::Triple &Triple)
591 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000592};
593
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000594template <typename Target>
595class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000596protected:
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000597 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
598 MacroBuilder &Builder) const {
599 if (Opts.POSIXThreads)
600 Builder.defineMacro("_REENTRANT");
601 if (Opts.CPlusPlus)
602 Builder.defineMacro("_GNU_SOURCE");
603
604 DefineStd(Builder, "unix", Opts);
605 Builder.defineMacro("__ELF__");
606 Builder.defineMacro("__native_client__");
607 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000608
609public:
610 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000611 this->UserLabelPrefix = "";
612 this->LongAlign = 32;
613 this->LongWidth = 32;
614 this->PointerAlign = 32;
615 this->PointerWidth = 32;
616 this->IntMaxType = TargetInfo::SignedLongLong;
617 this->UIntMaxType = TargetInfo::UnsignedLongLong;
618 this->Int64Type = TargetInfo::SignedLongLong;
619 this->DoubleAlign = 64;
620 this->LongDoubleWidth = 64;
621 this->LongDoubleAlign = 64;
622 this->SizeType = TargetInfo::UnsignedInt;
623 this->PtrDiffType = TargetInfo::SignedInt;
624 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000625 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000626 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000627 if (Triple.getArch() == llvm::Triple::arm) {
628 this->DescriptionString = "e-p:32:32-i64:64-v128:64:128-n32-S128";
629 } else if (Triple.getArch() == llvm::Triple::x86) {
630 this->DescriptionString = "e-p:32:32-i64:64-n8:16:32-S128";
631 } else if (Triple.getArch() == llvm::Triple::x86_64) {
632 this->DescriptionString = "e-p:32:32-i64:64-s:64-n8:16:32:64-S128";
633 } else if (Triple.getArch() == llvm::Triple::mipsel) {
634 // Handled on mips' setDescriptionString.
635 } else {
636 assert(Triple.getArch() == llvm::Triple::le32);
637 this->DescriptionString = "e-p:32:32-i64:64";
638 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000639 }
Derek Schuffa2020962012-10-16 22:30:41 +0000640 virtual typename Target::CallingConvCheckResult checkCallingConvention(
641 CallingConv CC) const {
642 return CC == CC_PnaclCall ? Target::CCCR_OK :
643 Target::checkCallingConvention(CC);
644 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000645};
Mike Stump11289f42009-09-09 15:08:12 +0000646} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000647
Chris Lattner09d98f52008-10-05 21:50:58 +0000648//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000649// Specific target implementations.
650//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000651
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000652namespace {
653// PPC abstract base class
654class PPCTargetInfo : public TargetInfo {
655 static const Builtin::Info BuiltinInfo[];
656 static const char * const GCCRegNames[];
657 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000658 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000659
660 // Target cpu features.
661 bool HasVSX;
662
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000663public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000664 PPCTargetInfo(const llvm::Triple &Triple)
665 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000666 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000667 LongDoubleWidth = LongDoubleAlign = 128;
668 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
669 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000670
Hal Finkel6b984f02012-07-03 16:51:04 +0000671 /// \brief Flags for architecture specific defines.
672 typedef enum {
673 ArchDefineNone = 0,
674 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
675 ArchDefinePpcgr = 1 << 1,
676 ArchDefinePpcsq = 1 << 2,
677 ArchDefine440 = 1 << 3,
678 ArchDefine603 = 1 << 4,
679 ArchDefine604 = 1 << 5,
680 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000681 ArchDefinePwr5 = 1 << 7,
682 ArchDefinePwr5x = 1 << 8,
683 ArchDefinePwr6 = 1 << 9,
684 ArchDefinePwr6x = 1 << 10,
685 ArchDefinePwr7 = 1 << 11,
686 ArchDefineA2 = 1 << 12,
687 ArchDefineA2q = 1 << 13
Hal Finkel6b984f02012-07-03 16:51:04 +0000688 } ArchDefineTypes;
689
Bill Schmidt38378a02013-02-01 20:23:10 +0000690 // Note: GCC recognizes the following additional cpus:
691 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
692 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
693 // titan, rs64.
Hal Finkel8eb59282012-06-11 22:35:19 +0000694 virtual bool setCPU(const std::string &Name) {
695 bool CPUKnown = llvm::StringSwitch<bool>(Name)
696 .Case("generic", true)
697 .Case("440", true)
698 .Case("450", true)
699 .Case("601", true)
700 .Case("602", true)
701 .Case("603", true)
702 .Case("603e", true)
703 .Case("603ev", true)
704 .Case("604", true)
705 .Case("604e", true)
706 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000707 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000708 .Case("g3", true)
709 .Case("7400", true)
710 .Case("g4", true)
711 .Case("7450", true)
712 .Case("g4+", true)
713 .Case("750", true)
714 .Case("970", true)
715 .Case("g5", true)
716 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000717 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000718 .Case("e500mc", true)
719 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000720 .Case("power3", true)
721 .Case("pwr3", true)
722 .Case("power4", true)
723 .Case("pwr4", true)
724 .Case("power5", true)
725 .Case("pwr5", true)
726 .Case("power5x", true)
727 .Case("pwr5x", true)
728 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000729 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000730 .Case("power6x", true)
731 .Case("pwr6x", true)
732 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000733 .Case("pwr7", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000734 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000735 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000736 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000737 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000738 .Case("powerpc64le", true)
739 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000740 .Default(false);
741
742 if (CPUKnown)
743 CPU = Name;
744
745 return CPUKnown;
746 }
747
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000748 virtual void getTargetBuiltins(const Builtin::Info *&Records,
749 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000750 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000751 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000752 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000753
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000754 virtual bool isCLZForZeroUndef() const { return false; }
755
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000756 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000757 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000758
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000759 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
760
Eric Christopher3ff21b32013-10-16 21:26:26 +0000761 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000762 DiagnosticsEngine &Diags);
Douglas Gregor0070c0b2012-01-30 06:38:25 +0000763 virtual bool hasFeature(StringRef Feature) const;
764
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000765 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000766 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000767 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000768 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000769 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000770 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000771 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000772 default: return false;
773 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000774 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000775 case 'b': // Base register
776 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000777 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000778 break;
779 // FIXME: The following are added to allow parsing.
780 // I just took a guess at what the actions should be.
781 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000782 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000783 case 'v': // Altivec vector register
784 Info.setAllowsRegister();
785 break;
786 case 'w':
787 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000788 case 'd':// VSX vector register to hold vector double data
789 case 'f':// VSX vector register to hold vector float data
790 case 's':// VSX vector register to hold scalar float data
791 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000792 break;
793 default:
794 return false;
795 }
796 Info.setAllowsRegister();
797 Name++; // Skip over 'w'.
798 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000799 case 'h': // `MQ', `CTR', or `LINK' register
800 case 'q': // `MQ' register
801 case 'c': // `CTR' register
802 case 'l': // `LINK' register
803 case 'x': // `CR' register (condition register) number 0
804 case 'y': // `CR' register (condition register)
805 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000806 Info.setAllowsRegister();
807 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000808 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000809 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000810 // (use `L' instead for SImode constants)
811 case 'K': // Unsigned 16-bit constant
812 case 'L': // Signed 16-bit constant shifted left 16 bits
813 case 'M': // Constant larger than 31
814 case 'N': // Exact power of 2
815 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000816 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000817 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000818 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000819 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000820 break;
821 case 'm': // Memory operand. Note that on PowerPC targets, m can
822 // include addresses that update the base register. It
823 // is therefore only safe to use `m' in an asm statement
824 // if that asm statement accesses the operand exactly once.
825 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000826 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000827 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000828 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000829 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000830 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
831 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000832 // register to be updated.
833 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000834 if (Name[1] != 's')
835 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000836 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000837 // include any automodification of the base register. Unlike
838 // `m', this constraint can be used in asm statements that
839 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000840 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000841 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000842 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000843 break;
844 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000845 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000846 case 'Z': // Memory operand that is an indexed or indirect from a
847 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000848 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000849 Info.setAllowsMemory();
850 Info.setAllowsRegister();
851 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000852 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000853 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000854 // register (`p' is preferable for asm statements)
855 case 'S': // Constant suitable as a 64-bit mask operand
856 case 'T': // Constant suitable as a 32-bit mask operand
857 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000858 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000859 // instructions
860 case 'W': // Vector constant that does not require memory
861 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000862 break;
863 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000864 }
John Thompson07a61a42010-06-24 22:44:13 +0000865 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000866 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000867 virtual const char *getClobbers() const {
868 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000869 }
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000870 int getEHDataRegisterNumber(unsigned RegNo) const {
871 if (RegNo == 0) return 3;
872 if (RegNo == 1) return 4;
873 return -1;
874 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000875};
Anders Carlssonf511f642007-11-27 04:11:28 +0000876
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000877const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000878#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000879#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000880 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000881#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000882};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000883
Eric Christopher3ff21b32013-10-16 21:26:26 +0000884 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000885/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000886bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000887 DiagnosticsEngine &Diags) {
888 // Remember the maximum enabled sselevel.
889 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
890 // Ignore disabled features.
891 if (Features[i][0] == '-')
892 continue;
893
894 StringRef Feature = StringRef(Features[i]).substr(1);
895
896 if (Feature == "vsx") {
897 HasVSX = true;
898 continue;
899 }
900
901 // TODO: Finish this list and add an assert that we've handled them
902 // all.
903 }
904
905 return true;
906}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000907
Chris Lattnerecd49032009-03-02 22:27:17 +0000908/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
909/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000910void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000911 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000912 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000913 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000914 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000915 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000916 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000917 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000918 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000919 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000920 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000921 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000922 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000923 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000924
Chris Lattnerecd49032009-03-02 22:27:17 +0000925 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000926 if (getTriple().getArch() == llvm::Triple::ppc64le) {
927 Builder.defineMacro("_LITTLE_ENDIAN");
928 Builder.defineMacro("__LITTLE_ENDIAN__");
929 } else {
930 if (getTriple().getOS() != llvm::Triple::NetBSD &&
931 getTriple().getOS() != llvm::Triple::OpenBSD)
932 Builder.defineMacro("_BIG_ENDIAN");
933 Builder.defineMacro("__BIG_ENDIAN__");
934 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000935
Chris Lattnerecd49032009-03-02 22:27:17 +0000936 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000937 Builder.defineMacro("__NATURAL_ALIGNMENT__");
938 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000939
Chris Lattnerecd49032009-03-02 22:27:17 +0000940 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000941 if (LongDoubleWidth == 128)
942 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000943
John Thompsone467e192009-11-19 17:18:50 +0000944 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000945 Builder.defineMacro("__VEC__", "10206");
946 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000947 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000948
949 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000950 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
951 .Case("440", ArchDefineName)
952 .Case("450", ArchDefineName | ArchDefine440)
953 .Case("601", ArchDefineName)
954 .Case("602", ArchDefineName | ArchDefinePpcgr)
955 .Case("603", ArchDefineName | ArchDefinePpcgr)
956 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
957 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
958 .Case("604", ArchDefineName | ArchDefinePpcgr)
959 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
960 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +0000961 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +0000962 .Case("7400", ArchDefineName | ArchDefinePpcgr)
963 .Case("7450", ArchDefineName | ArchDefinePpcgr)
964 .Case("750", ArchDefineName | ArchDefinePpcgr)
965 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
966 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000967 .Case("a2", ArchDefineA2)
968 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +0000969 .Case("pwr3", ArchDefinePpcgr)
970 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
971 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
972 | ArchDefinePpcsq)
973 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
974 | ArchDefinePpcgr | ArchDefinePpcsq)
975 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
976 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
977 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
978 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
979 | ArchDefinePpcsq)
980 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
981 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
982 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
983 .Case("power3", ArchDefinePpcgr)
984 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
985 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
986 | ArchDefinePpcsq)
987 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
988 | ArchDefinePpcgr | ArchDefinePpcsq)
989 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
990 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
991 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
992 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
993 | ArchDefinePpcsq)
994 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
995 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
996 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +0000997 .Default(ArchDefineNone);
998
999 if (defs & ArchDefineName)
1000 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1001 if (defs & ArchDefinePpcgr)
1002 Builder.defineMacro("_ARCH_PPCGR");
1003 if (defs & ArchDefinePpcsq)
1004 Builder.defineMacro("_ARCH_PPCSQ");
1005 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001006 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001007 if (defs & ArchDefine603)
1008 Builder.defineMacro("_ARCH_603");
1009 if (defs & ArchDefine604)
1010 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001011 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001012 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001013 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001014 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001015 if (defs & ArchDefinePwr5x)
1016 Builder.defineMacro("_ARCH_PWR5X");
1017 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001018 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001019 if (defs & ArchDefinePwr6x)
1020 Builder.defineMacro("_ARCH_PWR6X");
1021 if (defs & ArchDefinePwr7)
1022 Builder.defineMacro("_ARCH_PWR7");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001023 if (defs & ArchDefineA2)
1024 Builder.defineMacro("_ARCH_A2");
1025 if (defs & ArchDefineA2q) {
1026 Builder.defineMacro("_ARCH_A2Q");
1027 Builder.defineMacro("_ARCH_QP");
1028 }
1029
1030 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1031 Builder.defineMacro("__bg__");
1032 Builder.defineMacro("__THW_BLUEGENE__");
1033 Builder.defineMacro("__bgq__");
1034 Builder.defineMacro("__TOS_BGQ__");
1035 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001036
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001037 if (HasVSX)
1038 Builder.defineMacro("__VSX__");
1039
Bill Schmidt38378a02013-02-01 20:23:10 +00001040 // FIXME: The following are not yet generated here by Clang, but are
1041 // generated by GCC:
1042 //
1043 // _SOFT_FLOAT_
1044 // __RECIP_PRECISION__
1045 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001046 // __RECIP__
1047 // __RECIPF__
1048 // __RSQRTE__
1049 // __RSQRTEF__
1050 // _SOFT_DOUBLE_
1051 // __NO_LWSYNC__
1052 // __HAVE_BSWAP__
1053 // __LONGDOUBLE128
1054 // __CMODEL_MEDIUM__
1055 // __CMODEL_LARGE__
1056 // _CALL_SYSV
1057 // _CALL_DARWIN
1058 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001059}
1060
1061void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1062 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1063 .Case("7400", true)
1064 .Case("g4", true)
1065 .Case("7450", true)
1066 .Case("g4+", true)
1067 .Case("970", true)
1068 .Case("g5", true)
1069 .Case("pwr6", true)
1070 .Case("pwr7", true)
1071 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001072 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001073 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001074
1075 Features["qpx"] = (CPU == "a2q");
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001076}
1077
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001078bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1079 return Feature == "powerpc";
1080}
Chris Lattner17df24e2008-04-21 18:56:49 +00001081
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001082
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001083const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001084 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1085 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1086 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1087 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1088 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1089 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1090 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1091 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001092 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001093 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001094 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001095 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1096 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1097 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1098 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001099 "vrsave", "vscr",
1100 "spe_acc", "spefscr",
1101 "sfp"
1102};
Chris Lattner10a5b382007-01-29 05:24:35 +00001103
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001104void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001105 unsigned &NumNames) const {
1106 Names = GCCRegNames;
1107 NumNames = llvm::array_lengthof(GCCRegNames);
1108}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001109
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001110const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1111 // While some of these aliases do map to different registers
1112 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001113 { { "0" }, "r0" },
1114 { { "1"}, "r1" },
1115 { { "2" }, "r2" },
1116 { { "3" }, "r3" },
1117 { { "4" }, "r4" },
1118 { { "5" }, "r5" },
1119 { { "6" }, "r6" },
1120 { { "7" }, "r7" },
1121 { { "8" }, "r8" },
1122 { { "9" }, "r9" },
1123 { { "10" }, "r10" },
1124 { { "11" }, "r11" },
1125 { { "12" }, "r12" },
1126 { { "13" }, "r13" },
1127 { { "14" }, "r14" },
1128 { { "15" }, "r15" },
1129 { { "16" }, "r16" },
1130 { { "17" }, "r17" },
1131 { { "18" }, "r18" },
1132 { { "19" }, "r19" },
1133 { { "20" }, "r20" },
1134 { { "21" }, "r21" },
1135 { { "22" }, "r22" },
1136 { { "23" }, "r23" },
1137 { { "24" }, "r24" },
1138 { { "25" }, "r25" },
1139 { { "26" }, "r26" },
1140 { { "27" }, "r27" },
1141 { { "28" }, "r28" },
1142 { { "29" }, "r29" },
1143 { { "30" }, "r30" },
1144 { { "31" }, "r31" },
1145 { { "fr0" }, "f0" },
1146 { { "fr1" }, "f1" },
1147 { { "fr2" }, "f2" },
1148 { { "fr3" }, "f3" },
1149 { { "fr4" }, "f4" },
1150 { { "fr5" }, "f5" },
1151 { { "fr6" }, "f6" },
1152 { { "fr7" }, "f7" },
1153 { { "fr8" }, "f8" },
1154 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001155 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001156 { { "fr11" }, "f11" },
1157 { { "fr12" }, "f12" },
1158 { { "fr13" }, "f13" },
1159 { { "fr14" }, "f14" },
1160 { { "fr15" }, "f15" },
1161 { { "fr16" }, "f16" },
1162 { { "fr17" }, "f17" },
1163 { { "fr18" }, "f18" },
1164 { { "fr19" }, "f19" },
1165 { { "fr20" }, "f20" },
1166 { { "fr21" }, "f21" },
1167 { { "fr22" }, "f22" },
1168 { { "fr23" }, "f23" },
1169 { { "fr24" }, "f24" },
1170 { { "fr25" }, "f25" },
1171 { { "fr26" }, "f26" },
1172 { { "fr27" }, "f27" },
1173 { { "fr28" }, "f28" },
1174 { { "fr29" }, "f29" },
1175 { { "fr30" }, "f30" },
1176 { { "fr31" }, "f31" },
1177 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001178};
1179
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001180void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001181 unsigned &NumAliases) const {
1182 Aliases = GCCRegAliases;
1183 NumAliases = llvm::array_lengthof(GCCRegAliases);
1184}
1185} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001186
Chris Lattner5ba61f02006-10-14 07:39:34 +00001187namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001188class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001189public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001190 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindola2da35322013-12-16 23:27:41 +00001191 DescriptionString = "E-p:32:32-"
1192 "i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001193
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001194 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001195 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001196 case llvm::Triple::FreeBSD:
1197 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001198 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001199 PtrDiffType = SignedInt;
1200 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001201 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001202 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001203 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001204 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001205
Roman Divacky3ffe7462012-03-13 19:20:17 +00001206 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1207 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001208 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001209 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001210
1211 // PPC32 supports atomics up to 4 bytes.
1212 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001213 }
1214
Meador Inge5d3fb222012-06-16 03:34:49 +00001215 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Roman Divacky965b0b72011-01-06 08:27:10 +00001216 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001217 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001218 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001219};
1220} // end anonymous namespace.
1221
Bill Schmidt778d3872013-07-26 01:36:11 +00001222// Note: ABI differences may eventually require us to have a separate
1223// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001224namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001225class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001226public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001227 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001228 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001229 IntMaxType = SignedLong;
1230 UIntMaxType = UnsignedLong;
1231 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001232
Roman Divacky3ffe7462012-03-13 19:20:17 +00001233 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1234 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001235 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola47debc02013-12-16 21:59:14 +00001236 DescriptionString = "E-"
Rafael Espindola2da35322013-12-16 23:27:41 +00001237 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00001238 "n32:64";
Bill Schmidtcec4cb12012-10-29 14:59:24 +00001239 } else
Rafael Espindola47debc02013-12-16 21:59:14 +00001240 DescriptionString = "E-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00001241 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00001242 "n32:64";
Benjamin Kramer37196de2012-11-17 17:30:55 +00001243
1244 // PPC64 supports atomics up to 8 bytes.
1245 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001246 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001247 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1248 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001249 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001250};
1251} // end anonymous namespace.
1252
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001253
1254namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001255class DarwinPPC32TargetInfo :
1256 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001257public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001258 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1259 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001260 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001261 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherc04fe092013-10-16 21:19:19 +00001262 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001263 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001264 SuitableAlign = 128;
Rafael Espindola0ea96eb2013-12-18 15:16:50 +00001265 DescriptionString = "E-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001266 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001267 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1268 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001269 }
1270};
1271
1272class DarwinPPC64TargetInfo :
1273 public DarwinTargetInfo<PPC64TargetInfo> {
1274public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001275 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1276 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001277 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001278 SuitableAlign = 128;
Rafael Espindola0ea96eb2013-12-18 15:16:50 +00001279 DescriptionString = "E-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001280 }
1281};
1282} // end anonymous namespace.
1283
Chris Lattner5ba61f02006-10-14 07:39:34 +00001284namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001285 static const unsigned NVPTXAddrSpaceMap[] = {
1286 1, // opencl_global
1287 3, // opencl_local
1288 4, // opencl_constant
1289 1, // cuda_device
1290 4, // cuda_constant
1291 3, // cuda_shared
1292 };
1293 class NVPTXTargetInfo : public TargetInfo {
1294 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001295 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001296 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001297 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001298 BigEndian = false;
1299 TLSSupported = false;
1300 LongWidth = LongAlign = 64;
1301 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001302 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001303 // Define available target features
1304 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001305 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001306 }
1307 virtual void getTargetDefines(const LangOptions &Opts,
1308 MacroBuilder &Builder) const {
1309 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001310 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001311 }
1312 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1313 unsigned &NumRecords) const {
Justin Holewinski83e96682012-05-24 17:43:12 +00001314 Records = BuiltinInfo;
1315 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001316 }
1317 virtual bool hasFeature(StringRef Feature) const {
Justin Holewinski83e96682012-05-24 17:43:12 +00001318 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001319 }
1320
1321 virtual void getGCCRegNames(const char * const *&Names,
1322 unsigned &NumNames) const;
1323 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1324 unsigned &NumAliases) const {
1325 // No aliases.
1326 Aliases = 0;
1327 NumAliases = 0;
1328 }
1329 virtual bool validateAsmConstraint(const char *&Name,
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001330 TargetInfo::ConstraintInfo &Info) const {
1331 switch (*Name) {
1332 default: return false;
1333 case 'c':
1334 case 'h':
1335 case 'r':
1336 case 'l':
1337 case 'f':
1338 case 'd':
1339 Info.setAllowsRegister();
1340 return true;
1341 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001342 }
1343 virtual const char *getClobbers() const {
1344 // FIXME: Is this really right?
1345 return "";
1346 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001347 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001348 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001349 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001350 }
1351 virtual bool setCPU(const std::string &Name) {
Justin Holewinski91203e82013-03-30 14:38:26 +00001352 bool Valid = llvm::StringSwitch<bool>(Name)
1353 .Case("sm_20", true)
1354 .Case("sm_21", true)
1355 .Case("sm_30", true)
1356 .Case("sm_35", true)
1357 .Default(false);
1358
1359 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001360 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001361 };
1362
1363 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1364#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1365#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1366 ALL_LANGUAGES },
1367#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001368 };
1369
1370 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1371 "r0"
1372 };
1373
1374 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1375 unsigned &NumNames) const {
1376 Names = GCCRegNames;
1377 NumNames = llvm::array_lengthof(GCCRegNames);
1378 }
1379
1380 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1381 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001382 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001383 PointerWidth = PointerAlign = 32;
Justin Holewinski83e96682012-05-24 17:43:12 +00001384 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001385 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00001386 = "e-p:32:32-i64:64"
1387 "-v16:16-v32:32-"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001388 "n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001389 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001390 };
1391
1392 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1393 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001394 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001395 PointerWidth = PointerAlign = 64;
Justin Holewinski83e96682012-05-24 17:43:12 +00001396 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001397 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00001398 = "e-i64:64"
1399 "-v16:16-v32:32-"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001400 "n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001401 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001402 };
1403}
1404
1405namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001406
1407static const unsigned R600AddrSpaceMap[] = {
1408 1, // opencl_global
1409 3, // opencl_local
1410 2, // opencl_constant
1411 1, // cuda_device
1412 2, // cuda_constant
1413 3 // cuda_shared
1414};
1415
Tom Stellardc74b1e02013-03-04 17:40:53 +00001416static const char *DescriptionStringR600 =
1417 "e"
Rafael Espindola2da35322013-12-16 23:27:41 +00001418 "-p:32:32"
1419 "-i64:64"
1420 "-v16:16-v24:32-v32:32-v48:64-v96:128"
1421 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048"
Tom Stellardc74b1e02013-03-04 17:40:53 +00001422 "-n32:64";
1423
1424static const char *DescriptionStringR600DoubleOps =
1425 "e"
Rafael Espindola2da35322013-12-16 23:27:41 +00001426 "-p:32:32"
1427 "-i64:64"
1428 "-v16:16-v24:32-v32:32-v48:64-v96:128"
1429 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048"
Tom Stellardc74b1e02013-03-04 17:40:53 +00001430 "-n32:64";
1431
1432static const char *DescriptionStringSI =
1433 "e"
Rafael Espindola9ec8d082013-12-19 16:54:10 +00001434 "-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:32:32-p5:64:64"
Rafael Espindola2da35322013-12-16 23:27:41 +00001435 "-i64:64"
1436 "-v16:16-v24:32-v32:32-v48:64-v96:128"
1437 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048"
Tom Stellardc74b1e02013-03-04 17:40:53 +00001438 "-n32:64";
1439
Eli Friedmand13b41e2012-10-12 23:32:00 +00001440class R600TargetInfo : public TargetInfo {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001441 /// \brief The GPU profiles supported by the R600 target.
1442 enum GPUKind {
1443 GK_NONE,
1444 GK_R600,
1445 GK_R600_DOUBLE_OPS,
1446 GK_R700,
1447 GK_R700_DOUBLE_OPS,
1448 GK_EVERGREEN,
1449 GK_EVERGREEN_DOUBLE_OPS,
1450 GK_NORTHERN_ISLANDS,
1451 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001452 GK_SOUTHERN_ISLANDS,
1453 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001454 } GPU;
1455
Eli Friedmand13b41e2012-10-12 23:32:00 +00001456public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001457 R600TargetInfo(const llvm::Triple &Triple)
1458 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001459 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001460 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001461 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001462 }
1463
1464 virtual const char * getClobbers() const {
1465 return "";
1466 }
1467
1468 virtual void getGCCRegNames(const char * const *&Names,
1469 unsigned &numNames) const {
1470 Names = NULL;
1471 numNames = 0;
1472 }
1473
1474 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1475 unsigned &NumAliases) const {
1476 Aliases = NULL;
1477 NumAliases = 0;
1478 }
1479
1480 virtual bool validateAsmConstraint(const char *&Name,
1481 TargetInfo::ConstraintInfo &info) const {
1482 return true;
1483 }
1484
1485 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1486 unsigned &NumRecords) const {
1487 Records = NULL;
1488 NumRecords = 0;
1489 }
1490
1491
1492 virtual void getTargetDefines(const LangOptions &Opts,
1493 MacroBuilder &Builder) const {
1494 Builder.defineMacro("__R600__");
1495 }
1496
1497 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1498 return TargetInfo::CharPtrBuiltinVaList;
1499 }
1500
Tom Stellardc74b1e02013-03-04 17:40:53 +00001501 virtual bool setCPU(const std::string &Name) {
1502 GPU = llvm::StringSwitch<GPUKind>(Name)
1503 .Case("r600" , GK_R600)
1504 .Case("rv610", GK_R600)
1505 .Case("rv620", GK_R600)
1506 .Case("rv630", GK_R600)
1507 .Case("rv635", GK_R600)
1508 .Case("rs780", GK_R600)
1509 .Case("rs880", GK_R600)
1510 .Case("rv670", GK_R600_DOUBLE_OPS)
1511 .Case("rv710", GK_R700)
1512 .Case("rv730", GK_R700)
1513 .Case("rv740", GK_R700_DOUBLE_OPS)
1514 .Case("rv770", GK_R700_DOUBLE_OPS)
1515 .Case("palm", GK_EVERGREEN)
1516 .Case("cedar", GK_EVERGREEN)
1517 .Case("sumo", GK_EVERGREEN)
1518 .Case("sumo2", GK_EVERGREEN)
1519 .Case("redwood", GK_EVERGREEN)
1520 .Case("juniper", GK_EVERGREEN)
1521 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1522 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1523 .Case("barts", GK_NORTHERN_ISLANDS)
1524 .Case("turks", GK_NORTHERN_ISLANDS)
1525 .Case("caicos", GK_NORTHERN_ISLANDS)
1526 .Case("cayman", GK_CAYMAN)
1527 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001528 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001529 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1530 .Case("verde", GK_SOUTHERN_ISLANDS)
1531 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001532 .Case("bonaire", GK_SEA_ISLANDS)
1533 .Case("kabini", GK_SEA_ISLANDS)
1534 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001535 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001536 .Default(GK_NONE);
1537
1538 if (GPU == GK_NONE) {
1539 return false;
1540 }
1541
1542 // Set the correct data layout
1543 switch (GPU) {
1544 case GK_NONE:
1545 case GK_R600:
1546 case GK_R700:
1547 case GK_EVERGREEN:
1548 case GK_NORTHERN_ISLANDS:
1549 DescriptionString = DescriptionStringR600;
1550 break;
1551 case GK_R600_DOUBLE_OPS:
1552 case GK_R700_DOUBLE_OPS:
1553 case GK_EVERGREEN_DOUBLE_OPS:
1554 case GK_CAYMAN:
1555 DescriptionString = DescriptionStringR600DoubleOps;
1556 break;
1557 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001558 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001559 DescriptionString = DescriptionStringSI;
1560 break;
1561 }
1562
1563 return true;
1564 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001565};
1566
1567} // end anonymous namespace
1568
1569namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001570// Namespace for x86 abstract base class
1571const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001572#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001573#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001574 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001575#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001576};
Eli Friedmanb5366062008-05-20 14:21:01 +00001577
Nuno Lopescfca1f02009-12-23 17:49:57 +00001578static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001579 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1580 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001581 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001582 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1583 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1584 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001585 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001586 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1587 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001588};
1589
Eric Christophercdd36352011-06-21 00:05:20 +00001590const TargetInfo::AddlRegName AddlRegNames[] = {
1591 { { "al", "ah", "eax", "rax" }, 0 },
1592 { { "bl", "bh", "ebx", "rbx" }, 3 },
1593 { { "cl", "ch", "ecx", "rcx" }, 2 },
1594 { { "dl", "dh", "edx", "rdx" }, 1 },
1595 { { "esi", "rsi" }, 4 },
1596 { { "edi", "rdi" }, 5 },
1597 { { "esp", "rsp" }, 7 },
1598 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001599};
1600
1601// X86 target abstract base class; x86-32 and x86-64 are very close, so
1602// most of the implementation can be shared.
1603class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001604 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001605 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001606 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001607 enum MMX3DNowEnum {
1608 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1609 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001610 enum XOPEnum {
1611 NoXOP,
1612 SSE4A,
1613 FMA4,
1614 XOP
1615 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001616
Eric Christophere1ddaf92010-04-02 23:50:19 +00001617 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001618 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001619 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001620 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001621 bool HasBMI;
1622 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001623 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001624 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001625 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001626 bool HasRDSEED;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001627 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001628 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001629 bool HasF16C;
Craig Topper679b53a2013-08-21 05:29:10 +00001630 bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
Ben Langmuir58078d02013-09-19 13:22:04 +00001631 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001632 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001633
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001634 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1635 ///
1636 /// Each enumeration represents a particular CPU supported by Clang. These
1637 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1638 enum CPUKind {
1639 CK_Generic,
1640
1641 /// \name i386
1642 /// i386-generation processors.
1643 //@{
1644 CK_i386,
1645 //@}
1646
1647 /// \name i486
1648 /// i486-generation processors.
1649 //@{
1650 CK_i486,
1651 CK_WinChipC6,
1652 CK_WinChip2,
1653 CK_C3,
1654 //@}
1655
1656 /// \name i586
1657 /// i586-generation processors, P5 microarchitecture based.
1658 //@{
1659 CK_i586,
1660 CK_Pentium,
1661 CK_PentiumMMX,
1662 //@}
1663
1664 /// \name i686
1665 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1666 //@{
1667 CK_i686,
1668 CK_PentiumPro,
1669 CK_Pentium2,
1670 CK_Pentium3,
1671 CK_Pentium3M,
1672 CK_PentiumM,
1673 CK_C3_2,
1674
1675 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1676 /// Clang however has some logic to suport this.
1677 // FIXME: Warn, deprecate, and potentially remove this.
1678 CK_Yonah,
1679 //@}
1680
1681 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001682 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001683 //@{
1684 CK_Pentium4,
1685 CK_Pentium4M,
1686 CK_Prescott,
1687 CK_Nocona,
1688 //@}
1689
1690 /// \name Core
1691 /// Core microarchitecture based processors.
1692 //@{
1693 CK_Core2,
1694
1695 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1696 /// codename which GCC no longer accepts as an option to -march, but Clang
1697 /// has some logic for recognizing it.
1698 // FIXME: Warn, deprecate, and potentially remove this.
1699 CK_Penryn,
1700 //@}
1701
1702 /// \name Atom
1703 /// Atom processors
1704 //@{
1705 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001706 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001707 //@}
1708
1709 /// \name Nehalem
1710 /// Nehalem microarchitecture based processors.
1711 //@{
1712 CK_Corei7,
1713 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001714 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001715 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001716 //@}
1717
Craig Topper449314e2013-08-20 07:09:39 +00001718 /// \name Knights Landing
1719 /// Knights Landing processor.
1720 CK_KNL,
1721
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001722 /// \name K6
1723 /// K6 architecture processors.
1724 //@{
1725 CK_K6,
1726 CK_K6_2,
1727 CK_K6_3,
1728 //@}
1729
1730 /// \name K7
1731 /// K7 architecture processors.
1732 //@{
1733 CK_Athlon,
1734 CK_AthlonThunderbird,
1735 CK_Athlon4,
1736 CK_AthlonXP,
1737 CK_AthlonMP,
1738 //@}
1739
1740 /// \name K8
1741 /// K8 architecture processors.
1742 //@{
1743 CK_Athlon64,
1744 CK_Athlon64SSE3,
1745 CK_AthlonFX,
1746 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001747 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001748 CK_Opteron,
1749 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001750 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001751 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001752
Benjamin Kramer569f2152012-01-10 11:50:18 +00001753 /// \name Bobcat
1754 /// Bobcat architecture processors.
1755 //@{
1756 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001757 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001758 //@}
1759
1760 /// \name Bulldozer
1761 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001762 //@{
1763 CK_BDVER1,
1764 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001765 CK_BDVER3,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001766 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001767
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001768 /// This specification is deprecated and will be removed in the future.
1769 /// Users should prefer \see CK_K8.
1770 // FIXME: Warn on this when the CPU is set to it.
1771 CK_x86_64,
1772 //@}
1773
1774 /// \name Geode
1775 /// Geode processors.
1776 //@{
1777 CK_Geode
1778 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001779 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001780
Rafael Espindolaeb265472013-08-21 21:59:03 +00001781 enum FPMathKind {
1782 FP_Default,
1783 FP_SSE,
1784 FP_387
1785 } FPMath;
1786
Eli Friedman3fd920a2008-08-20 02:34:37 +00001787public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001788 X86TargetInfo(const llvm::Triple &Triple)
1789 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001790 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1791 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001792 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1793 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001794 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1795 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001796 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001797 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001798 }
Benjamin Kramercf501472011-12-28 15:47:06 +00001799 virtual unsigned getFloatEvalMethod() const {
1800 // X87 evaluates with 80 bits "long double" precision.
1801 return SSELevel == NoSSE ? 2 : 0;
1802 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001803 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1804 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001805 Records = BuiltinInfo;
1806 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001807 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001808 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001809 unsigned &NumNames) const {
1810 Names = GCCRegNames;
1811 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001812 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001813 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001814 unsigned &NumAliases) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001815 Aliases = 0;
1816 NumAliases = 0;
1817 }
1818 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
Eric Christopherfd081ca2012-11-14 22:08:59 +00001819 unsigned &NumNames) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001820 Names = AddlRegNames;
1821 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001822 }
Anders Carlsson58436352009-02-28 17:11:49 +00001823 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001824 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001825 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001826 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001827 return "~{dirflag},~{fpsr},~{flags}";
1828 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001829 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001830 MacroBuilder &Builder) const;
Craig Topper13f61a62013-09-17 04:12:55 +00001831 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1832 bool Enabled);
1833 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1834 bool Enabled);
1835 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1836 bool Enabled);
Rafael Espindolaa38ce292013-08-20 15:30:32 +00001837 virtual void setFeatureEnabled(llvm::StringMap<bool> &Features,
Craig Topper86d79ef2013-09-17 04:51:29 +00001838 StringRef Name, bool Enabled) const {
1839 setFeatureEnabledImpl(Features, Name, Enabled);
1840 }
1841 // This exists purely to cut down on the number of virtual calls in
1842 // getDefaultFeatures which calls this repeatedly.
1843 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1844 StringRef Name, bool Enabled);
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00001845 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001846 virtual bool hasFeature(StringRef Feature) const;
Eric Christopher3ff21b32013-10-16 21:26:26 +00001847 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00001848 DiagnosticsEngine &Diags);
Eli Friedman33465822011-07-08 23:31:17 +00001849 virtual const char* getABI() const {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001850 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001851 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001852 else if (getTriple().getArch() == llvm::Triple::x86 &&
1853 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001854 return "no-mmx";
1855 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001856 }
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001857 virtual bool setCPU(const std::string &Name) {
Chandler Carruth212334f2011-09-28 08:55:37 +00001858 CPU = llvm::StringSwitch<CPUKind>(Name)
1859 .Case("i386", CK_i386)
1860 .Case("i486", CK_i486)
1861 .Case("winchip-c6", CK_WinChipC6)
1862 .Case("winchip2", CK_WinChip2)
1863 .Case("c3", CK_C3)
1864 .Case("i586", CK_i586)
1865 .Case("pentium", CK_Pentium)
1866 .Case("pentium-mmx", CK_PentiumMMX)
1867 .Case("i686", CK_i686)
1868 .Case("pentiumpro", CK_PentiumPro)
1869 .Case("pentium2", CK_Pentium2)
1870 .Case("pentium3", CK_Pentium3)
1871 .Case("pentium3m", CK_Pentium3M)
1872 .Case("pentium-m", CK_PentiumM)
1873 .Case("c3-2", CK_C3_2)
1874 .Case("yonah", CK_Yonah)
1875 .Case("pentium4", CK_Pentium4)
1876 .Case("pentium4m", CK_Pentium4M)
1877 .Case("prescott", CK_Prescott)
1878 .Case("nocona", CK_Nocona)
1879 .Case("core2", CK_Core2)
1880 .Case("penryn", CK_Penryn)
1881 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001882 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001883 .Case("corei7", CK_Corei7)
1884 .Case("corei7-avx", CK_Corei7AVX)
1885 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001886 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001887 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00001888 .Case("k6", CK_K6)
1889 .Case("k6-2", CK_K6_2)
1890 .Case("k6-3", CK_K6_3)
1891 .Case("athlon", CK_Athlon)
1892 .Case("athlon-tbird", CK_AthlonThunderbird)
1893 .Case("athlon-4", CK_Athlon4)
1894 .Case("athlon-xp", CK_AthlonXP)
1895 .Case("athlon-mp", CK_AthlonMP)
1896 .Case("athlon64", CK_Athlon64)
1897 .Case("athlon64-sse3", CK_Athlon64SSE3)
1898 .Case("athlon-fx", CK_AthlonFX)
1899 .Case("k8", CK_K8)
1900 .Case("k8-sse3", CK_K8SSE3)
1901 .Case("opteron", CK_Opteron)
1902 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001903 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001904 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001905 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001906 .Case("bdver1", CK_BDVER1)
1907 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001908 .Case("bdver3", CK_BDVER3)
Chandler Carruth212334f2011-09-28 08:55:37 +00001909 .Case("x86-64", CK_x86_64)
1910 .Case("geode", CK_Geode)
1911 .Default(CK_Generic);
1912
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001913 // Perform any per-CPU checks necessary to determine if this CPU is
1914 // acceptable.
1915 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1916 // invalid without explaining *why*.
1917 switch (CPU) {
1918 case CK_Generic:
1919 // No processor selected!
1920 return false;
1921
1922 case CK_i386:
1923 case CK_i486:
1924 case CK_WinChipC6:
1925 case CK_WinChip2:
1926 case CK_C3:
1927 case CK_i586:
1928 case CK_Pentium:
1929 case CK_PentiumMMX:
1930 case CK_i686:
1931 case CK_PentiumPro:
1932 case CK_Pentium2:
1933 case CK_Pentium3:
1934 case CK_Pentium3M:
1935 case CK_PentiumM:
1936 case CK_Yonah:
1937 case CK_C3_2:
1938 case CK_Pentium4:
1939 case CK_Pentium4M:
1940 case CK_Prescott:
1941 case CK_K6:
1942 case CK_K6_2:
1943 case CK_K6_3:
1944 case CK_Athlon:
1945 case CK_AthlonThunderbird:
1946 case CK_Athlon4:
1947 case CK_AthlonXP:
1948 case CK_AthlonMP:
1949 case CK_Geode:
1950 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00001951 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001952 return false;
1953
1954 // Fallthrough
1955 case CK_Nocona:
1956 case CK_Core2:
1957 case CK_Penryn:
1958 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00001959 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001960 case CK_Corei7:
1961 case CK_Corei7AVX:
1962 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00001963 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00001964 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001965 case CK_Athlon64:
1966 case CK_Athlon64SSE3:
1967 case CK_AthlonFX:
1968 case CK_K8:
1969 case CK_K8SSE3:
1970 case CK_Opteron:
1971 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00001972 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00001973 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001974 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001975 case CK_BDVER1:
1976 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001977 case CK_BDVER3:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001978 case CK_x86_64:
1979 return true;
1980 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00001981 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001982 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001983
Rafael Espindolaeb265472013-08-21 21:59:03 +00001984 virtual bool setFPMath(StringRef Name);
1985
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001986 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
1987 // We accept all non-ARM calling conventions
1988 return (CC == CC_X86ThisCall ||
1989 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00001990 CC == CC_X86StdCall ||
1991 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00001992 CC == CC_X86Pascal ||
1993 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001994 }
1995
Aaron Ballman02df2e02012-12-09 17:45:41 +00001996 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
1997 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001998 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001999};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002000
Rafael Espindolaeb265472013-08-21 21:59:03 +00002001bool X86TargetInfo::setFPMath(StringRef Name) {
2002 if (Name == "387") {
2003 FPMath = FP_387;
2004 return true;
2005 }
2006 if (Name == "sse") {
2007 FPMath = FP_SSE;
2008 return true;
2009 }
2010 return false;
2011}
2012
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002013void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002014 // FIXME: This *really* should not be here.
2015
2016 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002017 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002018 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002019
Chandler Carruth212334f2011-09-28 08:55:37 +00002020 switch (CPU) {
2021 case CK_Generic:
2022 case CK_i386:
2023 case CK_i486:
2024 case CK_i586:
2025 case CK_Pentium:
2026 case CK_i686:
2027 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002028 break;
2029 case CK_PentiumMMX:
2030 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002031 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002032 break;
2033 case CK_Pentium3:
2034 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002035 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002036 break;
2037 case CK_PentiumM:
2038 case CK_Pentium4:
2039 case CK_Pentium4M:
2040 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002041 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002042 break;
2043 case CK_Yonah:
2044 case CK_Prescott:
2045 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002046 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002047 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002048 break;
2049 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002050 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002051 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002052 break;
2053 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002054 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002055 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002056 break;
2057 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002058 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002059 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002060 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002061 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002062 setFeatureEnabledImpl(Features, "sse4.2", true);
2063 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002064 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002065 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002066 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002067 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002068 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002069 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002070 break;
2071 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002072 setFeatureEnabledImpl(Features, "avx", true);
2073 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002074 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002075 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002076 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002077 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002078 setFeatureEnabledImpl(Features, "avx", true);
2079 setFeatureEnabledImpl(Features, "aes", true);
2080 setFeatureEnabledImpl(Features, "pclmul", true);
2081 setFeatureEnabledImpl(Features, "rdrnd", true);
2082 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002083 break;
Craig Topper865fff52011-12-17 19:55:21 +00002084 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002085 setFeatureEnabledImpl(Features, "avx2", true);
2086 setFeatureEnabledImpl(Features, "aes", true);
2087 setFeatureEnabledImpl(Features, "pclmul", true);
2088 setFeatureEnabledImpl(Features, "lzcnt", true);
2089 setFeatureEnabledImpl(Features, "rdrnd", true);
2090 setFeatureEnabledImpl(Features, "f16c", true);
2091 setFeatureEnabledImpl(Features, "bmi", true);
2092 setFeatureEnabledImpl(Features, "bmi2", true);
2093 setFeatureEnabledImpl(Features, "rtm", true);
2094 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002095 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002096 break;
Craig Topper449314e2013-08-20 07:09:39 +00002097 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002098 setFeatureEnabledImpl(Features, "avx512f", true);
2099 setFeatureEnabledImpl(Features, "avx512cd", true);
2100 setFeatureEnabledImpl(Features, "avx512er", true);
2101 setFeatureEnabledImpl(Features, "avx512pf", true);
2102 setFeatureEnabledImpl(Features, "aes", true);
2103 setFeatureEnabledImpl(Features, "pclmul", true);
2104 setFeatureEnabledImpl(Features, "lzcnt", true);
2105 setFeatureEnabledImpl(Features, "rdrnd", true);
2106 setFeatureEnabledImpl(Features, "f16c", true);
2107 setFeatureEnabledImpl(Features, "bmi", true);
2108 setFeatureEnabledImpl(Features, "bmi2", true);
2109 setFeatureEnabledImpl(Features, "rtm", true);
2110 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002111 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002112 case CK_K6:
2113 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002114 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002115 break;
2116 case CK_K6_2:
2117 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002118 case CK_WinChip2:
2119 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002120 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002121 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002122 case CK_Athlon:
2123 case CK_AthlonThunderbird:
2124 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002125 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002126 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002127 case CK_Athlon4:
2128 case CK_AthlonXP:
2129 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002130 setFeatureEnabledImpl(Features, "sse", true);
2131 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002132 break;
2133 case CK_K8:
2134 case CK_Opteron:
2135 case CK_Athlon64:
2136 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002137 setFeatureEnabledImpl(Features, "sse2", true);
2138 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002139 break;
2140 case CK_K8SSE3:
2141 case CK_OpteronSSE3:
2142 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002143 setFeatureEnabledImpl(Features, "sse3", true);
2144 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002145 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002146 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002147 setFeatureEnabledImpl(Features, "sse3", true);
2148 setFeatureEnabledImpl(Features, "sse4a", true);
2149 setFeatureEnabledImpl(Features, "3dnowa", true);
2150 setFeatureEnabledImpl(Features, "lzcnt", true);
2151 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002152 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002153 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002154 setFeatureEnabledImpl(Features, "ssse3", true);
2155 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002156 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002157 setFeatureEnabledImpl(Features, "lzcnt", true);
2158 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002159 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002160 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002161 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002162 setFeatureEnabledImpl(Features, "avx", true);
2163 setFeatureEnabledImpl(Features, "sse4a", true);
2164 setFeatureEnabledImpl(Features, "lzcnt", true);
2165 setFeatureEnabledImpl(Features, "aes", true);
2166 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002167 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002168 setFeatureEnabledImpl(Features, "bmi", true);
2169 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002170 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002171 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002172 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002173 setFeatureEnabledImpl(Features, "xop", true);
2174 setFeatureEnabledImpl(Features, "lzcnt", true);
2175 setFeatureEnabledImpl(Features, "aes", true);
2176 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002177 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002178 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002179 break;
Eli Friedman3e94f572012-11-17 01:43:10 +00002180 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002181 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002182 setFeatureEnabledImpl(Features, "xop", true);
2183 setFeatureEnabledImpl(Features, "lzcnt", true);
2184 setFeatureEnabledImpl(Features, "aes", true);
2185 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002186 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002187 setFeatureEnabledImpl(Features, "bmi", true);
2188 setFeatureEnabledImpl(Features, "fma", true);
2189 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002190 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002191 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002192 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002193 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002194 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002195 break;
Eli Friedman33465822011-07-08 23:31:17 +00002196 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002197}
2198
Rafael Espindolae62e2792013-08-20 13:44:29 +00002199void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002200 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002201 if (Enabled) {
2202 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002203 case AVX512F:
2204 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002205 case AVX2:
2206 Features["avx2"] = true;
2207 case AVX:
2208 Features["avx"] = true;
2209 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002210 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002211 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002212 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002213 case SSSE3:
2214 Features["ssse3"] = true;
2215 case SSE3:
2216 Features["sse3"] = true;
2217 case SSE2:
2218 Features["sse2"] = true;
2219 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002220 Features["sse"] = true;
2221 case NoSSE:
2222 break;
2223 }
2224 return;
2225 }
2226
2227 switch (Level) {
2228 case NoSSE:
2229 case SSE1:
2230 Features["sse"] = false;
2231 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002232 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2233 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002234 case SSE3:
2235 Features["sse3"] = false;
2236 setXOPLevel(Features, NoXOP, false);
2237 case SSSE3:
2238 Features["ssse3"] = false;
2239 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002240 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002241 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002242 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002243 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002244 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002245 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002246 case AVX2:
2247 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002248 case AVX512F:
Craig Topper679b53a2013-08-21 05:29:10 +00002249 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2250 Features["avx512pf"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002251 }
2252}
2253
2254void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002255 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002256 if (Enabled) {
2257 switch (Level) {
2258 case AMD3DNowAthlon:
2259 Features["3dnowa"] = true;
2260 case AMD3DNow:
2261 Features["3dnow"] = true;
2262 case MMX:
2263 Features["mmx"] = true;
2264 case NoMMX3DNow:
2265 break;
2266 }
2267 return;
2268 }
2269
2270 switch (Level) {
2271 case NoMMX3DNow:
2272 case MMX:
2273 Features["mmx"] = false;
2274 case AMD3DNow:
2275 Features["3dnow"] = false;
2276 case AMD3DNowAthlon:
2277 Features["3dnowa"] = false;
2278 }
2279}
2280
2281void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002282 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002283 if (Enabled) {
2284 switch (Level) {
2285 case XOP:
2286 Features["xop"] = true;
2287 case FMA4:
2288 Features["fma4"] = true;
2289 setSSELevel(Features, AVX, true);
2290 case SSE4A:
2291 Features["sse4a"] = true;
2292 setSSELevel(Features, SSE3, true);
2293 case NoXOP:
2294 break;
2295 }
2296 return;
2297 }
2298
2299 switch (Level) {
2300 case NoXOP:
2301 case SSE4A:
2302 Features["sse4a"] = false;
2303 case FMA4:
2304 Features["fma4"] = false;
2305 case XOP:
2306 Features["xop"] = false;
2307 }
2308}
2309
Craig Topper86d79ef2013-09-17 04:51:29 +00002310void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2311 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002312 // FIXME: This *really* should not be here. We need some way of translating
2313 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002314 if (Name == "sse4")
2315 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002316
Rafael Espindolae62e2792013-08-20 13:44:29 +00002317 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002318
Craig Topper29561122013-09-19 01:13:07 +00002319 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002320 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002321 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002322 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002323 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002324 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002325 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002326 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002327 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002328 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002329 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002330 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002331 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002332 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002333 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002334 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002335 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002336 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002337 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002338 if (Enabled)
2339 setSSELevel(Features, SSE2, Enabled);
2340 } else if (Name == "pclmul") {
2341 if (Enabled)
2342 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002343 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002344 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002345 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002346 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002347 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002348 setSSELevel(Features, AVX512F, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002349 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002350 if (Enabled)
2351 setSSELevel(Features, AVX512F, Enabled);
2352 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002353 if (Enabled)
2354 setSSELevel(Features, AVX, Enabled);
2355 } else if (Name == "fma4") {
2356 setXOPLevel(Features, FMA4, Enabled);
2357 } else if (Name == "xop") {
2358 setXOPLevel(Features, XOP, Enabled);
2359 } else if (Name == "sse4a") {
2360 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002361 } else if (Name == "f16c") {
2362 if (Enabled)
2363 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002364 } else if (Name == "sha") {
2365 if (Enabled)
2366 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002367 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002368}
2369
Eric Christopher3ff21b32013-10-16 21:26:26 +00002370/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002371/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002372bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002373 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002374 // Remember the maximum enabled sselevel.
2375 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2376 // Ignore disabled features.
2377 if (Features[i][0] == '-')
2378 continue;
2379
Benjamin Kramer27402c62012-03-05 15:10:44 +00002380 StringRef Feature = StringRef(Features[i]).substr(1);
2381
2382 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002383 HasAES = true;
2384 continue;
2385 }
2386
Craig Topper3f122a72012-05-31 05:18:48 +00002387 if (Feature == "pclmul") {
2388 HasPCLMUL = true;
2389 continue;
2390 }
2391
Benjamin Kramer27402c62012-03-05 15:10:44 +00002392 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002393 HasLZCNT = true;
2394 continue;
2395 }
2396
Rafael Espindola89049822013-08-23 20:21:37 +00002397 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002398 HasRDRND = true;
2399 continue;
2400 }
2401
Benjamin Kramer27402c62012-03-05 15:10:44 +00002402 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002403 HasBMI = true;
2404 continue;
2405 }
2406
Benjamin Kramer27402c62012-03-05 15:10:44 +00002407 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002408 HasBMI2 = true;
2409 continue;
2410 }
2411
Benjamin Kramer27402c62012-03-05 15:10:44 +00002412 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002413 HasPOPCNT = true;
2414 continue;
2415 }
2416
Michael Liao625a8752012-11-10 05:17:46 +00002417 if (Feature == "rtm") {
2418 HasRTM = true;
2419 continue;
2420 }
2421
Michael Liao74f4eaf2013-03-26 17:52:08 +00002422 if (Feature == "prfchw") {
2423 HasPRFCHW = true;
2424 continue;
2425 }
2426
Michael Liaoffaae352013-03-29 05:17:55 +00002427 if (Feature == "rdseed") {
2428 HasRDSEED = true;
2429 continue;
2430 }
2431
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002432 if (Feature == "tbm") {
2433 HasTBM = true;
2434 continue;
2435 }
2436
Craig Topperbba778b2012-06-03 21:46:30 +00002437 if (Feature == "fma") {
2438 HasFMA = true;
2439 continue;
2440 }
2441
Manman Rena45358c2012-10-11 00:59:55 +00002442 if (Feature == "f16c") {
2443 HasF16C = true;
2444 continue;
2445 }
2446
Craig Topper679b53a2013-08-21 05:29:10 +00002447 if (Feature == "avx512cd") {
2448 HasAVX512CD = true;
2449 continue;
2450 }
2451
2452 if (Feature == "avx512er") {
2453 HasAVX512ER = true;
2454 continue;
2455 }
2456
2457 if (Feature == "avx512pf") {
2458 HasAVX512PF = true;
2459 continue;
2460 }
2461
Ben Langmuir58078d02013-09-19 13:22:04 +00002462 if (Feature == "sha") {
2463 HasSHA = true;
2464 continue;
2465 }
2466
Nick Lewycky50e8f482013-10-05 20:14:27 +00002467 if (Feature == "cx16") {
2468 HasCX16 = true;
2469 continue;
2470 }
2471
Daniel Dunbar979586e2009-11-11 09:38:56 +00002472 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002473 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002474 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002475 .Case("avx2", AVX2)
2476 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002477 .Case("sse4.2", SSE42)
2478 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002479 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002480 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002481 .Case("sse2", SSE2)
2482 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002483 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002484 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002485
Eli Friedman33465822011-07-08 23:31:17 +00002486 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002487 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002488 .Case("3dnowa", AMD3DNowAthlon)
2489 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002490 .Case("mmx", MMX)
2491 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002492 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002493
2494 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2495 .Case("xop", XOP)
2496 .Case("fma4", FMA4)
2497 .Case("sse4a", SSE4A)
2498 .Default(NoXOP);
2499 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002500 }
Eli Friedman33465822011-07-08 23:31:17 +00002501
Craig Topper7481d8a2013-09-10 06:55:47 +00002502 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2503 // Can't do this earlier because we need to be able to explicitly enable
2504 // popcnt and still disable sse4.2.
2505 if (!HasPOPCNT && SSELevel >= SSE42 &&
2506 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2507 HasPOPCNT = true;
2508 Features.push_back("+popcnt");
2509 }
2510
Yunzhong Gao61089362013-10-16 19:07:02 +00002511 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2512 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2513 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2514 HasPRFCHW = true;
2515 Features.push_back("+prfchw");
2516 }
2517
Rafael Espindolaeb265472013-08-21 21:59:03 +00002518 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2519 // matches the selected sse level.
2520 if (FPMath == FP_SSE && SSELevel < SSE1) {
2521 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2522 return false;
2523 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2524 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2525 return false;
2526 }
2527
Eli Friedman33465822011-07-08 23:31:17 +00002528 // Don't tell the backend if we're turning off mmx; it will end up disabling
2529 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002530 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2531 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002532 std::vector<std::string>::iterator it;
2533 it = std::find(Features.begin(), Features.end(), "-mmx");
2534 if (it != Features.end())
2535 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002536 else if (SSELevel > NoSSE)
2537 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002538 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002539}
Chris Lattnerecd49032009-03-02 22:27:17 +00002540
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002541/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2542/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002543void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002544 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002545 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002546 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002547 Builder.defineMacro("__amd64__");
2548 Builder.defineMacro("__amd64");
2549 Builder.defineMacro("__x86_64");
2550 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002551 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002552 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002553 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002554
Chris Lattnerecd49032009-03-02 22:27:17 +00002555 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002556 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2557 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002558 switch (CPU) {
2559 case CK_Generic:
2560 break;
2561 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002562 // The rest are coming from the i386 define above.
2563 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002564 break;
2565 case CK_i486:
2566 case CK_WinChipC6:
2567 case CK_WinChip2:
2568 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002569 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002570 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002571 case CK_PentiumMMX:
2572 Builder.defineMacro("__pentium_mmx__");
2573 Builder.defineMacro("__tune_pentium_mmx__");
2574 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002575 case CK_i586:
2576 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002577 defineCPUMacros(Builder, "i586");
2578 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002579 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002580 case CK_Pentium3:
2581 case CK_Pentium3M:
2582 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002583 Builder.defineMacro("__tune_pentium3__");
2584 // Fallthrough
2585 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002586 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002587 Builder.defineMacro("__tune_pentium2__");
2588 // Fallthrough
2589 case CK_PentiumPro:
2590 Builder.defineMacro("__tune_i686__");
2591 Builder.defineMacro("__tune_pentiumpro__");
2592 // Fallthrough
2593 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002594 Builder.defineMacro("__i686");
2595 Builder.defineMacro("__i686__");
2596 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2597 Builder.defineMacro("__pentiumpro");
2598 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002599 break;
2600 case CK_Pentium4:
2601 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002602 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002603 break;
2604 case CK_Yonah:
2605 case CK_Prescott:
2606 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002607 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002608 break;
2609 case CK_Core2:
2610 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002611 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002612 break;
2613 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002614 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002615 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002616 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002617 defineCPUMacros(Builder, "slm");
2618 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002619 case CK_Corei7:
2620 case CK_Corei7AVX:
2621 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002622 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002623 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002624 break;
Craig Topper449314e2013-08-20 07:09:39 +00002625 case CK_KNL:
2626 defineCPUMacros(Builder, "knl");
2627 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002628 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002629 Builder.defineMacro("__k6_2__");
2630 Builder.defineMacro("__tune_k6_2__");
2631 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002632 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002633 if (CPU != CK_K6_2) { // In case of fallthrough
2634 // FIXME: GCC may be enabling these in cases where some other k6
2635 // architecture is specified but -m3dnow is explicitly provided. The
2636 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002637 Builder.defineMacro("__k6_3__");
2638 Builder.defineMacro("__tune_k6_3__");
2639 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002640 // Fallthrough
2641 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002642 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002643 break;
2644 case CK_Athlon:
2645 case CK_AthlonThunderbird:
2646 case CK_Athlon4:
2647 case CK_AthlonXP:
2648 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002649 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002650 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002651 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002652 Builder.defineMacro("__tune_athlon_sse__");
2653 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002654 break;
2655 case CK_K8:
2656 case CK_K8SSE3:
2657 case CK_x86_64:
2658 case CK_Opteron:
2659 case CK_OpteronSSE3:
2660 case CK_Athlon64:
2661 case CK_Athlon64SSE3:
2662 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002663 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002664 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002665 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002666 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002667 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002668 case CK_BTVER1:
2669 defineCPUMacros(Builder, "btver1");
2670 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002671 case CK_BTVER2:
2672 defineCPUMacros(Builder, "btver2");
2673 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002674 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002675 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002676 break;
2677 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002678 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002679 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002680 case CK_BDVER3:
2681 defineCPUMacros(Builder, "bdver3");
2682 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002683 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002684 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002685 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002686 }
Chris Lattner96e43572009-03-02 22:40:39 +00002687
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002688 // Target properties.
2689 Builder.defineMacro("__LITTLE_ENDIAN__");
2690 Builder.defineMacro("__REGISTER_PREFIX__", "");
2691
Chris Lattner6df41af2009-04-19 17:32:33 +00002692 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2693 // functions in glibc header files that use FP Stack inline asm which the
2694 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002695 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002696
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002697 if (HasAES)
2698 Builder.defineMacro("__AES__");
2699
Craig Topper3f122a72012-05-31 05:18:48 +00002700 if (HasPCLMUL)
2701 Builder.defineMacro("__PCLMUL__");
2702
Craig Topper22967d42011-12-25 05:06:45 +00002703 if (HasLZCNT)
2704 Builder.defineMacro("__LZCNT__");
2705
Benjamin Kramer1e250392012-07-07 09:39:18 +00002706 if (HasRDRND)
2707 Builder.defineMacro("__RDRND__");
2708
Craig Topper22967d42011-12-25 05:06:45 +00002709 if (HasBMI)
2710 Builder.defineMacro("__BMI__");
2711
2712 if (HasBMI2)
2713 Builder.defineMacro("__BMI2__");
2714
Craig Topper1de83482011-12-29 16:10:46 +00002715 if (HasPOPCNT)
2716 Builder.defineMacro("__POPCNT__");
2717
Michael Liao625a8752012-11-10 05:17:46 +00002718 if (HasRTM)
2719 Builder.defineMacro("__RTM__");
2720
Michael Liao74f4eaf2013-03-26 17:52:08 +00002721 if (HasPRFCHW)
2722 Builder.defineMacro("__PRFCHW__");
2723
Michael Liaoffaae352013-03-29 05:17:55 +00002724 if (HasRDSEED)
2725 Builder.defineMacro("__RDSEED__");
2726
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002727 if (HasTBM)
2728 Builder.defineMacro("__TBM__");
2729
Rafael Espindolae62e2792013-08-20 13:44:29 +00002730 switch (XOPLevel) {
2731 case XOP:
2732 Builder.defineMacro("__XOP__");
2733 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002734 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002735 case SSE4A:
2736 Builder.defineMacro("__SSE4A__");
2737 case NoXOP:
2738 break;
2739 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002740
Craig Topperbba778b2012-06-03 21:46:30 +00002741 if (HasFMA)
2742 Builder.defineMacro("__FMA__");
2743
Manman Rena45358c2012-10-11 00:59:55 +00002744 if (HasF16C)
2745 Builder.defineMacro("__F16C__");
2746
Craig Topper679b53a2013-08-21 05:29:10 +00002747 if (HasAVX512CD)
2748 Builder.defineMacro("__AVX512CD__");
2749 if (HasAVX512ER)
2750 Builder.defineMacro("__AVX512ER__");
2751 if (HasAVX512PF)
2752 Builder.defineMacro("__AVX512PF__");
2753
Ben Langmuir58078d02013-09-19 13:22:04 +00002754 if (HasSHA)
2755 Builder.defineMacro("__SHA__");
2756
Nick Lewycky50e8f482013-10-05 20:14:27 +00002757 if (HasCX16)
2758 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2759
Chris Lattner96e43572009-03-02 22:40:39 +00002760 // Each case falls through to the previous one here.
2761 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002762 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002763 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002764 case AVX2:
2765 Builder.defineMacro("__AVX2__");
2766 case AVX:
2767 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002768 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002769 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002770 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002771 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002772 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002773 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002774 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002775 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002776 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002777 Builder.defineMacro("__SSE2__");
2778 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002779 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002780 Builder.defineMacro("__SSE__");
2781 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002782 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002783 break;
2784 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002785
Derek Schuffc7dd7222012-10-11 15:52:22 +00002786 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002787 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002788 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002789 case AVX2:
2790 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002791 case SSE42:
2792 case SSE41:
2793 case SSSE3:
2794 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002795 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002796 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002797 break;
2798 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002799 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002800 break;
2801 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002802 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002803 }
2804 }
2805
Anders Carlssone437c682010-01-27 03:47:49 +00002806 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002807 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002808 case AMD3DNowAthlon:
2809 Builder.defineMacro("__3dNOW_A__");
2810 case AMD3DNow:
2811 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002812 case MMX:
2813 Builder.defineMacro("__MMX__");
2814 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002815 break;
2816 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002817
2818 if (CPU >= CK_i486) {
2819 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2820 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2821 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2822 }
2823 if (CPU >= CK_i586)
2824 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002825}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002826
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002827bool X86TargetInfo::hasFeature(StringRef Feature) const {
2828 return llvm::StringSwitch<bool>(Feature)
2829 .Case("aes", HasAES)
2830 .Case("avx", SSELevel >= AVX)
2831 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002832 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002833 .Case("avx512cd", HasAVX512CD)
2834 .Case("avx512er", HasAVX512ER)
2835 .Case("avx512pf", HasAVX512PF)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002836 .Case("bmi", HasBMI)
2837 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002838 .Case("cx16", HasCX16)
2839 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002840 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002841 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002842 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002843 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002844 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002845 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2846 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2847 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002848 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002849 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002850 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002851 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002852 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002853 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002854 .Case("sse", SSELevel >= SSE1)
2855 .Case("sse2", SSELevel >= SSE2)
2856 .Case("sse3", SSELevel >= SSE3)
2857 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002858 .Case("sse4.1", SSELevel >= SSE41)
2859 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002860 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002861 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002862 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2863 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002864 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002865 .Default(false);
2866}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002867
Eli Friedman3fd920a2008-08-20 02:34:37 +00002868bool
Anders Carlsson58436352009-02-28 17:11:49 +00002869X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002870 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002871 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002872 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002873 case 'Y': // first letter of a pair:
2874 switch (*(Name+1)) {
2875 default: return false;
2876 case '0': // First SSE register.
2877 case 't': // Any SSE register, when SSE2 is enabled.
2878 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2879 case 'm': // any MMX register, when inter-unit moves enabled.
2880 break; // falls through to setAllowsRegister.
2881 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002882 case 'a': // eax.
2883 case 'b': // ebx.
2884 case 'c': // ecx.
2885 case 'd': // edx.
2886 case 'S': // esi.
2887 case 'D': // edi.
2888 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00002889 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002890 case 't': // top of floating point stack.
2891 case 'u': // second from top of floating point stack.
2892 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002893 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002894 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002895 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002896 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2897 case 'l': // "Index" registers: any general register that can be used as an
2898 // index in a base+index memory access.
2899 Info.setAllowsRegister();
2900 return true;
2901 case 'C': // SSE floating point constant.
2902 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002903 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002904 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002905 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002906 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002907 return true;
2908 }
2909}
2910
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002911
Eli Friedman3fd920a2008-08-20 02:34:37 +00002912std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002913X86TargetInfo::convertConstraint(const char *&Constraint) const {
2914 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002915 case 'a': return std::string("{ax}");
2916 case 'b': return std::string("{bx}");
2917 case 'c': return std::string("{cx}");
2918 case 'd': return std::string("{dx}");
2919 case 'S': return std::string("{si}");
2920 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002921 case 'p': // address
2922 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002923 case 't': // top of floating point stack.
2924 return std::string("{st}");
2925 case 'u': // second from top of floating point stack.
2926 return std::string("{st(1)}"); // second from top of floating point stack.
2927 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002928 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002929 }
2930}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002931} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002932
2933namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002934// X86-32 generic target
2935class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002936public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002937 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002938 DoubleAlign = LongLongAlign = 32;
2939 LongDoubleWidth = 96;
2940 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002941 SuitableAlign = 128;
Rafael Espindola2da35322013-12-16 23:27:41 +00002942 DescriptionString = "e-p:32:32"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00002943 "-f64:32:64-"
Rafael Espindola2da35322013-12-16 23:27:41 +00002944 "f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002945 SizeType = UnsignedInt;
2946 PtrDiffType = SignedInt;
2947 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002948 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002949
2950 // Use fpret for all types.
2951 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2952 (1 << TargetInfo::Double) |
2953 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002954
2955 // x86-32 has atomics up to 8 bytes
2956 // FIXME: Check that we actually have cmpxchg8b before setting
2957 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2958 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002959 }
Meador Inge5d3fb222012-06-16 03:34:49 +00002960 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2961 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002962 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002963
Chris Lattnerd545ad12009-09-23 06:06:36 +00002964 int getEHDataRegisterNumber(unsigned RegNo) const {
2965 if (RegNo == 0) return 0;
2966 if (RegNo == 1) return 2;
2967 return -1;
2968 }
Bill Wendling887b4852012-11-12 06:42:51 +00002969 virtual bool validateInputSize(StringRef Constraint,
2970 unsigned Size) const {
2971 switch (Constraint[0]) {
2972 default: break;
2973 case 'a':
2974 case 'b':
2975 case 'c':
2976 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00002977 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00002978 }
2979
2980 return true;
2981 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002982};
2983} // end anonymous namespace
2984
2985namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002986class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2987public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002988 NetBSDI386TargetInfo(const llvm::Triple &Triple)
2989 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002990
2991 virtual unsigned getFloatEvalMethod() const {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00002992 unsigned Major, Minor, Micro;
2993 getTriple().getOSVersion(Major, Minor, Micro);
2994 // New NetBSD uses the default rounding mode.
2995 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
2996 return X86_32TargetInfo::getFloatEvalMethod();
2997 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002998 return 1;
2999 }
3000};
3001} // end anonymous namespace
3002
3003namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003004class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3005public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003006 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3007 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003008 SizeType = UnsignedLong;
3009 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003010 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003011 }
3012};
3013} // end anonymous namespace
3014
3015namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003016class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3017public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003018 BitrigI386TargetInfo(const llvm::Triple &Triple)
3019 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003020 SizeType = UnsignedLong;
3021 IntPtrType = SignedLong;
3022 PtrDiffType = SignedLong;
3023 }
3024};
3025} // end anonymous namespace
3026
3027namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003028class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003029public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003030 DarwinI386TargetInfo(const llvm::Triple &Triple)
3031 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003032 LongDoubleWidth = 128;
3033 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003034 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003035 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003036 SizeType = UnsignedLong;
3037 IntPtrType = SignedLong;
Rafael Espindola2da35322013-12-16 23:27:41 +00003038 DescriptionString = "e-p:32:32"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00003039 "-f64:32:64-"
Rafael Espindola2da35322013-12-16 23:27:41 +00003040 "f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003041 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003042 }
3043
Eli Friedman3fd920a2008-08-20 02:34:37 +00003044};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003045} // end anonymous namespace
3046
3047namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003048// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003049class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003050public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003051 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3052 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00003053 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00003054 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003055 DoubleAlign = LongLongAlign = 64;
Rafael Espindola2da35322013-12-16 23:27:41 +00003056 DescriptionString = "e-p:32:32-"
3057 "i64:64-"
3058 "f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003059 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003060 virtual void getTargetDefines(const LangOptions &Opts,
3061 MacroBuilder &Builder) const {
3062 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3063 }
3064};
3065} // end anonymous namespace
3066
3067namespace {
3068
3069// x86-32 Windows Visual Studio target
3070class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
3071public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003072 VisualStudioWindowsX86_32TargetInfo(const llvm::Triple &Triple)
3073 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003074 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003075 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3076 }
3077 virtual void getTargetDefines(const LangOptions &Opts,
3078 MacroBuilder &Builder) const {
3079 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3080 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3081 // The value of the following reflects processor type.
3082 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3083 // We lost the original triple, so we use the default.
3084 Builder.defineMacro("_M_IX86", "600");
3085 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003086};
3087} // end anonymous namespace
3088
3089namespace {
3090// x86-32 MinGW target
3091class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3092public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003093 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3094 : WindowsX86_32TargetInfo(Triple) {}
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003095 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003096 MacroBuilder &Builder) const {
3097 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003098 DefineStd(Builder, "WIN32", Opts);
3099 DefineStd(Builder, "WINNT", Opts);
3100 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003101 Builder.defineMacro("__MSVCRT__");
3102 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003103
3104 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3105 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003106 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003107 // Provide "as-is" __declspec.
3108 Builder.defineMacro("__declspec", "__declspec");
3109 else
3110 // Provide alias of __attribute__ like mingw32-gcc.
3111 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003112 }
3113};
3114} // end anonymous namespace
3115
3116namespace {
3117// x86-32 Cygwin target
3118class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3119public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003120 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3121 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003122 TLSSupported = false;
3123 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003124 DoubleAlign = LongLongAlign = 64;
Rafael Espindola2da35322013-12-16 23:27:41 +00003125 DescriptionString = "e-p:32:32-"
3126 "i64:64-"
3127 "f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003128 }
3129 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003130 MacroBuilder &Builder) const {
3131 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003132 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003133 Builder.defineMacro("__CYGWIN__");
3134 Builder.defineMacro("__CYGWIN32__");
3135 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003136 if (Opts.CPlusPlus)
3137 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003138 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003139};
3140} // end anonymous namespace
3141
3142namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003143// x86-32 Haiku target
3144class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3145public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003146 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003147 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003148 IntPtrType = SignedLong;
3149 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003150 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003151 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003152 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003153 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00003154 virtual void getTargetDefines(const LangOptions &Opts,
3155 MacroBuilder &Builder) const {
3156 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3157 Builder.defineMacro("__INTEL__");
3158 Builder.defineMacro("__HAIKU__");
3159 }
3160};
3161} // end anonymous namespace
3162
Douglas Gregor9fabd852011-07-01 22:41:14 +00003163// RTEMS Target
3164template<typename Target>
3165class RTEMSTargetInfo : public OSTargetInfo<Target> {
3166protected:
3167 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3168 MacroBuilder &Builder) const {
3169 // RTEMS defines; list based off of gcc output
3170
Douglas Gregor9fabd852011-07-01 22:41:14 +00003171 Builder.defineMacro("__rtems__");
3172 Builder.defineMacro("__ELF__");
3173 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003174
Douglas Gregor9fabd852011-07-01 22:41:14 +00003175public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003176 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3177 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003178
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003179 switch (Triple.getArch()) {
3180 default:
3181 case llvm::Triple::x86:
3182 // this->MCountName = ".mcount";
3183 break;
3184 case llvm::Triple::mips:
3185 case llvm::Triple::mipsel:
3186 case llvm::Triple::ppc:
3187 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003188 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003189 // this->MCountName = "_mcount";
3190 break;
3191 case llvm::Triple::arm:
3192 // this->MCountName = "__mcount";
3193 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003194 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003195 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003196};
3197
3198namespace {
3199// x86-32 RTEMS target
3200class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3201public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003202 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003203 SizeType = UnsignedLong;
3204 IntPtrType = SignedLong;
3205 PtrDiffType = SignedLong;
3206 this->UserLabelPrefix = "";
3207 }
3208 virtual void getTargetDefines(const LangOptions &Opts,
3209 MacroBuilder &Builder) const {
3210 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3211 Builder.defineMacro("__INTEL__");
3212 Builder.defineMacro("__rtems__");
3213 }
3214};
3215} // end anonymous namespace
3216
Chris Lattnerb986aba2010-04-11 19:29:39 +00003217namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003218// x86-64 generic target
3219class X86_64TargetInfo : public X86TargetInfo {
3220public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003221 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00003222 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003223 LongDoubleWidth = 128;
3224 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003225 LargeArrayMinWidth = 128;
3226 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003227 SuitableAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003228 IntMaxType = SignedLong;
3229 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003230 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003231 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003232
Rafael Espindola8ddf8bc2013-12-17 00:04:48 +00003233 DescriptionString = "e-i64:64-f80:128-s:64-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003234
3235 // Use fpret only for long double.
3236 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003237
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003238 // Use fp2ret for _Complex long double.
3239 ComplexLongDoubleUsesFP2Ret = true;
3240
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003241 // x86-64 has atomics up to 16 bytes.
3242 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3243 // on CPUs with cmpxchg16b
3244 MaxAtomicPromoteWidth = 128;
3245 MaxAtomicInlineWidth = 64;
Chris Lattner10a5b382007-01-29 05:24:35 +00003246 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003247 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3248 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003249 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003250
Chris Lattnerd545ad12009-09-23 06:06:36 +00003251 int getEHDataRegisterNumber(unsigned RegNo) const {
3252 if (RegNo == 0) return 0;
3253 if (RegNo == 1) return 1;
3254 return -1;
3255 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003256
3257 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
Charles Davisb5a214e2013-08-30 04:39:01 +00003258 return (CC == CC_C ||
3259 CC == CC_IntelOclBicc ||
3260 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003261 }
3262
Aaron Ballman02df2e02012-12-09 17:45:41 +00003263 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
3264 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003265 }
3266
Eli Friedman3fd920a2008-08-20 02:34:37 +00003267};
3268} // end anonymous namespace
3269
3270namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003271// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003272class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003273public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003274 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3275 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003276 TLSSupported = false;
3277 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003278 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003279 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003280 IntMaxType = SignedLongLong;
3281 UIntMaxType = UnsignedLongLong;
3282 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003283 SizeType = UnsignedLongLong;
3284 PtrDiffType = SignedLongLong;
3285 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003286 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003287 }
3288 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003289 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003290 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003291 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003292 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003293 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3294 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003295 }
Charles Davisb5a214e2013-08-30 04:39:01 +00003296 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3297 return (CC == CC_C ||
3298 CC == CC_IntelOclBicc ||
3299 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3300 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003301};
3302} // end anonymous namespace
3303
3304namespace {
3305// x86-64 Windows Visual Studio target
3306class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
3307public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003308 VisualStudioWindowsX86_64TargetInfo(const llvm::Triple &Triple)
3309 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003310 LongDoubleWidth = LongDoubleAlign = 64;
3311 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003312 }
3313 virtual void getTargetDefines(const LangOptions &Opts,
3314 MacroBuilder &Builder) const {
3315 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3316 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003317 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003318 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003319 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003320};
3321} // end anonymous namespace
3322
3323namespace {
3324// x86-64 MinGW target
3325class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3326public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003327 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3328 : WindowsX86_64TargetInfo(Triple) {}
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003329 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003330 MacroBuilder &Builder) const {
3331 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003332 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003333 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00003334 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003335 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003336
3337 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3338 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003339 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003340 // Provide "as-is" __declspec.
3341 Builder.defineMacro("__declspec", "__declspec");
3342 else
3343 // Provide alias of __attribute__ like mingw32-gcc.
3344 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003345 }
3346};
3347} // end anonymous namespace
3348
3349namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003350class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3351public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003352 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3353 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003354 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003355 MaxVectorAlign = 256;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003356 }
3357};
3358} // end anonymous namespace
3359
3360namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003361class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3362public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003363 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3364 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003365 IntMaxType = SignedLongLong;
3366 UIntMaxType = UnsignedLongLong;
3367 Int64Type = SignedLongLong;
3368 }
3369};
3370} // end anonymous namespace
3371
3372namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003373class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3374public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003375 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3376 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3377 IntMaxType = SignedLongLong;
3378 UIntMaxType = UnsignedLongLong;
3379 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003380 }
3381};
Tim Northover9bb857a2013-01-31 12:13:10 +00003382}
3383
3384namespace {
3385class AArch64TargetInfo : public TargetInfo {
3386 static const char * const GCCRegNames[];
3387 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003388
Tim Northover2fe823a2013-08-01 09:23:19 +00003389 enum FPUModeEnum {
3390 FPUMode,
3391 NeonMode
3392 };
3393
3394 unsigned FPU;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003395 unsigned Crypto;
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003396 static const Builtin::Info BuiltinInfo[];
Tim Northover2fe823a2013-08-01 09:23:19 +00003397
Tim Northover9bb857a2013-01-31 12:13:10 +00003398public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003399 AArch64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Tim Northover9bb857a2013-01-31 12:13:10 +00003400 BigEndian = false;
3401 LongWidth = LongAlign = 64;
3402 LongDoubleWidth = LongDoubleAlign = 128;
3403 PointerWidth = PointerAlign = 64;
3404 SuitableAlign = 128;
Rafael Espindolac2e60f52013-12-17 23:30:58 +00003405 DescriptionString = "e-i64:64-i128:128-s:32-n32:64-S128";
Tim Northover9bb857a2013-01-31 12:13:10 +00003406
3407 WCharType = UnsignedInt;
3408 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3409
Tim Northover847d2d42013-02-18 12:11:32 +00003410 // AArch64 backend supports 64-bit operations at the moment. In principle
3411 // 128-bit is possible if register-pairs are used.
3412 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3413
Tim Northover9bb857a2013-01-31 12:13:10 +00003414 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3415 }
3416 virtual void getTargetDefines(const LangOptions &Opts,
3417 MacroBuilder &Builder) const {
3418 // GCC defines theses currently
3419 Builder.defineMacro("__aarch64__");
3420 Builder.defineMacro("__AARCH64EL__");
3421
3422 // ACLE predefines. Many can only have one possible value on v8 AArch64.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003423 Builder.defineMacro("__ARM_ACLE", "200");
Tim Northoverb85654d2013-04-05 14:08:55 +00003424 Builder.defineMacro("__ARM_ARCH", "8");
3425 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
Tim Northover9bb857a2013-01-31 12:13:10 +00003426
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003427 Builder.defineMacro("__ARM_64BIT_STATE");
3428 Builder.defineMacro("__ARM_PCS_AAPCS64");
3429 Builder.defineMacro("__ARM_ARCH_ISA_A64");
3430
Tim Northoverb85654d2013-04-05 14:08:55 +00003431 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
3432 Builder.defineMacro("__ARM_FEATURE_CLZ");
3433 Builder.defineMacro("__ARM_FEATURE_FMA");
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003434 Builder.defineMacro("__ARM_FEATURE_DIV");
Tim Northover9bb857a2013-01-31 12:13:10 +00003435
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003436 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
Tim Northover9bb857a2013-01-31 12:13:10 +00003437
3438 // 0xe implies support for half, single and double precision operations.
Tim Northoverb85654d2013-04-05 14:08:55 +00003439 Builder.defineMacro("__ARM_FP", "0xe");
Tim Northover9bb857a2013-01-31 12:13:10 +00003440
3441 // PCS specifies this for SysV variants, which is all we support. Other ABIs
Tim Northoverb85654d2013-04-05 14:08:55 +00003442 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
3443 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
Tim Northover9bb857a2013-01-31 12:13:10 +00003444
3445 if (Opts.FastMath || Opts.FiniteMathOnly)
Tim Northoverb85654d2013-04-05 14:08:55 +00003446 Builder.defineMacro("__ARM_FP_FAST");
Tim Northover9bb857a2013-01-31 12:13:10 +00003447
3448 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
Tim Northoverb85654d2013-04-05 14:08:55 +00003449 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
Tim Northover9bb857a2013-01-31 12:13:10 +00003450
Tim Northoverb85654d2013-04-05 14:08:55 +00003451 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
Tim Northover9bb857a2013-01-31 12:13:10 +00003452 Opts.ShortWChar ? "2" : "4");
3453
Tim Northoverb85654d2013-04-05 14:08:55 +00003454 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
Tim Northover9bb857a2013-01-31 12:13:10 +00003455 Opts.ShortEnums ? "1" : "4");
3456
3457 if (BigEndian)
Tim Northover2fe823a2013-08-01 09:23:19 +00003458 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3459
3460 if (FPU == NeonMode) {
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003461 Builder.defineMacro("__ARM_NEON");
Tim Northover2fe823a2013-08-01 09:23:19 +00003462 // 64-bit NEON supports half, single and double precision operations.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003463 Builder.defineMacro("__ARM_NEON_FP", "7");
3464 }
3465
3466 if (Crypto) {
3467 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northover2fe823a2013-08-01 09:23:19 +00003468 }
Tim Northover9bb857a2013-01-31 12:13:10 +00003469 }
3470 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3471 unsigned &NumRecords) const {
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003472 Records = BuiltinInfo;
3473 NumRecords = clang::AArch64::LastTSBuiltin-Builtin::FirstTSBuiltin;
Tim Northover9bb857a2013-01-31 12:13:10 +00003474 }
3475 virtual bool hasFeature(StringRef Feature) const {
Tim Northover2fe823a2013-08-01 09:23:19 +00003476 return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode);
Tim Northover9bb857a2013-01-31 12:13:10 +00003477 }
Tim Northover2fe823a2013-08-01 09:23:19 +00003478
Amara Emerson703da2e2013-10-31 09:32:33 +00003479 virtual bool setCPU(const std::string &Name) {
3480 return llvm::StringSwitch<bool>(Name)
3481 .Case("generic", true)
3482 .Cases("cortex-a53", "cortex-a57", true)
3483 .Default(false);
3484 }
3485
Eric Christopher3ff21b32013-10-16 21:26:26 +00003486 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003487 DiagnosticsEngine &Diags) {
Tim Northover2fe823a2013-08-01 09:23:19 +00003488 FPU = FPUMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003489 Crypto = 0;
Tim Northover2fe823a2013-08-01 09:23:19 +00003490 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3491 if (Features[i] == "+neon")
3492 FPU = NeonMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003493 if (Features[i] == "+crypto")
3494 Crypto = 1;
Tim Northover2fe823a2013-08-01 09:23:19 +00003495 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00003496 return true;
Tim Northover2fe823a2013-08-01 09:23:19 +00003497 }
3498
3499 virtual void getGCCRegNames(const char *const *&Names,
Tim Northover9bb857a2013-01-31 12:13:10 +00003500 unsigned &NumNames) const;
3501 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3502 unsigned &NumAliases) const;
3503
3504 virtual bool isCLZForZeroUndef() const { return false; }
3505
3506 virtual bool validateAsmConstraint(const char *&Name,
3507 TargetInfo::ConstraintInfo &Info) const {
3508 switch (*Name) {
3509 default: return false;
3510 case 'w': // An FP/SIMD vector register
3511 Info.setAllowsRegister();
3512 return true;
3513 case 'I': // Constant that can be used with an ADD instruction
3514 case 'J': // Constant that can be used with a SUB instruction
3515 case 'K': // Constant that can be used with a 32-bit logical instruction
3516 case 'L': // Constant that can be used with a 64-bit logical instruction
3517 case 'M': // Constant that can be used as a 32-bit MOV immediate
3518 case 'N': // Constant that can be used as a 64-bit MOV immediate
3519 case 'Y': // Floating point constant zero
3520 case 'Z': // Integer constant zero
3521 return true;
3522 case 'Q': // A memory reference with base register and no offset
3523 Info.setAllowsMemory();
3524 return true;
3525 case 'S': // A symbolic address
3526 Info.setAllowsRegister();
3527 return true;
3528 case 'U':
3529 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3530 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3531 // Usa: An absolute symbolic address
3532 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3533 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3534 }
3535 }
3536
3537 virtual const char *getClobbers() const {
3538 // There are no AArch64 clobbers shared by all asm statements.
3539 return "";
3540 }
3541
3542 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3543 return TargetInfo::AArch64ABIBuiltinVaList;
3544 }
3545};
3546
3547const char * const AArch64TargetInfo::GCCRegNames[] = {
3548 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3549 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3550 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3551 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3552
3553 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3554 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3555 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3556 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3557
3558 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3559 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3560 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3561 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3562
3563 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3564 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3565 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3566 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3567
3568 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3569 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3570 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3571 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3572
3573 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3574 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3575 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3576 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3577
3578 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3579 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3580 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3581 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3582};
3583
3584void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3585 unsigned &NumNames) const {
3586 Names = GCCRegNames;
3587 NumNames = llvm::array_lengthof(GCCRegNames);
3588}
3589
3590const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3591 { { "x16" }, "ip0"},
3592 { { "x17" }, "ip1"},
3593 { { "x29" }, "fp" },
3594 { { "x30" }, "lr" }
3595};
3596
3597void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3598 unsigned &NumAliases) const {
3599 Aliases = GCCRegAliases;
3600 NumAliases = llvm::array_lengthof(GCCRegAliases);
3601
3602}
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003603
3604const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
3605#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3606#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3607 ALL_LANGUAGES },
3608#include "clang/Basic/BuiltinsAArch64.def"
3609};
3610
Eli Friedman9fa28852012-08-08 23:57:20 +00003611} // end anonymous namespace
3612
3613namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003614class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003615 // Possible FPU choices.
3616 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003617 VFP2FPU = (1 << 0),
3618 VFP3FPU = (1 << 1),
3619 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003620 NeonFPU = (1 << 3),
3621 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003622 };
3623
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003624 // Possible HWDiv features.
3625 enum HWDivMode {
3626 HWDivThumb = (1 << 0),
3627 HWDivARM = (1 << 1)
3628 };
3629
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003630 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003631 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003632 }
3633
3634 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3635 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003636
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003637 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003638
Rafael Espindolaeb265472013-08-21 21:59:03 +00003639 enum {
3640 FP_Default,
3641 FP_VFP,
3642 FP_Neon
3643 } FPMath;
3644
Bernard Ogdenda13af32013-10-24 18:32:51 +00003645 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003646
Logan Chien57086ce2012-10-10 06:56:20 +00003647 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003648 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003649 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003650
3651 // Initialized via features.
3652 unsigned SoftFloat : 1;
3653 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003654
Bernard Ogden18b57012013-10-29 09:47:51 +00003655 unsigned CRC : 1;
3656
Chris Lattner5cc15e02010-03-03 19:03:45 +00003657 static const Builtin::Info BuiltinInfo[];
3658
Rafael Espindola101d5b92013-05-13 20:09:47 +00003659 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3660 // On linux, binaries targeting old cpus call functions in libgcc to
3661 // perform atomic operations. The implementation in libgcc then calls into
3662 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3663 // is that if we assume the kernel is at least as recent as the hardware,
3664 // it is safe to use atomic instructions on armv6 and newer.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003665 if (!T.isOSLinux() &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003666 T.getOS() != llvm::Triple::FreeBSD &&
Joerg Sonnenbergerfbd51be2013-12-02 16:12:05 +00003667 T.getOS() != llvm::Triple::NetBSD &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003668 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten60afa2d2013-06-15 09:40:14 +00003669 return false;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003670 StringRef ArchName = T.getArchName();
Rafael Espindola92dbc312013-05-14 00:44:24 +00003671 if (T.getArch() == llvm::Triple::arm) {
3672 if (!ArchName.startswith("armv"))
3673 return false;
3674 StringRef VersionStr = ArchName.substr(4);
3675 unsigned Version;
3676 if (VersionStr.getAsInteger(10, Version))
3677 return false;
3678 return Version >= 6;
3679 }
3680 assert(T.getArch() == llvm::Triple::thumb);
3681 if (!ArchName.startswith("thumbv"))
3682 return false;
3683 StringRef VersionStr = ArchName.substr(6);
3684 unsigned Version;
3685 if (VersionStr.getAsInteger(10, Version))
3686 return false;
3687 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003688 }
3689
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003690 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003691 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003692
3693 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
3694
3695 // size_t is unsigned long on Darwin and netbsd.
3696 if (getTriple().isOSDarwin() || getTriple().getOS() == llvm::Triple::NetBSD)
3697 SizeType = UnsignedLong;
3698 else
3699 SizeType = UnsignedInt;
3700
3701 if (getTriple().getOS() == llvm::Triple::NetBSD) {
3702 WCharType = SignedInt;
3703 } else {
3704 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3705 WCharType = UnsignedInt;
3706 }
3707
3708 UseBitFieldTypeAlignment = true;
3709
3710 ZeroLengthBitfieldBoundary = 0;
3711
3712 if (IsThumb) {
3713 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3714 // so set preferred for small types to 32.
3715 DescriptionString = ("e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3716 "v128:64:128-a:0:32-n32-S64");
3717 } else {
3718 DescriptionString = ("e-p:32:32-i64:64-v128:64:128-n32-S64");
3719 }
3720
3721 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003722 }
3723
3724 void setABIAPCS() {
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003725 IsAAPCS = false;
3726
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003727 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003728
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003729 // size_t is unsigned int on FreeBSD.
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003730 if (getTriple().getOS() == llvm::Triple::FreeBSD)
3731 SizeType = UnsignedInt;
3732 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003733 SizeType = UnsignedLong;
3734
3735 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3736 WCharType = SignedInt;
3737
3738 // Do not respect the alignment of bit-field types when laying out
3739 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3740 UseBitFieldTypeAlignment = false;
3741
3742 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3743 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3744 /// gcc.
3745 ZeroLengthBitfieldBoundary = 32;
3746
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003747 if (IsThumb) {
3748 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3749 // so set preferred for small types to 32.
3750 DescriptionString = "e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3751 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
3752 } else {
3753 DescriptionString =
3754 "e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3755 }
3756
3757 // FIXME: Override "preferred align" for double and long long.
3758 }
3759
Chris Lattner17df24e2008-04-21 18:56:49 +00003760public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003761 ARMTargetInfo(const llvm::Triple &Triple)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003762 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3763 IsAAPCS(true) {
Eli Friedman803acb32011-12-22 03:51:45 +00003764 BigEndian = false;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003765 switch (getTriple().getOS()) {
3766 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003767 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003768 break;
3769 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003770 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003771 break;
3772 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003773
Chris Lattner1a8f3942010-04-23 16:29:58 +00003774 // {} in inline assembly are neon specifiers, not assembly variant
3775 // specifiers.
3776 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003777
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003778 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003779 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003780
3781 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003782
3783 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003784 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003785
3786 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003787 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003788 if (shouldUseInlineAtomic(getTriple()))
3789 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003790
3791 // Do force alignment of members that follow zero length bitfields. If
3792 // the alignment of the zero-length bitfield is greater than the member
3793 // that follows it, `bar', `bar' will be aligned as the type of the
3794 // zero length bitfield.
3795 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003796 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003797 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003798 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003799 ABI = Name;
3800
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003801 // The defaults (above) are for AAPCS, check if we need to change them.
3802 //
3803 // FIXME: We need support for -meabi... we could just mangle it into the
3804 // name.
3805 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003806 setABIAPCS();
3807 return true;
3808 }
3809 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3810 setABIAAPCS();
3811 return true;
3812 }
3813 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003814 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003815
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00003816 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Silviu Barangae5690462013-10-21 10:59:33 +00003817 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003818 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3819 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003820 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3821 CPU == "cortex-a9-mp") {
3822 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003823 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003824 }
3825 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003826 Features["vfp4"] = true;
3827 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003828 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3829 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3830 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003831 Features["vfp4"] = true;
3832 Features["neon"] = true;
3833 Features["hwdiv"] = true;
3834 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003835 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3836 Features["fp-armv8"] = true;
3837 Features["neon"] = true;
3838 Features["hwdiv"] = true;
3839 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003840 Features["crc"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003841 } else if (CPU == "cortex-r5" || CPU == "cortex-m3" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003842 CPU == "cortex-m4" ||
3843 // Enable the hwdiv extension for all v8a AArch32 cores by
3844 // default.
3845 ArchName == "armv8a" || ArchName == "armv8" ||
3846 ArchName == "thumbv8a" || ArchName == "thumbv8") {
3847 Features["hwdiv"] = true;
3848 Features["hwdiv-arm"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003849 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003850 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003851
Eric Christopher3ff21b32013-10-16 21:26:26 +00003852 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003853 DiagnosticsEngine &Diags) {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003854 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003855 CRC = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003856 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003857 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003858 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3859 if (Features[i] == "+soft-float")
3860 SoftFloat = true;
3861 else if (Features[i] == "+soft-float-abi")
3862 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003863 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003864 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003865 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003866 FPU |= VFP3FPU;
3867 else if (Features[i] == "+vfp4")
3868 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003869 else if (Features[i] == "+fp-armv8")
3870 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003871 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003872 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003873 else if (Features[i] == "+hwdiv")
3874 HWDiv |= HWDivThumb;
3875 else if (Features[i] == "+hwdiv-arm")
3876 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00003877 else if (Features[i] == "+crc")
3878 CRC = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003879 }
3880
Rafael Espindolaeb265472013-08-21 21:59:03 +00003881 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3882 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3883 return false;
3884 }
3885
3886 if (FPMath == FP_Neon)
3887 Features.push_back("+neonfp");
3888 else if (FPMath == FP_VFP)
3889 Features.push_back("-neonfp");
3890
Daniel Dunbar893d4752009-12-19 04:15:38 +00003891 // Remove front-end specific options which the backend handles differently.
3892 std::vector<std::string>::iterator it;
3893 it = std::find(Features.begin(), Features.end(), "+soft-float");
3894 if (it != Features.end())
3895 Features.erase(it);
3896 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3897 if (it != Features.end())
3898 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00003899 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003900 }
3901
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003902 virtual bool hasFeature(StringRef Feature) const {
3903 return llvm::StringSwitch<bool>(Feature)
3904 .Case("arm", true)
3905 .Case("softfloat", SoftFloat)
3906 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003907 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003908 .Case("hwdiv", HWDiv & HWDivThumb)
3909 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003910 .Default(false);
3911 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003912 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003913 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003914 return llvm::StringSwitch<const char*>(Name)
3915 .Cases("arm8", "arm810", "4")
3916 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3917 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3918 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3919 .Case("ep9312", "4T")
3920 .Cases("arm10tdmi", "arm1020t", "5T")
3921 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3922 .Case("arm926ej-s", "5TEJ")
3923 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3924 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003925 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003926 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003927 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003928 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonf643afc2013-03-04 22:37:46 +00003929 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003930 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003931 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003932 .Case("cortex-a9-mp", "7F")
3933 .Case("swift", "7S")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003934 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003935 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003936 .Cases("cortex-a53", "cortex-a57", "8A")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003937 .Default(0);
3938 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003939 static const char *getCPUProfile(StringRef Name) {
3940 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003941 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003942 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003943 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003944 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00003945 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00003946 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003947 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003948 virtual bool setCPU(const std::string &Name) {
3949 if (!getCPUDefineSuffix(Name))
3950 return false;
3951
3952 CPU = Name;
3953 return true;
3954 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00003955 virtual bool setFPMath(StringRef Name);
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003956 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003957 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003958 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003959 Builder.defineMacro("__arm");
3960 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003961
Chris Lattnerecd49032009-03-02 22:27:17 +00003962 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003963 Builder.defineMacro("__ARMEL__");
3964 Builder.defineMacro("__LITTLE_ENDIAN__");
3965 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003966
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003967 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003968 unsigned int CPUArchVer;
3969 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
3970 llvm_unreachable("Invalid char for architecture version number");
3971 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003972 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003973 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3974 StringRef CPUProfile = getCPUProfile(CPU);
3975 if (!CPUProfile.empty())
3976 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3977
Mike Stump9d54bd72009-04-08 02:07:04 +00003978 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003979
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003980 // FIXME: It's more complicated than this and we don't really support
3981 // interworking.
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003982 if (5 <= CPUArchVer && CPUArchVer <= 7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003983 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003984
David Tweed8f676532012-10-25 13:33:01 +00003985 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00003986 // Embedded targets on Darwin follow AAPCS, but not EABI.
3987 if (!getTriple().isOSDarwin())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00003988 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003989 Builder.defineMacro("__ARM_PCS", "1");
3990
David Tweed8f676532012-10-25 13:33:01 +00003991 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003992 Builder.defineMacro("__ARM_PCS_VFP", "1");
3993 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003994
Daniel Dunbar893d4752009-12-19 04:15:38 +00003995 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003996 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003997
3998 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003999 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004000
4001 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004002 Builder.defineMacro("__THUMBEL__");
4003 Builder.defineMacro("__thumb__");
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004004 if (CPUArch == "6T2" || CPUArchVer == 7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004005 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004006 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004007 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4008 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004009
4010 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004011 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004012
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004013 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004014 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004015 if (FPU & VFP2FPU)
4016 Builder.defineMacro("__ARM_VFPV2__");
4017 if (FPU & VFP3FPU)
4018 Builder.defineMacro("__ARM_VFPV3__");
4019 if (FPU & VFP4FPU)
4020 Builder.defineMacro("__ARM_VFPV4__");
4021 }
4022
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004023 // This only gets set when Neon instructions are actually available, unlike
4024 // the VFP define, hence the soft float and arch check. This is subtly
4025 // different from gcc, we follow the intent which was that it should be set
4026 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004027 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4028 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004029 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004030 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004031
Bernard Ogden18b57012013-10-29 09:47:51 +00004032 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004033 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004034
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004035 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004036 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4037 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4038 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4039 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4040 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004041 }
4042 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4043 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004044 Records = BuiltinInfo;
4045 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004046 }
Bob Wilsona7a61e22012-01-26 22:14:27 +00004047 virtual bool isCLZForZeroUndef() const { return false; }
Meador Inge5d3fb222012-06-16 03:34:49 +00004048 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Logan Chien57086ce2012-10-10 06:56:20 +00004049 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004050 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004051 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004052 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004053 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004054 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004055 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004056 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004057 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004058 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004059 case 'l': // r0-r7
4060 case 'h': // r8-r15
4061 case 'w': // VFP Floating point register single precision
4062 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004063 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004064 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004065 case 'Q': // A memory address that is a single base register.
4066 Info.setAllowsMemory();
4067 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004068 case 'U': // a memory reference...
4069 switch (Name[1]) {
4070 case 'q': // ...ARMV4 ldrsb
4071 case 'v': // ...VFP load/store (reg+constant offset)
4072 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004073 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004074 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004075 case 'n': // valid address for Neon doubleword vector load/store
4076 case 'm': // valid address for Neon element and structure load/store
4077 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004078 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004079 Info.setAllowsMemory();
4080 Name++;
4081 return true;
4082 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004083 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004084 return false;
4085 }
Evan Chengd863adb2011-06-16 19:13:15 +00004086 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004087 std::string R;
4088 switch (*Constraint) {
4089 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004090 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004091 Constraint++;
4092 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004093 case 'p': // 'p' should be translated to 'r' by default.
4094 R = std::string("r");
4095 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004096 default:
4097 return std::string(1, *Constraint);
4098 }
4099 return R;
4100 }
Bill Wendling9d1ee112012-10-25 23:28:48 +00004101 virtual bool validateConstraintModifier(StringRef Constraint,
4102 const char Modifier,
4103 unsigned Size) const {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004104 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004105 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004106
Bill Wendling9d1ee112012-10-25 23:28:48 +00004107 // Strip off constraint modifiers.
4108 while (Constraint[0] == '=' ||
4109 Constraint[0] == '+' ||
4110 Constraint[0] == '&')
4111 Constraint = Constraint.substr(1);
4112
4113 switch (Constraint[0]) {
4114 default: break;
4115 case 'r': {
4116 switch (Modifier) {
4117 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004118 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004119 case 'q':
4120 // A register of size 32 cannot fit a vector type.
4121 return false;
4122 }
4123 }
4124 }
4125
4126 return true;
4127 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004128 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004129 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004130 return "";
4131 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004132
4133 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
4134 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4135 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004136
4137 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4138 if (RegNo == 0) return 0;
4139 if (RegNo == 1) return 1;
4140 return -1;
4141 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004142};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004143
Rafael Espindolaeb265472013-08-21 21:59:03 +00004144bool ARMTargetInfo::setFPMath(StringRef Name) {
4145 if (Name == "neon") {
4146 FPMath = FP_Neon;
4147 return true;
4148 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4149 Name == "vfp4") {
4150 FPMath = FP_VFP;
4151 return true;
4152 }
4153 return false;
4154}
4155
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004156const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004157 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004158 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004159 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4160
4161 // Float registers
4162 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4163 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4164 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004165 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004166
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004167 // Double registers
4168 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4169 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004170 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4171 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004172
4173 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004174 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4175 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004176};
4177
4178void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004179 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004180 Names = GCCRegNames;
4181 NumNames = llvm::array_lengthof(GCCRegNames);
4182}
4183
4184const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004185 { { "a1" }, "r0" },
4186 { { "a2" }, "r1" },
4187 { { "a3" }, "r2" },
4188 { { "a4" }, "r3" },
4189 { { "v1" }, "r4" },
4190 { { "v2" }, "r5" },
4191 { { "v3" }, "r6" },
4192 { { "v4" }, "r7" },
4193 { { "v5" }, "r8" },
4194 { { "v6", "rfp" }, "r9" },
4195 { { "sl" }, "r10" },
4196 { { "fp" }, "r11" },
4197 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004198 { { "r13" }, "sp" },
4199 { { "r14" }, "lr" },
4200 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004201 // The S, D and Q registers overlap, but aren't really aliases; we
4202 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004203};
4204
4205void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4206 unsigned &NumAliases) const {
4207 Aliases = GCCRegAliases;
4208 NumAliases = llvm::array_lengthof(GCCRegAliases);
4209}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004210
4211const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004212#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004213#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004214 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004215#include "clang/Basic/BuiltinsARM.def"
4216};
Chris Lattner17df24e2008-04-21 18:56:49 +00004217} // end anonymous namespace.
4218
Eli Friedmanf05b7722008-08-20 07:44:10 +00004219namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004220class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00004221 public DarwinTargetInfo<ARMTargetInfo> {
4222protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00004223 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004224 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004225 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004226 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004227
Torok Edwinb2b37c62009-06-30 17:10:35 +00004228public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004229 DarwinARMTargetInfo(const llvm::Triple &Triple)
4230 : DarwinTargetInfo<ARMTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004231 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004232 // iOS always has 64-bit atomic instructions.
4233 // FIXME: This should be based off of the target features in ARMTargetInfo.
4234 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004235
4236 // Darwin on iOS uses a variant of the ARM C++ ABI.
4237 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004238 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004239};
4240} // end anonymous namespace.
4241
Tony Linthicum76329bf2011-12-12 21:14:55 +00004242
4243namespace {
4244// Hexagon abstract base class
4245class HexagonTargetInfo : public TargetInfo {
4246 static const Builtin::Info BuiltinInfo[];
4247 static const char * const GCCRegNames[];
4248 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4249 std::string CPU;
4250public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004251 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004252 BigEndian = false;
Rafael Espindola8ddf8bc2013-12-17 00:04:48 +00004253 DescriptionString = ("e-p:32:32-i1:32-i64:64-a:0-n32");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004254
4255 // {} in inline assembly are packet specifiers, not assembly variant
4256 // specifiers.
4257 NoAsmVariants = true;
4258 }
4259
4260 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4261 unsigned &NumRecords) const {
4262 Records = BuiltinInfo;
4263 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4264 }
4265
4266 virtual bool validateAsmConstraint(const char *&Name,
4267 TargetInfo::ConstraintInfo &Info) const {
4268 return true;
4269 }
4270
4271 virtual void getTargetDefines(const LangOptions &Opts,
4272 MacroBuilder &Builder) const;
4273
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004274 virtual bool hasFeature(StringRef Feature) const {
4275 return Feature == "hexagon";
4276 }
4277
Meador Inge5d3fb222012-06-16 03:34:49 +00004278 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4279 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004280 }
4281 virtual void getGCCRegNames(const char * const *&Names,
4282 unsigned &NumNames) const;
4283 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4284 unsigned &NumAliases) const;
4285 virtual const char *getClobbers() const {
4286 return "";
4287 }
Sebastian Pop86500282012-01-13 20:37:10 +00004288
4289 static const char *getHexagonCPUSuffix(StringRef Name) {
4290 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004291 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004292 .Case("hexagonv5", "5")
Sebastian Pop86500282012-01-13 20:37:10 +00004293 .Default(0);
4294 }
4295
Tony Linthicum76329bf2011-12-12 21:14:55 +00004296 virtual bool setCPU(const std::string &Name) {
Sebastian Pop86500282012-01-13 20:37:10 +00004297 if (!getHexagonCPUSuffix(Name))
4298 return false;
4299
Tony Linthicum76329bf2011-12-12 21:14:55 +00004300 CPU = Name;
4301 return true;
4302 }
4303};
4304
4305void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4306 MacroBuilder &Builder) const {
4307 Builder.defineMacro("qdsp6");
4308 Builder.defineMacro("__qdsp6", "1");
4309 Builder.defineMacro("__qdsp6__", "1");
4310
4311 Builder.defineMacro("hexagon");
4312 Builder.defineMacro("__hexagon", "1");
4313 Builder.defineMacro("__hexagon__", "1");
4314
4315 if(CPU == "hexagonv1") {
4316 Builder.defineMacro("__HEXAGON_V1__");
4317 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4318 if(Opts.HexagonQdsp6Compat) {
4319 Builder.defineMacro("__QDSP6_V1__");
4320 Builder.defineMacro("__QDSP6_ARCH__", "1");
4321 }
4322 }
4323 else if(CPU == "hexagonv2") {
4324 Builder.defineMacro("__HEXAGON_V2__");
4325 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4326 if(Opts.HexagonQdsp6Compat) {
4327 Builder.defineMacro("__QDSP6_V2__");
4328 Builder.defineMacro("__QDSP6_ARCH__", "2");
4329 }
4330 }
4331 else if(CPU == "hexagonv3") {
4332 Builder.defineMacro("__HEXAGON_V3__");
4333 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4334 if(Opts.HexagonQdsp6Compat) {
4335 Builder.defineMacro("__QDSP6_V3__");
4336 Builder.defineMacro("__QDSP6_ARCH__", "3");
4337 }
4338 }
4339 else if(CPU == "hexagonv4") {
4340 Builder.defineMacro("__HEXAGON_V4__");
4341 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4342 if(Opts.HexagonQdsp6Compat) {
4343 Builder.defineMacro("__QDSP6_V4__");
4344 Builder.defineMacro("__QDSP6_ARCH__", "4");
4345 }
4346 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004347 else if(CPU == "hexagonv5") {
4348 Builder.defineMacro("__HEXAGON_V5__");
4349 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4350 if(Opts.HexagonQdsp6Compat) {
4351 Builder.defineMacro("__QDSP6_V5__");
4352 Builder.defineMacro("__QDSP6_ARCH__", "5");
4353 }
4354 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004355}
4356
4357const char * const HexagonTargetInfo::GCCRegNames[] = {
4358 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4359 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4360 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4361 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4362 "p0", "p1", "p2", "p3",
4363 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4364};
4365
4366void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4367 unsigned &NumNames) const {
4368 Names = GCCRegNames;
4369 NumNames = llvm::array_lengthof(GCCRegNames);
4370}
4371
4372
4373const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4374 { { "sp" }, "r29" },
4375 { { "fp" }, "r30" },
4376 { { "lr" }, "r31" },
4377 };
4378
4379void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4380 unsigned &NumAliases) const {
4381 Aliases = GCCRegAliases;
4382 NumAliases = llvm::array_lengthof(GCCRegAliases);
4383}
4384
4385
4386const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4387#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4388#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4389 ALL_LANGUAGES },
4390#include "clang/Basic/BuiltinsHexagon.def"
4391};
4392}
4393
4394
Chris Lattner5ba61f02006-10-14 07:39:34 +00004395namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004396// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4397class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004398 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4399 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004400 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004401public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004402 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004403
Eric Christopher3ff21b32013-10-16 21:26:26 +00004404 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00004405 DiagnosticsEngine &Diags) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004406 SoftFloat = false;
4407 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4408 if (Features[i] == "+soft-float")
4409 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004410 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004411 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00004412 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004413 MacroBuilder &Builder) const {
4414 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004415 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004416
4417 if (SoftFloat)
4418 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004419 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004420
4421 virtual bool hasFeature(StringRef Feature) const {
4422 return llvm::StringSwitch<bool>(Feature)
4423 .Case("softfloat", SoftFloat)
4424 .Case("sparc", true)
4425 .Default(false);
4426 }
4427
Gabor Greif49991682008-02-21 16:29:08 +00004428 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4429 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004430 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00004431 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004432 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4433 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00004434 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004435 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00004436 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004437 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00004438 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004439 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00004440 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004441 // FIXME: Implement!
4442 return false;
Gabor Greif49991682008-02-21 16:29:08 +00004443 }
4444 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004445 // FIXME: Implement!
4446 return "";
Gabor Greif49991682008-02-21 16:29:08 +00004447 }
4448};
4449
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004450const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00004451 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4452 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4453 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4454 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4455};
4456
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004457void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4458 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004459 Names = GCCRegNames;
4460 NumNames = llvm::array_lengthof(GCCRegNames);
4461}
4462
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004463const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004464 { { "g0" }, "r0" },
4465 { { "g1" }, "r1" },
4466 { { "g2" }, "r2" },
4467 { { "g3" }, "r3" },
4468 { { "g4" }, "r4" },
4469 { { "g5" }, "r5" },
4470 { { "g6" }, "r6" },
4471 { { "g7" }, "r7" },
4472 { { "o0" }, "r8" },
4473 { { "o1" }, "r9" },
4474 { { "o2" }, "r10" },
4475 { { "o3" }, "r11" },
4476 { { "o4" }, "r12" },
4477 { { "o5" }, "r13" },
4478 { { "o6", "sp" }, "r14" },
4479 { { "o7" }, "r15" },
4480 { { "l0" }, "r16" },
4481 { { "l1" }, "r17" },
4482 { { "l2" }, "r18" },
4483 { { "l3" }, "r19" },
4484 { { "l4" }, "r20" },
4485 { { "l5" }, "r21" },
4486 { { "l6" }, "r22" },
4487 { { "l7" }, "r23" },
4488 { { "i0" }, "r24" },
4489 { { "i1" }, "r25" },
4490 { { "i2" }, "r26" },
4491 { { "i3" }, "r27" },
4492 { { "i4" }, "r28" },
4493 { { "i5" }, "r29" },
4494 { { "i6", "fp" }, "r30" },
4495 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00004496};
4497
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004498void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4499 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004500 Aliases = GCCRegAliases;
4501 NumAliases = llvm::array_lengthof(GCCRegAliases);
4502}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004503
4504// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4505class SparcV8TargetInfo : public SparcTargetInfo {
4506public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004507 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindoladc265ed2013-12-19 03:03:04 +00004508 DescriptionString = "E-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004509 }
4510
4511 virtual void getTargetDefines(const LangOptions &Opts,
4512 MacroBuilder &Builder) const {
4513 SparcTargetInfo::getTargetDefines(Opts, Builder);
4514 Builder.defineMacro("__sparcv8");
4515 }
4516};
4517
4518// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4519class SparcV9TargetInfo : public SparcTargetInfo {
4520public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004521 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004522 // FIXME: Support Sparc quad-precision long double?
Rafael Espindola47debc02013-12-16 21:59:14 +00004523 DescriptionString = "E-"
Rafael Espindola2da35322013-12-16 23:27:41 +00004524 "i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00004525 // This is an LP64 platform.
4526 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004527
4528 // OpenBSD uses long long for int64_t and intmax_t.
4529 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
4530 IntMaxType = SignedLongLong;
4531 UIntMaxType = UnsignedLongLong;
4532 } else {
4533 IntMaxType = SignedLong;
4534 UIntMaxType = UnsignedLong;
4535 }
4536 Int64Type = IntMaxType;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004537 }
4538
4539 virtual void getTargetDefines(const LangOptions &Opts,
4540 MacroBuilder &Builder) const {
4541 SparcTargetInfo::getTargetDefines(Opts, Builder);
4542 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00004543 Builder.defineMacro("__arch64__");
4544 // Solaris and its derivative AuroraUX don't need these variants, but the
4545 // BSDs do.
4546 if (getTriple().getOS() != llvm::Triple::Solaris &&
4547 getTriple().getOS() != llvm::Triple::AuroraUX) {
4548 Builder.defineMacro("__sparc64__");
4549 Builder.defineMacro("__sparc_v9__");
4550 Builder.defineMacro("__sparcv9__");
4551 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004552 }
4553};
4554
Gabor Greif49991682008-02-21 16:29:08 +00004555} // end anonymous namespace.
4556
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004557namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004558class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4559public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004560 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
4561 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004562 SizeType = UnsignedInt;
4563 PtrDiffType = SignedInt;
4564 }
4565};
Torok Edwinb2b37c62009-06-30 17:10:35 +00004566class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004567public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004568 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
4569 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00004570 SizeType = UnsignedInt;
4571 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004572 }
4573};
4574} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00004575
Chris Lattnerb781dc792008-05-08 05:58:21 +00004576namespace {
Ulrich Weigand47445072013-05-06 16:26:41 +00004577 class SystemZTargetInfo : public TargetInfo {
4578 static const char *const GCCRegNames[];
4579
4580 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004581 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Ulrich Weigand47445072013-05-06 16:26:41 +00004582 TLSSupported = true;
4583 IntWidth = IntAlign = 32;
4584 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
4585 PointerWidth = PointerAlign = 64;
4586 LongDoubleWidth = 128;
4587 LongDoubleAlign = 64;
4588 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4589 MinGlobalAlign = 16;
Rafael Espindola04c685b2013-12-16 22:50:41 +00004590 DescriptionString = "E-i1:8:16-i8:8:16-i64:64"
4591 "-f128:64-a:8:16-n32:64";
Ulrich Weigand47445072013-05-06 16:26:41 +00004592 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4593 }
4594 virtual void getTargetDefines(const LangOptions &Opts,
4595 MacroBuilder &Builder) const {
4596 Builder.defineMacro("__s390__");
4597 Builder.defineMacro("__s390x__");
4598 Builder.defineMacro("__zarch__");
4599 Builder.defineMacro("__LONG_DOUBLE_128__");
4600 }
4601 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4602 unsigned &NumRecords) const {
4603 // FIXME: Implement.
4604 Records = 0;
4605 NumRecords = 0;
4606 }
4607
4608 virtual void getGCCRegNames(const char *const *&Names,
4609 unsigned &NumNames) const;
4610 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4611 unsigned &NumAliases) const {
4612 // No aliases.
4613 Aliases = 0;
4614 NumAliases = 0;
4615 }
4616 virtual bool validateAsmConstraint(const char *&Name,
4617 TargetInfo::ConstraintInfo &info) const;
4618 virtual const char *getClobbers() const {
4619 // FIXME: Is this really right?
4620 return "";
4621 }
4622 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4623 return TargetInfo::SystemZBuiltinVaList;
4624 }
Richard Sandiford4652d892013-07-19 16:51:51 +00004625 virtual bool setCPU(const std::string &Name) {
4626 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4627 .Case("z10", true)
4628 .Case("z196", true)
4629 .Case("zEC12", true)
4630 .Default(false);
4631
4632 // No need to store the CPU yet. There aren't any CPU-specific
4633 // macros to define.
4634 return CPUKnown;
4635 }
Ulrich Weigand47445072013-05-06 16:26:41 +00004636 };
4637
4638 const char *const SystemZTargetInfo::GCCRegNames[] = {
4639 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4640 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4641 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
4642 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
4643 };
4644
4645 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
4646 unsigned &NumNames) const {
4647 Names = GCCRegNames;
4648 NumNames = llvm::array_lengthof(GCCRegNames);
4649 }
4650
4651 bool SystemZTargetInfo::
4652 validateAsmConstraint(const char *&Name,
4653 TargetInfo::ConstraintInfo &Info) const {
4654 switch (*Name) {
4655 default:
4656 return false;
4657
4658 case 'a': // Address register
4659 case 'd': // Data register (equivalent to 'r')
4660 case 'f': // Floating-point register
4661 Info.setAllowsRegister();
4662 return true;
4663
4664 case 'I': // Unsigned 8-bit constant
4665 case 'J': // Unsigned 12-bit constant
4666 case 'K': // Signed 16-bit constant
4667 case 'L': // Signed 20-bit displacement (on all targets we support)
4668 case 'M': // 0x7fffffff
4669 return true;
4670
4671 case 'Q': // Memory with base and unsigned 12-bit displacement
4672 case 'R': // Likewise, plus an index
4673 case 'S': // Memory with base and signed 20-bit displacement
4674 case 'T': // Likewise, plus an index
4675 Info.setAllowsMemory();
4676 return true;
4677 }
4678 }
4679}
4680
4681namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004682 class MSP430TargetInfo : public TargetInfo {
4683 static const char * const GCCRegNames[];
4684 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004685 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004686 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004687 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00004688 IntWidth = 16; IntAlign = 16;
4689 LongWidth = 32; LongLongWidth = 64;
4690 LongAlign = LongLongAlign = 16;
4691 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004692 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004693 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00004694 IntMaxType = SignedLongLong;
4695 UIntMaxType = UnsignedLongLong;
4696 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004697 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00004698 SigAtomicType = SignedLong;
Rafael Espindola2da35322013-12-16 23:27:41 +00004699 DescriptionString = "e-p:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004700 }
4701 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004702 MacroBuilder &Builder) const {
4703 Builder.defineMacro("MSP430");
4704 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004705 // FIXME: defines for different 'flavours' of MCU
4706 }
4707 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4708 unsigned &NumRecords) const {
4709 // FIXME: Implement.
4710 Records = 0;
4711 NumRecords = 0;
4712 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004713 virtual bool hasFeature(StringRef Feature) const {
4714 return Feature == "msp430";
4715 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004716 virtual void getGCCRegNames(const char * const *&Names,
4717 unsigned &NumNames) const;
4718 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4719 unsigned &NumAliases) const {
4720 // No aliases.
4721 Aliases = 0;
4722 NumAliases = 0;
4723 }
4724 virtual bool validateAsmConstraint(const char *&Name,
4725 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00004726 // No target constraints for now.
4727 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004728 }
4729 virtual const char *getClobbers() const {
4730 // FIXME: Is this really right?
4731 return "";
4732 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004733 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004734 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00004735 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004736 }
4737 };
4738
4739 const char * const MSP430TargetInfo::GCCRegNames[] = {
4740 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4741 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4742 };
4743
4744 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4745 unsigned &NumNames) const {
4746 Names = GCCRegNames;
4747 NumNames = llvm::array_lengthof(GCCRegNames);
4748 }
4749}
4750
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00004751namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004752
Mike Stump11289f42009-09-09 15:08:12 +00004753 // LLVM and Clang cannot be used directly to output native binaries for
4754 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00004755 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00004756 //
4757 // TCE uses the llvm bitcode as input and uses it for generating customized
4758 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00004759 // publicly available in http://tce.cs.tut.fi
4760
Eli Friedman1f191002011-10-07 19:51:42 +00004761 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4762 3, // opencl_global
4763 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00004764 5, // opencl_constant
4765 0, // cuda_device
4766 0, // cuda_constant
4767 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00004768 };
4769
Eli Friedmana9c3d712009-08-19 20:47:07 +00004770 class TCETargetInfo : public TargetInfo{
4771 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004772 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004773 TLSSupported = false;
4774 IntWidth = 32;
4775 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004776 PointerWidth = 32;
4777 IntAlign = 32;
4778 LongAlign = LongLongAlign = 32;
4779 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004780 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004781 SizeType = UnsignedInt;
4782 IntMaxType = SignedLong;
4783 UIntMaxType = UnsignedLong;
4784 IntPtrType = SignedInt;
4785 PtrDiffType = SignedInt;
4786 FloatWidth = 32;
4787 FloatAlign = 32;
4788 DoubleWidth = 32;
4789 DoubleAlign = 32;
4790 LongDoubleWidth = 32;
4791 LongDoubleAlign = 32;
4792 FloatFormat = &llvm::APFloat::IEEEsingle;
4793 DoubleFormat = &llvm::APFloat::IEEEsingle;
4794 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola2da35322013-12-16 23:27:41 +00004795 DescriptionString = "E-p:32:32-i8:8:32-"
4796 "i16:16:32-i64:32"
4797 "-f64:32-v64:32-"
4798 "v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00004799 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00004800 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004801 }
4802
4803 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004804 MacroBuilder &Builder) const {
4805 DefineStd(Builder, "tce", Opts);
4806 Builder.defineMacro("__TCE__");
4807 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00004808 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004809 virtual bool hasFeature(StringRef Feature) const {
4810 return Feature == "tce";
4811 }
4812
Eli Friedmana9c3d712009-08-19 20:47:07 +00004813 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4814 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00004815 virtual const char *getClobbers() const {
4816 return "";
4817 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004818 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4819 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004820 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00004821 virtual void getGCCRegNames(const char * const *&Names,
4822 unsigned &NumNames) const {}
4823 virtual bool validateAsmConstraint(const char *&Name,
4824 TargetInfo::ConstraintInfo &info) const {
4825 return true;
4826 }
4827 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4828 unsigned &NumAliases) const {}
4829 };
4830}
4831
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004832namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004833class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00004834 virtual void setDescriptionString() = 0;
4835
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004836 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004837 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00004838 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00004839 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004840 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00004841 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004842 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00004843 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004844 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004845 enum DspRevEnum {
4846 NoDSP, DSP1, DSP2
4847 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00004848 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004849
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004850protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00004851 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004852 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004853
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004854public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004855 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
4856 const std::string &CPUStr)
4857 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004858 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004859 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004860
Eric Christopher0b26a612010-03-02 02:41:08 +00004861 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004862 virtual bool setABI(const std::string &Name) = 0;
Eric Christopher0b26a612010-03-02 02:41:08 +00004863 virtual bool setCPU(const std::string &Name) {
4864 CPU = Name;
4865 return true;
4866 }
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00004867 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christopher0b26a612010-03-02 02:41:08 +00004868 Features[ABI] = true;
4869 Features[CPU] = true;
4870 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004871
Simon Atanasyan16ee0052012-08-29 19:59:32 +00004872 virtual void getTargetDefines(const LangOptions &Opts,
4873 MacroBuilder &Builder) const {
Simon Atanasyan683535b2012-08-29 19:14:58 +00004874 DefineStd(Builder, "mips", Opts);
4875 Builder.defineMacro("_mips");
4876 Builder.defineMacro("__REGISTER_PREFIX__", "");
4877
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004878 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004879 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004880 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004881 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004882 case SoftFloat:
4883 Builder.defineMacro("__mips_soft_float", Twine(1));
4884 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004885 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00004886
Simon Atanasyan16071912013-04-14 14:07:30 +00004887 if (IsSingleFloat)
4888 Builder.defineMacro("__mips_single_float", Twine(1));
4889
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004890 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
4891 Builder.defineMacro("_MIPS_FPSET",
4892 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
4893
Simon Atanasyan72244b62012-07-05 16:06:06 +00004894 if (IsMips16)
4895 Builder.defineMacro("__mips16", Twine(1));
4896
Simon Atanasyan60777612013-04-14 14:07:51 +00004897 if (IsMicromips)
4898 Builder.defineMacro("__mips_micromips", Twine(1));
4899
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004900 if (IsNan2008)
4901 Builder.defineMacro("__mips_nan2008", Twine(1));
4902
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004903 switch (DspRev) {
4904 default:
4905 break;
4906 case DSP1:
4907 Builder.defineMacro("__mips_dsp_rev", Twine(1));
4908 Builder.defineMacro("__mips_dsp", Twine(1));
4909 break;
4910 case DSP2:
4911 Builder.defineMacro("__mips_dsp_rev", Twine(2));
4912 Builder.defineMacro("__mips_dspr2", Twine(1));
4913 Builder.defineMacro("__mips_dsp", Twine(1));
4914 break;
4915 }
4916
Jack Carter44ff1e52013-08-12 17:20:29 +00004917 if (HasMSA)
4918 Builder.defineMacro("__mips_msa", Twine(1));
4919
Simon Atanasyan26f19672012-04-05 19:28:31 +00004920 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
4921 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
4922 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00004923
4924 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
4925 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004926 }
4927
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004928 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4929 unsigned &NumRecords) const {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004930 Records = BuiltinInfo;
4931 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004932 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004933 virtual bool hasFeature(StringRef Feature) const {
Akira Hatanaka618b2982013-10-29 19:00:35 +00004934 return llvm::StringSwitch<bool>(Feature)
4935 .Case("mips", true)
4936 .Case("fp64", HasFP64)
4937 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004938 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004939 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4940 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004941 }
4942 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004943 unsigned &NumNames) const {
Daniel Sanders8b59af12013-11-12 12:56:01 +00004944 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00004945 // CPU register names
4946 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004947 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
4948 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
4949 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00004950 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
4951 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004952 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
4953 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
4954 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
4955 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00004956 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004957 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00004958 "$fcc5","$fcc6","$fcc7",
4959 // MSA register names
4960 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
4961 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
4962 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
4963 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
4964 // MSA control register names
4965 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
4966 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004967 };
4968 Names = GCCRegNames;
4969 NumNames = llvm::array_lengthof(GCCRegNames);
4970 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004971 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004972 unsigned &NumAliases) const = 0;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004973 virtual bool validateAsmConstraint(const char *&Name,
4974 TargetInfo::ConstraintInfo &Info) const {
4975 switch (*Name) {
4976 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00004977 return false;
4978
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004979 case 'r': // CPU registers.
4980 case 'd': // Equivalent to "r" unless generating MIPS16 code.
4981 case 'y': // Equivalent to "r", backwards compatibility only.
4982 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00004983 case 'c': // $25 for indirect jumps
4984 case 'l': // lo register
4985 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004986 Info.setAllowsRegister();
4987 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00004988 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00004989 Info.setAllowsMemory();
4990 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004991 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004992 }
4993
4994 virtual const char *getClobbers() const {
4995 // FIXME: Implement!
4996 return "";
4997 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004998
Eric Christopher3ff21b32013-10-16 21:26:26 +00004999 virtual bool handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00005000 DiagnosticsEngine &Diags) {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005001 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005002 IsMicromips = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005003 IsNan2008 = false;
Simon Atanasyan16071912013-04-14 14:07:30 +00005004 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005005 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005006 DspRev = NoDSP;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005007 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005008
5009 for (std::vector<std::string>::iterator it = Features.begin(),
5010 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005011 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005012 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005013 else if (*it == "+soft-float")
5014 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005015 else if (*it == "+mips16")
5016 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005017 else if (*it == "+micromips")
5018 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005019 else if (*it == "+dsp")
5020 DspRev = std::max(DspRev, DSP1);
5021 else if (*it == "+dspr2")
5022 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005023 else if (*it == "+msa")
5024 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005025 else if (*it == "+fp64")
5026 HasFP64 = true;
5027 else if (*it == "-fp64")
5028 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005029 else if (*it == "+nan2008")
5030 IsNan2008 = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005031 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005032
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005033 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005034 std::vector<std::string>::iterator it =
5035 std::find(Features.begin(), Features.end(), "+soft-float");
5036 if (it != Features.end())
5037 Features.erase(it);
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005038 it = std::find(Features.begin(), Features.end(), "+nan2008");
5039 if (it != Features.end())
5040 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005041
Akira Hatanaka9064e362013-10-29 18:30:33 +00005042 setDescriptionString();
5043
Rafael Espindolaeb265472013-08-21 21:59:03 +00005044 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005045 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005046
5047 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
5048 if (RegNo == 0) return 4;
5049 if (RegNo == 1) return 5;
5050 return -1;
5051 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005052};
5053
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005054const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5055#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5056#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5057 ALL_LANGUAGES },
5058#include "clang/Basic/BuiltinsMips.def"
5059};
5060
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005061class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005062public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005063 Mips32TargetInfoBase(const llvm::Triple &Triple)
5064 : MipsTargetInfoBase(Triple, "o32", "mips32") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005065 SizeType = UnsignedInt;
5066 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005067 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005068 }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005069 virtual bool setABI(const std::string &Name) {
5070 if ((Name == "o32") || (Name == "eabi")) {
5071 ABI = Name;
5072 return true;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005073 } else if (Name == "32") {
5074 ABI = "o32";
5075 return true;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005076 } else
5077 return false;
5078 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005079 virtual void getTargetDefines(const LangOptions &Opts,
5080 MacroBuilder &Builder) const {
5081 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005082
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005083 if (ABI == "o32") {
5084 Builder.defineMacro("__mips_o32");
5085 Builder.defineMacro("_ABIO32", "1");
5086 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5087 }
5088 else if (ABI == "eabi")
5089 Builder.defineMacro("__mips_eabi");
5090 else
David Blaikie83d382b2011-09-23 05:06:16 +00005091 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005092 }
5093 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5094 unsigned &NumAliases) const {
5095 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5096 { { "at" }, "$1" },
5097 { { "v0" }, "$2" },
5098 { { "v1" }, "$3" },
5099 { { "a0" }, "$4" },
5100 { { "a1" }, "$5" },
5101 { { "a2" }, "$6" },
5102 { { "a3" }, "$7" },
5103 { { "t0" }, "$8" },
5104 { { "t1" }, "$9" },
5105 { { "t2" }, "$10" },
5106 { { "t3" }, "$11" },
5107 { { "t4" }, "$12" },
5108 { { "t5" }, "$13" },
5109 { { "t6" }, "$14" },
5110 { { "t7" }, "$15" },
5111 { { "s0" }, "$16" },
5112 { { "s1" }, "$17" },
5113 { { "s2" }, "$18" },
5114 { { "s3" }, "$19" },
5115 { { "s4" }, "$20" },
5116 { { "s5" }, "$21" },
5117 { { "s6" }, "$22" },
5118 { { "s7" }, "$23" },
5119 { { "t8" }, "$24" },
5120 { { "t9" }, "$25" },
5121 { { "k0" }, "$26" },
5122 { { "k1" }, "$27" },
5123 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005124 { { "sp","$sp" }, "$29" },
5125 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005126 { { "ra" }, "$31" }
5127 };
5128 Aliases = GCCRegAliases;
5129 NumAliases = llvm::array_lengthof(GCCRegAliases);
5130 }
5131};
5132
5133class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005134 virtual void setDescriptionString() {
Rafael Espindola2da35322013-12-16 23:27:41 +00005135 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-"
5136 "i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005137 }
5138
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005139public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005140 Mips32EBTargetInfo(const llvm::Triple &Triple)
5141 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005142 }
5143 virtual void getTargetDefines(const LangOptions &Opts,
5144 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005145 DefineStd(Builder, "MIPSEB", Opts);
5146 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005147 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005148 }
5149};
5150
5151class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005152 virtual void setDescriptionString() {
Rafael Espindola2da35322013-12-16 23:27:41 +00005153 DescriptionString = "e-p:32:32-i8:8:32-i16:16:32-"
5154 "i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005155 }
5156
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005157public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005158 Mips32ELTargetInfo(const llvm::Triple &Triple)
5159 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005160 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005161 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005162 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005163 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005164 DefineStd(Builder, "MIPSEL", Opts);
5165 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005166 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005167 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005168};
Akira Hatanakabef17452011-09-20 19:21:49 +00005169
5170class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005171public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005172 Mips64TargetInfoBase(const llvm::Triple &Triple)
5173 : MipsTargetInfoBase(Triple, "n64", "mips64") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005174 LongWidth = LongAlign = 64;
5175 PointerWidth = PointerAlign = 64;
5176 LongDoubleWidth = LongDoubleAlign = 128;
5177 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005178 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5179 LongDoubleWidth = LongDoubleAlign = 64;
5180 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5181 }
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005182 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005183 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005184 }
Akira Hatanakabef17452011-09-20 19:21:49 +00005185 virtual bool setABI(const std::string &Name) {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005186 if (Name == "n32") {
5187 LongWidth = LongAlign = 32;
5188 PointerWidth = PointerAlign = 32;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005189 ABI = Name;
5190 return true;
5191 } else if (Name == "n64") {
5192 ABI = Name;
5193 return true;
5194 } else if (Name == "64") {
5195 ABI = "n64";
5196 return true;
5197 } else
5198 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005199 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005200 virtual void getTargetDefines(const LangOptions &Opts,
5201 MacroBuilder &Builder) const {
5202 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005203
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005204 Builder.defineMacro("__mips64");
5205 Builder.defineMacro("__mips64__");
5206
Akira Hatanakabef17452011-09-20 19:21:49 +00005207 if (ABI == "n32") {
5208 Builder.defineMacro("__mips_n32");
5209 Builder.defineMacro("_ABIN32", "2");
5210 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5211 }
5212 else if (ABI == "n64") {
5213 Builder.defineMacro("__mips_n64");
5214 Builder.defineMacro("_ABI64", "3");
5215 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5216 }
5217 else
David Blaikie83d382b2011-09-23 05:06:16 +00005218 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005219 }
5220 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5221 unsigned &NumAliases) const {
5222 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5223 { { "at" }, "$1" },
5224 { { "v0" }, "$2" },
5225 { { "v1" }, "$3" },
5226 { { "a0" }, "$4" },
5227 { { "a1" }, "$5" },
5228 { { "a2" }, "$6" },
5229 { { "a3" }, "$7" },
5230 { { "a4" }, "$8" },
5231 { { "a5" }, "$9" },
5232 { { "a6" }, "$10" },
5233 { { "a7" }, "$11" },
5234 { { "t0" }, "$12" },
5235 { { "t1" }, "$13" },
5236 { { "t2" }, "$14" },
5237 { { "t3" }, "$15" },
5238 { { "s0" }, "$16" },
5239 { { "s1" }, "$17" },
5240 { { "s2" }, "$18" },
5241 { { "s3" }, "$19" },
5242 { { "s4" }, "$20" },
5243 { { "s5" }, "$21" },
5244 { { "s6" }, "$22" },
5245 { { "s7" }, "$23" },
5246 { { "t8" }, "$24" },
5247 { { "t9" }, "$25" },
5248 { { "k0" }, "$26" },
5249 { { "k1" }, "$27" },
5250 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005251 { { "sp","$sp" }, "$29" },
5252 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005253 { { "ra" }, "$31" }
5254 };
5255 Aliases = GCCRegAliases;
5256 NumAliases = llvm::array_lengthof(GCCRegAliases);
5257 }
5258};
5259
5260class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005261 virtual void setDescriptionString() {
5262 if (ABI == "n32")
Rafael Espindola2da35322013-12-16 23:27:41 +00005263 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00005264 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005265 "n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005266 else
Rafael Espindola47debc02013-12-16 21:59:14 +00005267 DescriptionString = "E-i8:8:32-i16:16:32-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00005268 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005269 "n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005270
Akira Hatanakabef17452011-09-20 19:21:49 +00005271 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005272
Akira Hatanakabef17452011-09-20 19:21:49 +00005273public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005274 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005275 : Mips64TargetInfoBase(Triple) {}
Akira Hatanakabef17452011-09-20 19:21:49 +00005276 virtual void getTargetDefines(const LangOptions &Opts,
5277 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00005278 DefineStd(Builder, "MIPSEB", Opts);
5279 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005280 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005281 }
5282};
5283
5284class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005285 virtual void setDescriptionString() {
5286 if (ABI == "n32")
Rafael Espindola2da35322013-12-16 23:27:41 +00005287 DescriptionString = "e-p:32:32-i8:8:32-i16:16:32-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00005288 "i64:64"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005289 "-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005290 else
Rafael Espindola47debc02013-12-16 21:59:14 +00005291 DescriptionString = "e-i8:8:32-i16:16:32-"
Rafael Espindolaf034b6e2013-12-17 16:07:35 +00005292 "i64:64-"
Rafael Espindola8a91f2f2013-12-16 21:38:22 +00005293 "n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005294 }
5295public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005296 Mips64ELTargetInfo(const llvm::Triple &Triple)
5297 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005298 // Default ABI is n64.
5299 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005300 }
5301 virtual void getTargetDefines(const LangOptions &Opts,
5302 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00005303 DefineStd(Builder, "MIPSEL", Opts);
5304 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005305 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005306 }
5307};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005308} // end anonymous namespace.
5309
Ivan Krasindd7403e2011-08-24 20:22:22 +00005310namespace {
5311class PNaClTargetInfo : public TargetInfo {
5312public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005313 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005314 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005315 this->UserLabelPrefix = "";
5316 this->LongAlign = 32;
5317 this->LongWidth = 32;
5318 this->PointerAlign = 32;
5319 this->PointerWidth = 32;
5320 this->IntMaxType = TargetInfo::SignedLongLong;
5321 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5322 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005323 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005324 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005325 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005326 this->SizeType = TargetInfo::UnsignedInt;
5327 this->PtrDiffType = TargetInfo::SignedInt;
5328 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005329 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005330 }
5331
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005332 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005333 }
5334 virtual void getArchDefines(const LangOptions &Opts,
5335 MacroBuilder &Builder) const {
5336 Builder.defineMacro("__le32__");
5337 Builder.defineMacro("__pnacl__");
5338 }
5339 virtual void getTargetDefines(const LangOptions &Opts,
5340 MacroBuilder &Builder) const {
Jan Wen Voung1d4c2d92012-03-29 00:05:59 +00005341 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasindd7403e2011-08-24 20:22:22 +00005342 getArchDefines(Opts, Builder);
5343 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005344 virtual bool hasFeature(StringRef Feature) const {
5345 return Feature == "pnacl";
5346 }
Ivan Krasindd7403e2011-08-24 20:22:22 +00005347 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5348 unsigned &NumRecords) const {
5349 }
Meador Inge5d3fb222012-06-16 03:34:49 +00005350 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5351 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005352 }
5353 virtual void getGCCRegNames(const char * const *&Names,
5354 unsigned &NumNames) const;
5355 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5356 unsigned &NumAliases) const;
5357 virtual bool validateAsmConstraint(const char *&Name,
5358 TargetInfo::ConstraintInfo &Info) const {
5359 return false;
5360 }
5361
5362 virtual const char *getClobbers() const {
5363 return "";
5364 }
5365};
5366
5367void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5368 unsigned &NumNames) const {
5369 Names = NULL;
5370 NumNames = 0;
5371}
5372
5373void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5374 unsigned &NumAliases) const {
5375 Aliases = NULL;
5376 NumAliases = 0;
5377}
5378} // end anonymous namespace.
5379
Guy Benyeib798fc92012-12-11 21:38:14 +00005380namespace {
5381 static const unsigned SPIRAddrSpaceMap[] = {
5382 1, // opencl_global
5383 3, // opencl_local
5384 2, // opencl_constant
5385 0, // cuda_device
5386 0, // cuda_constant
5387 0 // cuda_shared
5388 };
5389 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00005390 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005391 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005392 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5393 "SPIR target must use unknown OS");
5394 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5395 "SPIR target must use unknown environment type");
5396 BigEndian = false;
5397 TLSSupported = false;
5398 LongWidth = LongAlign = 64;
5399 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005400 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00005401 // Define available target features
5402 // These must be defined in sorted order!
5403 NoAsmVariants = true;
5404 }
5405 virtual void getTargetDefines(const LangOptions &Opts,
5406 MacroBuilder &Builder) const {
5407 DefineStd(Builder, "SPIR", Opts);
5408 }
5409 virtual bool hasFeature(StringRef Feature) const {
5410 return Feature == "spir";
5411 }
5412
5413 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5414 unsigned &NumRecords) const {}
5415 virtual const char *getClobbers() const {
5416 return "";
5417 }
5418 virtual void getGCCRegNames(const char * const *&Names,
5419 unsigned &NumNames) const {}
5420 virtual bool validateAsmConstraint(const char *&Name,
5421 TargetInfo::ConstraintInfo &info) const {
5422 return true;
5423 }
5424 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5425 unsigned &NumAliases) const {}
5426 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5427 return TargetInfo::VoidPtrBuiltinVaList;
5428 }
5429 };
5430
5431
5432 class SPIR32TargetInfo : public SPIRTargetInfo {
5433 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005434 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005435 PointerWidth = PointerAlign = 32;
5436 SizeType = TargetInfo::UnsignedInt;
5437 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5438 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00005439 = "e-p:32:32-i64:64"
5440 "-v16:16-v24:32-v32:32-v48:64-"
5441 "v96:128-v192:256-v256:256-"
5442 "v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005443 }
5444 virtual void getTargetDefines(const LangOptions &Opts,
5445 MacroBuilder &Builder) const {
5446 DefineStd(Builder, "SPIR32", Opts);
5447 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005448 };
5449
5450 class SPIR64TargetInfo : public SPIRTargetInfo {
5451 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005452 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005453 PointerWidth = PointerAlign = 64;
5454 SizeType = TargetInfo::UnsignedLong;
5455 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
5456 DescriptionString
Rafael Espindola2da35322013-12-16 23:27:41 +00005457 = "e-i64:64"
5458 "-v16:16-v24:32-v32:32-v48:64-"
5459 "v96:128-v192:256-v256:256-"
5460 "v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005461 }
5462 virtual void getTargetDefines(const LangOptions &Opts,
5463 MacroBuilder &Builder) const {
5464 DefineStd(Builder, "SPIR64", Opts);
5465 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005466 };
5467}
5468
Robert Lytton0e076492013-08-13 09:43:10 +00005469namespace {
5470class XCoreTargetInfo : public TargetInfo {
5471 static const Builtin::Info BuiltinInfo[];
5472public:
5473 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5474 BigEndian = false;
5475 NoAsmVariants = true;
5476 LongLongAlign = 32;
5477 SuitableAlign = 32;
5478 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00005479 SizeType = UnsignedInt;
5480 PtrDiffType = SignedInt;
5481 IntPtrType = SignedInt;
5482 WCharType = UnsignedChar;
5483 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00005484 UseZeroLengthBitfieldAlignment = true;
Rafael Espindola8ddf8bc2013-12-17 00:04:48 +00005485 DescriptionString = "e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
Rafael Espindola26c67b72013-12-17 14:34:42 +00005486 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00005487 }
5488 virtual void getTargetDefines(const LangOptions &Opts,
5489 MacroBuilder &Builder) const {
5490 Builder.defineMacro("__XS1B__");
5491 }
5492 virtual void getTargetBuiltins(const Builtin::Info *&Records,
5493 unsigned &NumRecords) const {
5494 Records = BuiltinInfo;
5495 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5496 }
5497 virtual BuiltinVaListKind getBuiltinVaListKind() const {
5498 return TargetInfo::VoidPtrBuiltinVaList;
5499 }
5500 virtual const char *getClobbers() const {
5501 return "";
5502 }
5503 virtual void getGCCRegNames(const char * const *&Names,
5504 unsigned &NumNames) const {
5505 static const char * const GCCRegNames[] = {
5506 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5507 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
5508 };
5509 Names = GCCRegNames;
5510 NumNames = llvm::array_lengthof(GCCRegNames);
5511 }
5512 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
5513 unsigned &NumAliases) const {
5514 Aliases = NULL;
5515 NumAliases = 0;
5516 }
5517 virtual bool validateAsmConstraint(const char *&Name,
5518 TargetInfo::ConstraintInfo &Info) const {
5519 return false;
5520 }
5521};
5522
5523const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
5524#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5525#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5526 ALL_LANGUAGES },
5527#include "clang/Basic/BuiltinsXCore.def"
5528};
5529} // end anonymous namespace.
5530
Ivan Krasindd7403e2011-08-24 20:22:22 +00005531
Chris Lattner5ba61f02006-10-14 07:39:34 +00005532//===----------------------------------------------------------------------===//
5533// Driver code
5534//===----------------------------------------------------------------------===//
5535
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005536static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00005537 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00005538
Daniel Dunbar52322032009-08-18 05:47:58 +00005539 switch (Triple.getArch()) {
5540 default:
5541 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00005542
Robert Lytton0e076492013-08-13 09:43:10 +00005543 case llvm::Triple::xcore:
5544 return new XCoreTargetInfo(Triple);
5545
Tony Linthicum76329bf2011-12-12 21:14:55 +00005546 case llvm::Triple::hexagon:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005547 return new HexagonTargetInfo(Triple);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005548
Tim Northover9bb857a2013-01-31 12:13:10 +00005549 case llvm::Triple::aarch64:
5550 switch (os) {
5551 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005552 return new LinuxTargetInfo<AArch64TargetInfo>(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005553 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005554 return new AArch64TargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005555 }
5556
Daniel Dunbar52322032009-08-18 05:47:58 +00005557 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00005558 case llvm::Triple::thumb:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005559 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005560 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005561
Daniel Dunbar52322032009-08-18 05:47:58 +00005562 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00005563 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005564 return new LinuxTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005565 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005566 return new FreeBSDTargetInfo<ARMTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005567 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005568 return new NetBSDTargetInfo<ARMTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005569 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005570 return new OpenBSDTargetInfo<ARMTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005571 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005572 return new BitrigTargetInfo<ARMTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005573 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005574 return new RTEMSTargetInfo<ARMTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005575 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005576 return new NaClTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005577 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005578 return new ARMTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005579 }
Eli Friedmanb5366062008-05-20 14:21:01 +00005580
Daniel Dunbar52322032009-08-18 05:47:58 +00005581 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005582 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00005583
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005584 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005585 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005586 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005587 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005588 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005589 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005590 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005591 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005592 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005593 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005594 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005595 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005596 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005597
5598 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005599 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005600 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005601 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005602 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005603 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005604 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005605 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005606 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005607 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00005608 case llvm::Triple::NaCl:
5609 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005610 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005611 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005612 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005613
Akira Hatanakabef17452011-09-20 19:21:49 +00005614 case llvm::Triple::mips64:
5615 switch (os) {
5616 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005617 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005618 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005619 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005620 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005621 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005622 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005623 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005624 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005625 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005626 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005627 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005628 }
5629
5630 case llvm::Triple::mips64el:
5631 switch (os) {
5632 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005633 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005634 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005635 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005636 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005637 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005638 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005639 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005640 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005641 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005642 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005643 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005644 }
5645
Ivan Krasindd7403e2011-08-24 20:22:22 +00005646 case llvm::Triple::le32:
5647 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00005648 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005649 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00005650 default:
5651 return NULL;
5652 }
5653
Daniel Dunbar52322032009-08-18 05:47:58 +00005654 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005655 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005656 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005657 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005658 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005659 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005660 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005661 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005662 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005663 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005664 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005665 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005666 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005667 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005668 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005669 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005670 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005671
5672 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005673 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005674 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005675 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005676 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005677 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005678 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005679 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005680 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005681 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005682 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005683 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005684 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005685 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005686 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005687
Bill Schmidt778d3872013-07-26 01:36:11 +00005688 case llvm::Triple::ppc64le:
5689 switch (os) {
5690 case llvm::Triple::Linux:
5691 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
5692 default:
5693 return new PPC64TargetInfo(Triple);
5694 }
5695
Peter Collingbournec947aae2012-05-20 23:28:41 +00005696 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005697 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005698 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005699 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005700
Eli Friedmand13b41e2012-10-12 23:32:00 +00005701 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005702 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00005703
Daniel Dunbar52322032009-08-18 05:47:58 +00005704 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005705 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005706 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005707 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005708 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005709 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005710 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005711 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005712 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005713 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005714 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005715 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005716 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005717 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005718 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005719 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005720 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005721
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005722 case llvm::Triple::sparcv9:
5723 switch (os) {
5724 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005725 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005726 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005727 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005728 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005729 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005730 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005731 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005732 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005733 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005734 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005735 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005736 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005737 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005738 }
5739
Ulrich Weigand47445072013-05-06 16:26:41 +00005740 case llvm::Triple::systemz:
5741 switch (os) {
5742 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005743 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005744 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005745 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005746 }
5747
Eli Friedmana9c3d712009-08-19 20:47:07 +00005748 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005749 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00005750
Daniel Dunbar52322032009-08-18 05:47:58 +00005751 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005752 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005753 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005754
Daniel Dunbar52322032009-08-18 05:47:58 +00005755 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005756 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005757 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005758 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005759 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005760 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005761 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005762 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005763 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005764 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005765 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005766 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005767 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005768 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005769 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005770 case llvm::Triple::KFreeBSD:
5771 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005772 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005773 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005774 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005775 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005776 case llvm::Triple::Cygwin:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005777 return new CygwinX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005778 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005779 return new MinGWX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005780 case llvm::Triple::Win32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005781 return new VisualStudioWindowsX86_32TargetInfo(Triple);
Chris Lattnerb986aba2010-04-11 19:29:39 +00005782 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005783 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005784 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005785 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005786 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005787 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005788 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005789 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005790 }
5791
5792 case llvm::Triple::x86_64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005793 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005794 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005795
Daniel Dunbar52322032009-08-18 05:47:58 +00005796 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005797 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005798 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005799 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005800 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00005801 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005802 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005803 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005804 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005805 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005806 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005807 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005808 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005809 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005810 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005811 case llvm::Triple::KFreeBSD:
5812 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005813 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005814 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00005815 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005816 return new MinGWX86_64TargetInfo(Triple);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00005817 case llvm::Triple::Win32: // This is what Triple.h supports now.
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005818 return new VisualStudioWindowsX86_64TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005819 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005820 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005821 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005822 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005823 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005824
5825 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005826 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005827 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005828 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005829 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005830 }
5831 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005832 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005833 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005834 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005835 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005836 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005837 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00005838}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005839
5840/// CreateTargetInfo - Return the target info object for the specified target
5841/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00005842TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregorf8715de2012-11-16 04:24:59 +00005843 TargetOptions *Opts) {
5844 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005845
5846 // Construct the target
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005847 OwningPtr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005848 if (!Target) {
5849 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5850 return 0;
5851 }
Douglas Gregorbc10b9f2012-10-15 16:45:32 +00005852 Target->setTargetOpts(Opts);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005853
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005854 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005855 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5856 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005857 return 0;
5858 }
5859
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005860 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005861 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5862 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005863 return 0;
5864 }
5865
Charles Davis95a546e2010-06-11 01:06:47 +00005866 // Set the target C++ ABI.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005867 if (!Opts->CXXABI.empty() && !Target->setCXXABI(Opts->CXXABI)) {
5868 Diags.Report(diag::err_target_unknown_cxxabi) << Opts->CXXABI;
Charles Davis95a546e2010-06-11 01:06:47 +00005869 return 0;
5870 }
5871
Rafael Espindolaeb265472013-08-21 21:59:03 +00005872 // Set the fp math unit.
5873 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
5874 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
5875 return 0;
5876 }
5877
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005878 // Compute the default target features, we need the target to handle this
5879 // because features may have dependencies on one another.
5880 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005881 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005882
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005883 // Apply the user specified deltas.
5884 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
5885 I < N; ++I) {
5886 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00005887 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005888 bool Enabled = Name[0] == '+';
5889 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005890 }
5891
5892 // Add the features to the compile options.
5893 //
5894 // FIXME: If we are completely confident that we have the right set, we only
5895 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005896 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005897 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5898 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00005899 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00005900 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Rafael Espindolaeb265472013-08-21 21:59:03 +00005901 return 0;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005902
5903 return Target.take();
5904}