blob: 09d8be682f98abc381c372d030f8b45abe38e624 [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:
Douglas Gregorc05d2a12009-07-01 15:12:53 +000076 OSTargetInfo(const std::string& 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) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000091 Builder.defineMacro("__APPLE_CC__", "5621");
92 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
Daniel Dunbard86666f2010-01-26 01:44:04 +0000141 // Set the appropriate OS version define.
Bob Wilson8e5acc52012-01-31 23:52:58 +0000142 if (Triple.getOS() == llvm::Triple::IOS) {
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000143 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbard86666f2010-01-26 01:44:04 +0000144 char Str[6];
145 Str[0] = '0' + Maj;
146 Str[1] = '0' + (Min / 10);
147 Str[2] = '0' + (Min % 10);
148 Str[3] = '0' + (Rev / 10);
149 Str[4] = '0' + (Rev % 10);
150 Str[5] = '\0';
151 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", Str);
152 } else {
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000153 // Note that the Driver allows versions which aren't representable in the
154 // define (because we only get a single digit for the minor and micro
155 // revision numbers). So, we limit them to the maximum representable
156 // version.
Daniel Dunbard86666f2010-01-26 01:44:04 +0000157 assert(Triple.getEnvironmentName().empty() && "Invalid environment!");
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000158 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Daniel Dunbard86666f2010-01-26 01:44:04 +0000159 char Str[5];
160 Str[0] = '0' + (Maj / 10);
161 Str[1] = '0' + (Maj % 10);
Daniel Dunbarbbd48222011-04-21 21:27:33 +0000162 Str[2] = '0' + std::min(Min, 9U);
163 Str[3] = '0' + std::min(Rev, 9U);
Daniel Dunbard86666f2010-01-26 01:44:04 +0000164 Str[4] = '\0';
165 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000166 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000167
168 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000169}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000170
Chris Lattner30ba6742009-08-10 19:03:04 +0000171namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000172template<typename Target>
173class DarwinTargetInfo : public OSTargetInfo<Target> {
174protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000175 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000176 MacroBuilder &Builder) const {
Eric Christopher0c912c52011-07-07 22:55:26 +0000177 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000178 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000179 }
Mike Stump11289f42009-09-09 15:08:12 +0000180
Torok Edwinb2b37c62009-06-30 17:10:35 +0000181public:
182 DarwinTargetInfo(const std::string& triple) :
183 OSTargetInfo<Target>(triple) {
Eric Christopherbf15d2b2011-07-02 00:20:22 +0000184 llvm::Triple T = llvm::Triple(triple);
185 this->TLSSupported = T.isMacOSX() && !T.isMacOSXVersionLT(10,7);
Daniel Dunbar13adc7f2011-02-21 23:12:51 +0000186 this->MCountName = "\01mcount";
Torok Edwinb2b37c62009-06-30 17:10:35 +0000187 }
188
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000189 virtual std::string isValidSectionSpecifier(StringRef SR) const {
Chris Lattner30ba6742009-08-10 19:03:04 +0000190 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000191 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000192 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000193 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000194 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000195 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000196 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000197
Anders Carlsson851318a2010-06-08 22:47:50 +0000198 virtual const char *getStaticInitSectionSpecifier() const {
199 // FIXME: We should return 0 when building kexts.
200 return "__TEXT,__StaticInit,regular,pure_instructions";
201 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000202
John McCalleed64c72012-01-29 01:20:30 +0000203 /// Darwin does not support protected visibility. Darwin's "default"
204 /// is very similar to ELF's "protected"; Darwin requires a "weak"
205 /// attribute on declarations that can be dynamically replaced.
206 virtual bool hasProtectedVisibility() const {
207 return false;
208 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000209};
210
Chris Lattner30ba6742009-08-10 19:03:04 +0000211
Torok Edwinb2b37c62009-06-30 17:10:35 +0000212// DragonFlyBSD Target
213template<typename Target>
214class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
215protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000216 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000217 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000218 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000219 Builder.defineMacro("__DragonFly__");
220 Builder.defineMacro("__DragonFly_cc_version", "100001");
221 Builder.defineMacro("__ELF__");
222 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
223 Builder.defineMacro("__tune_i386__");
224 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000225 }
226public:
Mike Stump11289f42009-09-09 15:08:12 +0000227 DragonFlyBSDTargetInfo(const std::string &triple)
Eli Friedman4286fba2012-02-10 23:02:29 +0000228 : OSTargetInfo<Target>(triple) {
229 this->UserLabelPrefix = "";
230
231 llvm::Triple Triple(triple);
232 switch (Triple.getArch()) {
233 default:
234 case llvm::Triple::x86:
235 case llvm::Triple::x86_64:
236 this->MCountName = ".mcount";
237 break;
238 }
239 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000240};
241
242// FreeBSD Target
243template<typename Target>
244class FreeBSDTargetInfo : public OSTargetInfo<Target> {
245protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000246 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000247 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000248 // FreeBSD defines; list based off of gcc output
249
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000250 unsigned Release = Triple.getOSMajorVersion();
251 if (Release == 0U)
252 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000253
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000254 Builder.defineMacro("__FreeBSD__", Twine(Release));
255 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000256 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
257 DefineStd(Builder, "unix", Opts);
258 Builder.defineMacro("__ELF__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000259 }
260public:
Mike Stump11289f42009-09-09 15:08:12 +0000261 FreeBSDTargetInfo(const std::string &triple)
Duncan Sands9cb27e92009-07-08 13:55:08 +0000262 : OSTargetInfo<Target>(triple) {
263 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000264
265 llvm::Triple Triple(triple);
266 switch (Triple.getArch()) {
267 default:
268 case llvm::Triple::x86:
269 case llvm::Triple::x86_64:
270 this->MCountName = ".mcount";
271 break;
272 case llvm::Triple::mips:
273 case llvm::Triple::mipsel:
274 case llvm::Triple::ppc:
275 case llvm::Triple::ppc64:
276 this->MCountName = "_mcount";
277 break;
278 case llvm::Triple::arm:
279 this->MCountName = "__mcount";
280 break;
281 }
282
Duncan Sands9cb27e92009-07-08 13:55:08 +0000283 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000284};
285
Chris Lattner3e2ee142010-07-07 16:01:42 +0000286// Minix Target
287template<typename Target>
288class MinixTargetInfo : public OSTargetInfo<Target> {
289protected:
290 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
291 MacroBuilder &Builder) const {
292 // Minix defines
293
294 Builder.defineMacro("__minix", "3");
295 Builder.defineMacro("_EM_WSIZE", "4");
296 Builder.defineMacro("_EM_PSIZE", "4");
297 Builder.defineMacro("_EM_SSIZE", "2");
298 Builder.defineMacro("_EM_LSIZE", "4");
299 Builder.defineMacro("_EM_FSIZE", "4");
300 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000301 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000302 DefineStd(Builder, "unix", Opts);
303 }
304public:
305 MinixTargetInfo(const std::string &triple)
306 : OSTargetInfo<Target>(triple) {
307 this->UserLabelPrefix = "";
308 }
309};
310
Torok Edwinb2b37c62009-06-30 17:10:35 +0000311// Linux target
312template<typename Target>
313class LinuxTargetInfo : public OSTargetInfo<Target> {
314protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000315 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000316 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000317 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000318 DefineStd(Builder, "unix", Opts);
319 DefineStd(Builder, "linux", Opts);
320 Builder.defineMacro("__gnu_linux__");
321 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000322 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000323 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000324 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000325 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000326 if (Opts.CPlusPlus)
327 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328 }
329public:
Mike Stump11289f42009-09-09 15:08:12 +0000330 LinuxTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000331 : OSTargetInfo<Target>(triple) {
332 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000333 this->WIntType = TargetInfo::UnsignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000334 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000335
336 virtual const char *getStaticInitSectionSpecifier() const {
337 return ".text.startup";
338 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000339};
340
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000341// NetBSD Target
342template<typename Target>
343class NetBSDTargetInfo : public OSTargetInfo<Target> {
344protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000345 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000346 MacroBuilder &Builder) const {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000347 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000348 Builder.defineMacro("__NetBSD__");
349 Builder.defineMacro("__unix__");
350 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000351 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000352 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000353 }
354public:
Mike Stump11289f42009-09-09 15:08:12 +0000355 NetBSDTargetInfo(const std::string &triple)
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000356 : OSTargetInfo<Target>(triple) {
357 this->UserLabelPrefix = "";
358 }
359};
360
Torok Edwinb2b37c62009-06-30 17:10:35 +0000361// OpenBSD Target
362template<typename Target>
363class OpenBSDTargetInfo : public OSTargetInfo<Target> {
364protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000365 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000366 MacroBuilder &Builder) const {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000367 // OpenBSD defines; list based off of gcc output
368
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000369 Builder.defineMacro("__OpenBSD__");
370 DefineStd(Builder, "unix", Opts);
371 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000372 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000373 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000374 }
375public:
Mike Stump11289f42009-09-09 15:08:12 +0000376 OpenBSDTargetInfo(const std::string &triple)
Eli Friedman3715d1f2011-12-15 02:15:56 +0000377 : OSTargetInfo<Target>(triple) {
378 this->UserLabelPrefix = "";
Hans Wennborg12417312012-08-01 18:53:19 +0000379 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000380
381 llvm::Triple Triple(triple);
382 switch (Triple.getArch()) {
383 default:
384 case llvm::Triple::x86:
385 case llvm::Triple::x86_64:
386 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000387 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000388 this->MCountName = "__mcount";
389 break;
390 case llvm::Triple::mips64:
391 case llvm::Triple::mips64el:
392 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000393 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000394 this->MCountName = "_mcount";
395 break;
396 }
397 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000398};
399
Eli Friedman9fa28852012-08-08 23:57:20 +0000400// Bitrig Target
401template<typename Target>
402class BitrigTargetInfo : public OSTargetInfo<Target> {
403protected:
404 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
405 MacroBuilder &Builder) const {
406 // Bitrig defines; list based off of gcc output
407
408 Builder.defineMacro("__Bitrig__");
409 DefineStd(Builder, "unix", Opts);
410 Builder.defineMacro("__ELF__");
411 if (Opts.POSIXThreads)
412 Builder.defineMacro("_REENTRANT");
413 }
414public:
415 BitrigTargetInfo(const std::string &triple)
416 : OSTargetInfo<Target>(triple) {
417 this->UserLabelPrefix = "";
418 this->TLSSupported = false;
419 this->MCountName = "__mcount";
420 }
421};
422
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000423// PSP Target
424template<typename Target>
425class PSPTargetInfo : public OSTargetInfo<Target> {
426protected:
427 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000428 MacroBuilder &Builder) const {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000429 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000430 Builder.defineMacro("PSP");
431 Builder.defineMacro("_PSP");
432 Builder.defineMacro("__psp__");
433 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000434 }
435public:
436 PSPTargetInfo(const std::string& triple)
437 : OSTargetInfo<Target>(triple) {
438 this->UserLabelPrefix = "";
439 }
440};
441
John Thompsone467e192009-11-19 17:18:50 +0000442// PS3 PPU Target
443template<typename Target>
444class PS3PPUTargetInfo : public OSTargetInfo<Target> {
445protected:
446 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000447 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000448 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000449 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000450 Builder.defineMacro("__PPU__");
451 Builder.defineMacro("__CELLOS_LV2__");
452 Builder.defineMacro("__ELF__");
453 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000454 Builder.defineMacro("_ARCH_PPC64");
455 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000456 }
457public:
458 PS3PPUTargetInfo(const std::string& triple)
459 : OSTargetInfo<Target>(triple) {
460 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000461 this->LongWidth = this->LongAlign = 32;
462 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000463 this->IntMaxType = TargetInfo::SignedLongLong;
464 this->UIntMaxType = TargetInfo::UnsignedLongLong;
465 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000466 this->SizeType = TargetInfo::UnsignedInt;
John Thompson07a61a42010-06-24 22:44:13 +0000467 this->DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000468 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
John Thompsone467e192009-11-19 17:18:50 +0000469 }
470};
471
472// FIXME: Need a real SPU target.
473// PS3 SPU Target
474template<typename Target>
475class PS3SPUTargetInfo : public OSTargetInfo<Target> {
476protected:
477 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000478 MacroBuilder &Builder) const {
John Thompsone467e192009-11-19 17:18:50 +0000479 // PS3 PPU defines.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000480 Builder.defineMacro("__SPU__");
481 Builder.defineMacro("__ELF__");
John Thompsone467e192009-11-19 17:18:50 +0000482 }
483public:
484 PS3SPUTargetInfo(const std::string& triple)
485 : OSTargetInfo<Target>(triple) {
486 this->UserLabelPrefix = "";
487 }
488};
489
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000490// AuroraUX target
491template<typename Target>
492class AuroraUXTargetInfo : public OSTargetInfo<Target> {
493protected:
494 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000495 MacroBuilder &Builder) const {
496 DefineStd(Builder, "sun", Opts);
497 DefineStd(Builder, "unix", Opts);
498 Builder.defineMacro("__ELF__");
499 Builder.defineMacro("__svr4__");
500 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000501 }
502public:
503 AuroraUXTargetInfo(const std::string& triple)
504 : OSTargetInfo<Target>(triple) {
505 this->UserLabelPrefix = "";
506 this->WCharType = this->SignedLong;
507 // FIXME: WIntType should be SignedLong
508 }
509};
510
Torok Edwinb2b37c62009-06-30 17:10:35 +0000511// Solaris target
512template<typename Target>
513class SolarisTargetInfo : public OSTargetInfo<Target> {
514protected:
Daniel Dunbar40165182009-08-24 09:10:05 +0000515 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000516 MacroBuilder &Builder) const {
517 DefineStd(Builder, "sun", Opts);
518 DefineStd(Builder, "unix", Opts);
519 Builder.defineMacro("__ELF__");
520 Builder.defineMacro("__svr4__");
521 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000522 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
523 // newer, but to 500 for everything else. feature_test.h has a check to
524 // ensure that you are not using C99 with an old version of X/Open or C89
525 // with a new version.
526 if (Opts.C99 || Opts.C11)
527 Builder.defineMacro("_XOPEN_SOURCE", "600");
528 else
529 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000530 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000531 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000532 Builder.defineMacro("_LARGEFILE_SOURCE");
533 Builder.defineMacro("_LARGEFILE64_SOURCE");
534 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000535 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000536 }
537public:
Mike Stump11289f42009-09-09 15:08:12 +0000538 SolarisTargetInfo(const std::string& triple)
Torok Edwinb2b37c62009-06-30 17:10:35 +0000539 : OSTargetInfo<Target>(triple) {
540 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000541 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000542 // FIXME: WIntType should be SignedLong
543 }
544};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000545
546// Windows target
547template<typename Target>
548class WindowsTargetInfo : public OSTargetInfo<Target> {
549protected:
550 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
551 MacroBuilder &Builder) const {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000552 Builder.defineMacro("_WIN32");
553 }
554 void getVisualStudioDefines(const LangOptions &Opts,
555 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000556 if (Opts.CPlusPlus) {
557 if (Opts.RTTI)
558 Builder.defineMacro("_CPPRTTI");
559
560 if (Opts.Exceptions)
561 Builder.defineMacro("_CPPUNWIND");
562 }
563
564 if (!Opts.CharIsSigned)
565 Builder.defineMacro("_CHAR_UNSIGNED");
566
567 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
568 // but it works for now.
569 if (Opts.POSIXThreads)
570 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000571
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000572 if (Opts.MSCVersion != 0)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000573 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000574
Francois Pichet0706d202011-09-17 17:15:52 +0000575 if (Opts.MicrosoftExt) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000576 Builder.defineMacro("_MSC_EXTENSIONS");
577
Richard Smith2bf7fdb2013-01-02 11:42:31 +0000578 if (Opts.CPlusPlus11) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000579 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
580 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
581 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
582 }
583 }
584
585 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000586 }
587
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000588public:
589 WindowsTargetInfo(const std::string &triple)
590 : OSTargetInfo<Target>(triple) {}
591};
592
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000593template <typename Target>
594class NaClTargetInfo : public OSTargetInfo<Target> {
595 protected:
596 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
597 MacroBuilder &Builder) const {
598 if (Opts.POSIXThreads)
599 Builder.defineMacro("_REENTRANT");
600 if (Opts.CPlusPlus)
601 Builder.defineMacro("_GNU_SOURCE");
602
603 DefineStd(Builder, "unix", Opts);
604 Builder.defineMacro("__ELF__");
605 Builder.defineMacro("__native_client__");
606 }
607 public:
608 NaClTargetInfo(const std::string &triple)
609 : OSTargetInfo<Target>(triple) {
610 this->UserLabelPrefix = "";
611 this->LongAlign = 32;
612 this->LongWidth = 32;
613 this->PointerAlign = 32;
614 this->PointerWidth = 32;
615 this->IntMaxType = TargetInfo::SignedLongLong;
616 this->UIntMaxType = TargetInfo::UnsignedLongLong;
617 this->Int64Type = TargetInfo::SignedLongLong;
618 this->DoubleAlign = 64;
619 this->LongDoubleWidth = 64;
620 this->LongDoubleAlign = 64;
621 this->SizeType = TargetInfo::UnsignedInt;
622 this->PtrDiffType = TargetInfo::SignedInt;
623 this->IntPtrType = TargetInfo::SignedInt;
624 this->RegParmMax = 2;
625 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
626 this->DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
627 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
628 }
Derek Schuffa2020962012-10-16 22:30:41 +0000629 virtual typename Target::CallingConvCheckResult checkCallingConvention(
630 CallingConv CC) const {
631 return CC == CC_PnaclCall ? Target::CCCR_OK :
632 Target::checkCallingConvention(CC);
633 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000634};
Mike Stump11289f42009-09-09 15:08:12 +0000635} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000636
Chris Lattner09d98f52008-10-05 21:50:58 +0000637//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000638// Specific target implementations.
639//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000640
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000641namespace {
642// PPC abstract base class
643class PPCTargetInfo : public TargetInfo {
644 static const Builtin::Info BuiltinInfo[];
645 static const char * const GCCRegNames[];
646 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000647 std::string CPU;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000648public:
Nico Weber3435ede2012-01-31 02:07:33 +0000649 PPCTargetInfo(const std::string& triple) : TargetInfo(triple) {
650 LongDoubleWidth = LongDoubleAlign = 128;
651 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
652 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000653
Hal Finkel6b984f02012-07-03 16:51:04 +0000654 /// \brief Flags for architecture specific defines.
655 typedef enum {
656 ArchDefineNone = 0,
657 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
658 ArchDefinePpcgr = 1 << 1,
659 ArchDefinePpcsq = 1 << 2,
660 ArchDefine440 = 1 << 3,
661 ArchDefine603 = 1 << 4,
662 ArchDefine604 = 1 << 5,
663 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000664 ArchDefinePwr5 = 1 << 7,
665 ArchDefinePwr5x = 1 << 8,
666 ArchDefinePwr6 = 1 << 9,
667 ArchDefinePwr6x = 1 << 10,
668 ArchDefinePwr7 = 1 << 11,
669 ArchDefineA2 = 1 << 12,
670 ArchDefineA2q = 1 << 13
Hal Finkel6b984f02012-07-03 16:51:04 +0000671 } ArchDefineTypes;
672
Bill Schmidt38378a02013-02-01 20:23:10 +0000673 // Note: GCC recognizes the following additional cpus:
674 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
675 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
676 // titan, rs64.
Hal Finkel8eb59282012-06-11 22:35:19 +0000677 virtual bool setCPU(const std::string &Name) {
678 bool CPUKnown = llvm::StringSwitch<bool>(Name)
679 .Case("generic", true)
680 .Case("440", true)
681 .Case("450", true)
682 .Case("601", true)
683 .Case("602", true)
684 .Case("603", true)
685 .Case("603e", true)
686 .Case("603ev", true)
687 .Case("604", true)
688 .Case("604e", true)
689 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000690 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000691 .Case("g3", true)
692 .Case("7400", true)
693 .Case("g4", true)
694 .Case("7450", true)
695 .Case("g4+", true)
696 .Case("750", true)
697 .Case("970", true)
698 .Case("g5", true)
699 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000700 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000701 .Case("e500mc", true)
702 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000703 .Case("power3", true)
704 .Case("pwr3", true)
705 .Case("power4", true)
706 .Case("pwr4", true)
707 .Case("power5", true)
708 .Case("pwr5", true)
709 .Case("power5x", true)
710 .Case("pwr5x", true)
711 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000712 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000713 .Case("power6x", true)
714 .Case("pwr6x", true)
715 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000716 .Case("pwr7", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000717 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000718 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000719 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000720 .Case("ppc64", true)
721 .Default(false);
722
723 if (CPUKnown)
724 CPU = Name;
725
726 return CPUKnown;
727 }
728
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000729 virtual void getTargetBuiltins(const Builtin::Info *&Records,
730 unsigned &NumRecords) const {
Chris Lattner10a5b382007-01-29 05:24:35 +0000731 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000732 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000733 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000734
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000735 virtual bool isCLZForZeroUndef() const { return false; }
736
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000737 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000738 MacroBuilder &Builder) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000739
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000740 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
741
742 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
743 StringRef Name,
744 bool Enabled) const;
745
Douglas Gregor0070c0b2012-01-30 06:38:25 +0000746 virtual bool hasFeature(StringRef Feature) const;
747
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000748 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000749 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000750 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000751 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +0000752 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +0000753 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +0000754 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000755 default: return false;
756 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000757 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000758 case 'b': // Base register
759 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000760 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000761 break;
762 // FIXME: The following are added to allow parsing.
763 // I just took a guess at what the actions should be.
764 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000765 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000766 case 'v': // Altivec vector register
767 Info.setAllowsRegister();
768 break;
769 case 'w':
770 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000771 case 'd':// VSX vector register to hold vector double data
772 case 'f':// VSX vector register to hold vector float data
773 case 's':// VSX vector register to hold scalar float data
774 case 'a':// Any VSX register
John Thompson07a61a42010-06-24 22:44:13 +0000775 break;
776 default:
777 return false;
778 }
779 Info.setAllowsRegister();
780 Name++; // Skip over 'w'.
781 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000782 case 'h': // `MQ', `CTR', or `LINK' register
783 case 'q': // `MQ' register
784 case 'c': // `CTR' register
785 case 'l': // `LINK' register
786 case 'x': // `CR' register (condition register) number 0
787 case 'y': // `CR' register (condition register)
788 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000789 Info.setAllowsRegister();
790 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000791 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000792 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000793 // (use `L' instead for SImode constants)
794 case 'K': // Unsigned 16-bit constant
795 case 'L': // Signed 16-bit constant shifted left 16 bits
796 case 'M': // Constant larger than 31
797 case 'N': // Exact power of 2
798 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000799 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000800 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000801 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000802 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000803 break;
804 case 'm': // Memory operand. Note that on PowerPC targets, m can
805 // include addresses that update the base register. It
806 // is therefore only safe to use `m' in an asm statement
807 // if that asm statement accesses the operand exactly once.
808 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000809 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000810 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000811 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000812 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000813 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
814 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000815 // register to be updated.
816 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000817 if (Name[1] != 's')
818 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000819 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000820 // include any automodification of the base register. Unlike
821 // `m', this constraint can be used in asm statements that
822 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000823 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000824 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000825 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000826 break;
827 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000828 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000829 case 'Z': // Memory operand that is an indexed or indirect from a
830 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000831 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000832 Info.setAllowsMemory();
833 Info.setAllowsRegister();
834 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000835 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000836 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000837 // register (`p' is preferable for asm statements)
838 case 'S': // Constant suitable as a 64-bit mask operand
839 case 'T': // Constant suitable as a 32-bit mask operand
840 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000841 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000842 // instructions
843 case 'W': // Vector constant that does not require memory
844 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000845 break;
846 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000847 }
John Thompson07a61a42010-06-24 22:44:13 +0000848 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000849 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000850 virtual const char *getClobbers() const {
851 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000852 }
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000853 int getEHDataRegisterNumber(unsigned RegNo) const {
854 if (RegNo == 0) return 3;
855 if (RegNo == 1) return 4;
856 return -1;
857 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000858};
Anders Carlssonf511f642007-11-27 04:11:28 +0000859
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000860const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000861#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000862#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000863 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000864#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000865};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000866
867
Chris Lattnerecd49032009-03-02 22:27:17 +0000868/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
869/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000870void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000871 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000872 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000873 Builder.defineMacro("__ppc__");
874 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000875 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000876 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000877 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000878 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000879 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000880 Builder.defineMacro("__ppc64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000881 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000882 Builder.defineMacro("__ppc__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000883 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000884
Chris Lattnerecd49032009-03-02 22:27:17 +0000885 // Target properties.
Hans Wennborg0bb84622012-08-02 13:45:48 +0000886 if (getTriple().getOS() != llvm::Triple::NetBSD &&
887 getTriple().getOS() != llvm::Triple::OpenBSD)
Joerg Sonnenberger870b3c52011-07-05 14:56:12 +0000888 Builder.defineMacro("_BIG_ENDIAN");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000889 Builder.defineMacro("__BIG_ENDIAN__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000890
Chris Lattnerecd49032009-03-02 22:27:17 +0000891 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000892 Builder.defineMacro("__NATURAL_ALIGNMENT__");
893 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000894
Chris Lattnerecd49032009-03-02 22:27:17 +0000895 // FIXME: Should be controlled by command line option.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000896 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000897
John Thompsone467e192009-11-19 17:18:50 +0000898 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000899 Builder.defineMacro("__VEC__", "10206");
900 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000901 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000902
903 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000904 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
905 .Case("440", ArchDefineName)
906 .Case("450", ArchDefineName | ArchDefine440)
907 .Case("601", ArchDefineName)
908 .Case("602", ArchDefineName | ArchDefinePpcgr)
909 .Case("603", ArchDefineName | ArchDefinePpcgr)
910 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
911 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
912 .Case("604", ArchDefineName | ArchDefinePpcgr)
913 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
914 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +0000915 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +0000916 .Case("7400", ArchDefineName | ArchDefinePpcgr)
917 .Case("7450", ArchDefineName | ArchDefinePpcgr)
918 .Case("750", ArchDefineName | ArchDefinePpcgr)
919 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
920 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000921 .Case("a2", ArchDefineA2)
922 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +0000923 .Case("pwr3", ArchDefinePpcgr)
924 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
925 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
926 | ArchDefinePpcsq)
927 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
928 | ArchDefinePpcgr | ArchDefinePpcsq)
929 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
930 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
931 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
932 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
933 | ArchDefinePpcsq)
934 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
935 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
936 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
937 .Case("power3", ArchDefinePpcgr)
938 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
939 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
940 | ArchDefinePpcsq)
941 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
942 | ArchDefinePpcgr | ArchDefinePpcsq)
943 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
944 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
945 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
946 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
947 | ArchDefinePpcsq)
948 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
949 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
950 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +0000951 .Default(ArchDefineNone);
952
953 if (defs & ArchDefineName)
954 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
955 if (defs & ArchDefinePpcgr)
956 Builder.defineMacro("_ARCH_PPCGR");
957 if (defs & ArchDefinePpcsq)
958 Builder.defineMacro("_ARCH_PPCSQ");
959 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +0000960 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +0000961 if (defs & ArchDefine603)
962 Builder.defineMacro("_ARCH_603");
963 if (defs & ArchDefine604)
964 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +0000965 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +0000966 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +0000967 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +0000968 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +0000969 if (defs & ArchDefinePwr5x)
970 Builder.defineMacro("_ARCH_PWR5X");
971 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +0000972 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +0000973 if (defs & ArchDefinePwr6x)
974 Builder.defineMacro("_ARCH_PWR6X");
975 if (defs & ArchDefinePwr7)
976 Builder.defineMacro("_ARCH_PWR7");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000977 if (defs & ArchDefineA2)
978 Builder.defineMacro("_ARCH_A2");
979 if (defs & ArchDefineA2q) {
980 Builder.defineMacro("_ARCH_A2Q");
981 Builder.defineMacro("_ARCH_QP");
982 }
983
984 if (getTriple().getVendor() == llvm::Triple::BGQ) {
985 Builder.defineMacro("__bg__");
986 Builder.defineMacro("__THW_BLUEGENE__");
987 Builder.defineMacro("__bgq__");
988 Builder.defineMacro("__TOS_BGQ__");
989 }
Bill Schmidt38378a02013-02-01 20:23:10 +0000990
991 // FIXME: The following are not yet generated here by Clang, but are
992 // generated by GCC:
993 //
994 // _SOFT_FLOAT_
995 // __RECIP_PRECISION__
996 // __APPLE_ALTIVEC__
997 // __VSX__
998 // __RECIP__
999 // __RECIPF__
1000 // __RSQRTE__
1001 // __RSQRTEF__
1002 // _SOFT_DOUBLE_
1003 // __NO_LWSYNC__
1004 // __HAVE_BSWAP__
1005 // __LONGDOUBLE128
1006 // __CMODEL_MEDIUM__
1007 // __CMODEL_LARGE__
1008 // _CALL_SYSV
1009 // _CALL_DARWIN
1010 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001011}
1012
1013void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1014 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1015 .Case("7400", true)
1016 .Case("g4", true)
1017 .Case("7450", true)
1018 .Case("g4+", true)
1019 .Case("970", true)
1020 .Case("g5", true)
1021 .Case("pwr6", true)
1022 .Case("pwr7", true)
1023 .Case("ppc64", true)
1024 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001025
1026 Features["qpx"] = (CPU == "a2q");
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001027}
1028
1029bool PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1030 StringRef Name,
1031 bool Enabled) const {
Hal Finkelb58ce852013-02-01 18:44:19 +00001032 if (Name == "altivec" || Name == "qpx") {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001033 Features[Name] = Enabled;
1034 return true;
Hal Finkel8eb59282012-06-11 22:35:19 +00001035 }
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001036
1037 return false;
Chris Lattnerecd49032009-03-02 22:27:17 +00001038}
1039
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001040bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1041 return Feature == "powerpc";
1042}
Chris Lattner17df24e2008-04-21 18:56:49 +00001043
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001044
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001045const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001046 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1047 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1048 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1049 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1050 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1051 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1052 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1053 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001054 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001055 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001056 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001057 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1058 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1059 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1060 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001061 "vrsave", "vscr",
1062 "spe_acc", "spefscr",
1063 "sfp"
1064};
Chris Lattner10a5b382007-01-29 05:24:35 +00001065
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001066void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001067 unsigned &NumNames) const {
1068 Names = GCCRegNames;
1069 NumNames = llvm::array_lengthof(GCCRegNames);
1070}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001071
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001072const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1073 // While some of these aliases do map to different registers
1074 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001075 { { "0" }, "r0" },
1076 { { "1"}, "r1" },
1077 { { "2" }, "r2" },
1078 { { "3" }, "r3" },
1079 { { "4" }, "r4" },
1080 { { "5" }, "r5" },
1081 { { "6" }, "r6" },
1082 { { "7" }, "r7" },
1083 { { "8" }, "r8" },
1084 { { "9" }, "r9" },
1085 { { "10" }, "r10" },
1086 { { "11" }, "r11" },
1087 { { "12" }, "r12" },
1088 { { "13" }, "r13" },
1089 { { "14" }, "r14" },
1090 { { "15" }, "r15" },
1091 { { "16" }, "r16" },
1092 { { "17" }, "r17" },
1093 { { "18" }, "r18" },
1094 { { "19" }, "r19" },
1095 { { "20" }, "r20" },
1096 { { "21" }, "r21" },
1097 { { "22" }, "r22" },
1098 { { "23" }, "r23" },
1099 { { "24" }, "r24" },
1100 { { "25" }, "r25" },
1101 { { "26" }, "r26" },
1102 { { "27" }, "r27" },
1103 { { "28" }, "r28" },
1104 { { "29" }, "r29" },
1105 { { "30" }, "r30" },
1106 { { "31" }, "r31" },
1107 { { "fr0" }, "f0" },
1108 { { "fr1" }, "f1" },
1109 { { "fr2" }, "f2" },
1110 { { "fr3" }, "f3" },
1111 { { "fr4" }, "f4" },
1112 { { "fr5" }, "f5" },
1113 { { "fr6" }, "f6" },
1114 { { "fr7" }, "f7" },
1115 { { "fr8" }, "f8" },
1116 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001117 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001118 { { "fr11" }, "f11" },
1119 { { "fr12" }, "f12" },
1120 { { "fr13" }, "f13" },
1121 { { "fr14" }, "f14" },
1122 { { "fr15" }, "f15" },
1123 { { "fr16" }, "f16" },
1124 { { "fr17" }, "f17" },
1125 { { "fr18" }, "f18" },
1126 { { "fr19" }, "f19" },
1127 { { "fr20" }, "f20" },
1128 { { "fr21" }, "f21" },
1129 { { "fr22" }, "f22" },
1130 { { "fr23" }, "f23" },
1131 { { "fr24" }, "f24" },
1132 { { "fr25" }, "f25" },
1133 { { "fr26" }, "f26" },
1134 { { "fr27" }, "f27" },
1135 { { "fr28" }, "f28" },
1136 { { "fr29" }, "f29" },
1137 { { "fr30" }, "f30" },
1138 { { "fr31" }, "f31" },
1139 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001140};
1141
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001142void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001143 unsigned &NumAliases) const {
1144 Aliases = GCCRegAliases;
1145 NumAliases = llvm::array_lengthof(GCCRegAliases);
1146}
1147} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001148
Chris Lattner5ba61f02006-10-14 07:39:34 +00001149namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001150class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001151public:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001152 PPC32TargetInfo(const std::string &triple) : PPCTargetInfo(triple) {
Eli Friedman873f65a2008-08-21 00:13:15 +00001153 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00001154 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001155
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001156 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001157 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001158 case llvm::Triple::FreeBSD:
1159 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001160 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001161 PtrDiffType = SignedInt;
1162 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001163 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001164 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001165 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001166 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001167
Roman Divacky3ffe7462012-03-13 19:20:17 +00001168 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1169 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001170 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001171 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001172
1173 // PPC32 supports atomics up to 4 bytes.
1174 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001175 }
1176
Meador Inge5d3fb222012-06-16 03:34:49 +00001177 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Roman Divacky965b0b72011-01-06 08:27:10 +00001178 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001179 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001180 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001181};
1182} // end anonymous namespace.
1183
1184namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001185class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001186public:
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001187 PPC64TargetInfo(const std::string& triple) : PPCTargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001188 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001189 IntMaxType = SignedLong;
1190 UIntMaxType = UnsignedLong;
1191 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001192
Roman Divacky3ffe7462012-03-13 19:20:17 +00001193 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1194 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001195 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Bill Schmidtcec4cb12012-10-29 14:59:24 +00001196 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1197 "i64:64:64-f32:32:32-f64:64:64-f128:64:64-"
1198 "v128:128:128-n32:64";
1199 } else
1200 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1201 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
1202 "v128:128:128-n32:64";
Benjamin Kramer37196de2012-11-17 17:30:55 +00001203
1204 // PPC64 supports atomics up to 8 bytes.
1205 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001206 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001207 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1208 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001209 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001210};
1211} // end anonymous namespace.
1212
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001213
1214namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001215class DarwinPPC32TargetInfo :
1216 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001217public:
Roman Divacky965b0b72011-01-06 08:27:10 +00001218 DarwinPPC32TargetInfo(const std::string& triple)
1219 : DarwinTargetInfo<PPC32TargetInfo>(triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001220 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001221 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Anton Yartsev68d773c2012-01-17 22:40:00 +00001222 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001223 SuitableAlign = 128;
Anton Yartsev68d773c2012-01-17 22:40:00 +00001224 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1225 "i64:32:64-f32:32:32-f64:64:64-v128:128:128-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001226 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001227 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1228 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001229 }
1230};
1231
1232class DarwinPPC64TargetInfo :
1233 public DarwinTargetInfo<PPC64TargetInfo> {
1234public:
1235 DarwinPPC64TargetInfo(const std::string& triple)
1236 : DarwinTargetInfo<PPC64TargetInfo>(triple) {
1237 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001238 SuitableAlign = 128;
Bill Schmidtcec4cb12012-10-29 14:59:24 +00001239 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
1240 "i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001241 }
1242};
1243} // end anonymous namespace.
1244
Chris Lattner5ba61f02006-10-14 07:39:34 +00001245namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001246 static const unsigned NVPTXAddrSpaceMap[] = {
1247 1, // opencl_global
1248 3, // opencl_local
1249 4, // opencl_constant
1250 1, // cuda_device
1251 4, // cuda_constant
1252 3, // cuda_shared
1253 };
1254 class NVPTXTargetInfo : public TargetInfo {
1255 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001256 static const Builtin::Info BuiltinInfo[];
Dmitri Gribenkof8579502013-01-12 19:30:44 +00001257 std::vector<StringRef> AvailableFeatures;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001258 public:
1259 NVPTXTargetInfo(const std::string& triple) : TargetInfo(triple) {
1260 BigEndian = false;
1261 TLSSupported = false;
1262 LongWidth = LongAlign = 64;
1263 AddrSpaceMap = &NVPTXAddrSpaceMap;
Justin Holewinski83e96682012-05-24 17:43:12 +00001264 // Define available target features
1265 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001266 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001267 }
1268 virtual void getTargetDefines(const LangOptions &Opts,
1269 MacroBuilder &Builder) const {
1270 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001271 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001272 }
1273 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1274 unsigned &NumRecords) const {
Justin Holewinski83e96682012-05-24 17:43:12 +00001275 Records = BuiltinInfo;
1276 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001277 }
1278 virtual bool hasFeature(StringRef Feature) const {
Justin Holewinski83e96682012-05-24 17:43:12 +00001279 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001280 }
1281
1282 virtual void getGCCRegNames(const char * const *&Names,
1283 unsigned &NumNames) const;
1284 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1285 unsigned &NumAliases) const {
1286 // No aliases.
1287 Aliases = 0;
1288 NumAliases = 0;
1289 }
1290 virtual bool validateAsmConstraint(const char *&Name,
1291 TargetInfo::ConstraintInfo &info) const {
1292 // FIXME: implement
1293 return true;
1294 }
1295 virtual const char *getClobbers() const {
1296 // FIXME: Is this really right?
1297 return "";
1298 }
Meador Inge5d3fb222012-06-16 03:34:49 +00001299 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001300 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001301 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001302 }
1303 virtual bool setCPU(const std::string &Name) {
Justin Holewinski83e96682012-05-24 17:43:12 +00001304 return Name == "sm_10" || Name == "sm_13" || Name == "sm_20";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001305 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001306 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
1307 StringRef Name,
1308 bool Enabled) const;
1309 };
1310
1311 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1312#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1313#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1314 ALL_LANGUAGES },
1315#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001316 };
1317
1318 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1319 "r0"
1320 };
1321
1322 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1323 unsigned &NumNames) const {
1324 Names = GCCRegNames;
1325 NumNames = llvm::array_lengthof(GCCRegNames);
1326 }
1327
Justin Holewinski83e96682012-05-24 17:43:12 +00001328 bool NVPTXTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1329 StringRef Name,
1330 bool Enabled) const {
1331 if(std::binary_search(AvailableFeatures.begin(), AvailableFeatures.end(),
1332 Name)) {
1333 Features[Name] = Enabled;
1334 return true;
1335 } else {
1336 return false;
1337 }
1338 }
1339
Peter Collingbournec947aae2012-05-20 23:28:41 +00001340 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1341 public:
Justin Holewinski83e96682012-05-24 17:43:12 +00001342 NVPTX32TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001343 PointerWidth = PointerAlign = 32;
Justin Holewinski83e96682012-05-24 17:43:12 +00001344 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001345 DescriptionString
1346 = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1347 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1348 "n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001349 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001350 };
1351
1352 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1353 public:
Justin Holewinski83e96682012-05-24 17:43:12 +00001354 NVPTX64TargetInfo(const std::string& triple) : NVPTXTargetInfo(triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001355 PointerWidth = PointerAlign = 64;
Justin Holewinski83e96682012-05-24 17:43:12 +00001356 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001357 DescriptionString
1358 = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
1359 "f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-"
1360 "n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001361 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001362 };
1363}
1364
1365namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001366
1367static const unsigned R600AddrSpaceMap[] = {
1368 1, // opencl_global
1369 3, // opencl_local
1370 2, // opencl_constant
1371 1, // cuda_device
1372 2, // cuda_constant
1373 3 // cuda_shared
1374};
1375
Tom Stellardc74b1e02013-03-04 17:40:53 +00001376static const char *DescriptionStringR600 =
1377 "e"
1378 "-p:32:32:32"
1379 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32"
1380 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1381 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1382 "-n32:64";
1383
1384static const char *DescriptionStringR600DoubleOps =
1385 "e"
1386 "-p:32:32:32"
1387 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64"
1388 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1389 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1390 "-n32:64";
1391
1392static const char *DescriptionStringSI =
1393 "e"
1394 "-p:64:64:64"
1395 "-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64"
1396 "-v16:16:16-v24:32:32-v32:32:32-v48:64:64-v64:64:64-v96:128:128-v128:128:128"
1397 "-v192:256:256-v256:256:256-v512:512:512-v1024:1024:1024-v2048:2048:2048"
1398 "-n32:64";
1399
Eli Friedmand13b41e2012-10-12 23:32:00 +00001400class R600TargetInfo : public TargetInfo {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001401 /// \brief The GPU profiles supported by the R600 target.
1402 enum GPUKind {
1403 GK_NONE,
1404 GK_R600,
1405 GK_R600_DOUBLE_OPS,
1406 GK_R700,
1407 GK_R700_DOUBLE_OPS,
1408 GK_EVERGREEN,
1409 GK_EVERGREEN_DOUBLE_OPS,
1410 GK_NORTHERN_ISLANDS,
1411 GK_CAYMAN,
1412 GK_SOUTHERN_ISLANDS
1413 } GPU;
1414
Eli Friedmand13b41e2012-10-12 23:32:00 +00001415public:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001416 R600TargetInfo(const std::string& triple)
1417 : TargetInfo(triple),
1418 GPU(GK_R600) {
1419 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001420 AddrSpaceMap = &R600AddrSpaceMap;
1421 }
1422
1423 virtual const char * getClobbers() const {
1424 return "";
1425 }
1426
1427 virtual void getGCCRegNames(const char * const *&Names,
1428 unsigned &numNames) const {
1429 Names = NULL;
1430 numNames = 0;
1431 }
1432
1433 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1434 unsigned &NumAliases) const {
1435 Aliases = NULL;
1436 NumAliases = 0;
1437 }
1438
1439 virtual bool validateAsmConstraint(const char *&Name,
1440 TargetInfo::ConstraintInfo &info) const {
1441 return true;
1442 }
1443
1444 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1445 unsigned &NumRecords) const {
1446 Records = NULL;
1447 NumRecords = 0;
1448 }
1449
1450
1451 virtual void getTargetDefines(const LangOptions &Opts,
1452 MacroBuilder &Builder) const {
1453 Builder.defineMacro("__R600__");
1454 }
1455
1456 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1457 return TargetInfo::CharPtrBuiltinVaList;
1458 }
1459
Tom Stellardc74b1e02013-03-04 17:40:53 +00001460 virtual bool setCPU(const std::string &Name) {
1461 GPU = llvm::StringSwitch<GPUKind>(Name)
1462 .Case("r600" , GK_R600)
1463 .Case("rv610", GK_R600)
1464 .Case("rv620", GK_R600)
1465 .Case("rv630", GK_R600)
1466 .Case("rv635", GK_R600)
1467 .Case("rs780", GK_R600)
1468 .Case("rs880", GK_R600)
1469 .Case("rv670", GK_R600_DOUBLE_OPS)
1470 .Case("rv710", GK_R700)
1471 .Case("rv730", GK_R700)
1472 .Case("rv740", GK_R700_DOUBLE_OPS)
1473 .Case("rv770", GK_R700_DOUBLE_OPS)
1474 .Case("palm", GK_EVERGREEN)
1475 .Case("cedar", GK_EVERGREEN)
1476 .Case("sumo", GK_EVERGREEN)
1477 .Case("sumo2", GK_EVERGREEN)
1478 .Case("redwood", GK_EVERGREEN)
1479 .Case("juniper", GK_EVERGREEN)
1480 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1481 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1482 .Case("barts", GK_NORTHERN_ISLANDS)
1483 .Case("turks", GK_NORTHERN_ISLANDS)
1484 .Case("caicos", GK_NORTHERN_ISLANDS)
1485 .Case("cayman", GK_CAYMAN)
1486 .Case("aruba", GK_CAYMAN)
1487 .Case("SI", GK_SOUTHERN_ISLANDS)
1488 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1489 .Case("verde", GK_SOUTHERN_ISLANDS)
1490 .Case("oland", GK_SOUTHERN_ISLANDS)
1491 .Default(GK_NONE);
1492
1493 if (GPU == GK_NONE) {
1494 return false;
1495 }
1496
1497 // Set the correct data layout
1498 switch (GPU) {
1499 case GK_NONE:
1500 case GK_R600:
1501 case GK_R700:
1502 case GK_EVERGREEN:
1503 case GK_NORTHERN_ISLANDS:
1504 DescriptionString = DescriptionStringR600;
1505 break;
1506 case GK_R600_DOUBLE_OPS:
1507 case GK_R700_DOUBLE_OPS:
1508 case GK_EVERGREEN_DOUBLE_OPS:
1509 case GK_CAYMAN:
1510 DescriptionString = DescriptionStringR600DoubleOps;
1511 break;
1512 case GK_SOUTHERN_ISLANDS:
1513 DescriptionString = DescriptionStringSI;
1514 break;
1515 }
1516
1517 return true;
1518 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001519};
1520
1521} // end anonymous namespace
1522
1523namespace {
Chris Lattner5178f562010-03-06 21:21:27 +00001524// MBlaze abstract base class
1525class MBlazeTargetInfo : public TargetInfo {
1526 static const char * const GCCRegNames[];
1527 static const TargetInfo::GCCRegAlias GCCRegAliases[];
1528
1529public:
1530 MBlazeTargetInfo(const std::string& triple) : TargetInfo(triple) {
Wesley Peck69bf1282010-12-12 20:56:47 +00001531 DescriptionString = "E-p:32:32:32-i8:8:8-i16:16:16";
Chris Lattner5178f562010-03-06 21:21:27 +00001532 }
1533
1534 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1535 unsigned &NumRecords) const {
1536 // FIXME: Implement.
1537 Records = 0;
1538 NumRecords = 0;
1539 }
1540
1541 virtual void getTargetDefines(const LangOptions &Opts,
1542 MacroBuilder &Builder) const;
1543
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001544 virtual bool hasFeature(StringRef Feature) const {
1545 return Feature == "mblaze";
1546 }
1547
Meador Inge5d3fb222012-06-16 03:34:49 +00001548 virtual BuiltinVaListKind getBuiltinVaListKind() const {
1549 return TargetInfo::CharPtrBuiltinVaList;
Chris Lattner5178f562010-03-06 21:21:27 +00001550 }
1551 virtual const char *getTargetPrefix() const {
1552 return "mblaze";
1553 }
1554 virtual void getGCCRegNames(const char * const *&Names,
1555 unsigned &NumNames) const;
1556 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
1557 unsigned &NumAliases) const;
1558 virtual bool validateAsmConstraint(const char *&Name,
1559 TargetInfo::ConstraintInfo &Info) const {
1560 switch (*Name) {
1561 default: return false;
1562 case 'O': // Zero
1563 return true;
1564 case 'b': // Base register
1565 case 'f': // Floating point register
1566 Info.setAllowsRegister();
1567 return true;
1568 }
1569 }
1570 virtual const char *getClobbers() const {
1571 return "";
1572 }
1573};
1574
1575/// MBlazeTargetInfo::getTargetDefines - Return a set of the MBlaze-specific
1576/// #defines that are not tied to a specific subtarget.
1577void MBlazeTargetInfo::getTargetDefines(const LangOptions &Opts,
1578 MacroBuilder &Builder) const {
1579 // Target identification.
1580 Builder.defineMacro("__microblaze__");
1581 Builder.defineMacro("_ARCH_MICROBLAZE");
1582 Builder.defineMacro("__MICROBLAZE__");
1583
1584 // Target properties.
1585 Builder.defineMacro("_BIG_ENDIAN");
1586 Builder.defineMacro("__BIG_ENDIAN__");
1587
1588 // Subtarget options.
1589 Builder.defineMacro("__REGISTER_PREFIX__", "");
1590}
1591
1592
1593const char * const MBlazeTargetInfo::GCCRegNames[] = {
1594 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1595 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1596 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1597 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1598 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
1599 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
1600 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
1601 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
1602 "hi", "lo", "accum","rmsr", "$fcc1","$fcc2","$fcc3","$fcc4",
1603 "$fcc5","$fcc6","$fcc7","$ap", "$rap", "$frp"
1604};
1605
1606void MBlazeTargetInfo::getGCCRegNames(const char * const *&Names,
1607 unsigned &NumNames) const {
1608 Names = GCCRegNames;
1609 NumNames = llvm::array_lengthof(GCCRegNames);
1610}
1611
1612const TargetInfo::GCCRegAlias MBlazeTargetInfo::GCCRegAliases[] = {
1613 { {"f0"}, "r0" },
1614 { {"f1"}, "r1" },
1615 { {"f2"}, "r2" },
1616 { {"f3"}, "r3" },
1617 { {"f4"}, "r4" },
1618 { {"f5"}, "r5" },
1619 { {"f6"}, "r6" },
1620 { {"f7"}, "r7" },
1621 { {"f8"}, "r8" },
1622 { {"f9"}, "r9" },
1623 { {"f10"}, "r10" },
1624 { {"f11"}, "r11" },
1625 { {"f12"}, "r12" },
1626 { {"f13"}, "r13" },
1627 { {"f14"}, "r14" },
1628 { {"f15"}, "r15" },
1629 { {"f16"}, "r16" },
1630 { {"f17"}, "r17" },
1631 { {"f18"}, "r18" },
1632 { {"f19"}, "r19" },
1633 { {"f20"}, "r20" },
1634 { {"f21"}, "r21" },
1635 { {"f22"}, "r22" },
1636 { {"f23"}, "r23" },
1637 { {"f24"}, "r24" },
1638 { {"f25"}, "r25" },
1639 { {"f26"}, "r26" },
1640 { {"f27"}, "r27" },
1641 { {"f28"}, "r28" },
1642 { {"f29"}, "r29" },
1643 { {"f30"}, "r30" },
1644 { {"f31"}, "r31" },
1645};
1646
1647void MBlazeTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1648 unsigned &NumAliases) const {
1649 Aliases = GCCRegAliases;
1650 NumAliases = llvm::array_lengthof(GCCRegAliases);
1651}
1652} // end anonymous namespace.
1653
1654namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001655// Namespace for x86 abstract base class
1656const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001657#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001658#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001659 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001660#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001661};
Eli Friedmanb5366062008-05-20 14:21:01 +00001662
Nuno Lopescfca1f02009-12-23 17:49:57 +00001663static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001664 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1665 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001666 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001667 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1668 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1669 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001670 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001671 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1672 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001673};
1674
Eric Christophercdd36352011-06-21 00:05:20 +00001675const TargetInfo::AddlRegName AddlRegNames[] = {
1676 { { "al", "ah", "eax", "rax" }, 0 },
1677 { { "bl", "bh", "ebx", "rbx" }, 3 },
1678 { { "cl", "ch", "ecx", "rcx" }, 2 },
1679 { { "dl", "dh", "edx", "rdx" }, 1 },
1680 { { "esi", "rsi" }, 4 },
1681 { { "edi", "rdi" }, 5 },
1682 { { "esp", "rsp" }, 7 },
1683 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001684};
1685
1686// X86 target abstract base class; x86-32 and x86-64 are very close, so
1687// most of the implementation can be shared.
1688class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001689 enum X86SSEEnum {
Craig Topper23b92192012-01-09 09:19:09 +00001690 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2
Chris Lattner96e43572009-03-02 22:40:39 +00001691 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001692 enum MMX3DNowEnum {
1693 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1694 } MMX3DNowLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001695
Eric Christophere1ddaf92010-04-02 23:50:19 +00001696 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001697 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001698 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001699 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001700 bool HasBMI;
1701 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001702 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001703 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001704 bool HasPRFCHW;
Benjamin Kramer8ac9c222012-05-29 17:48:39 +00001705 bool HasSSE4a;
Craig Topperffdb46c2011-12-30 07:33:42 +00001706 bool HasFMA4;
Craig Topperbba778b2012-06-03 21:46:30 +00001707 bool HasFMA;
Craig Topperf561a9562012-06-09 22:24:14 +00001708 bool HasXOP;
Manman Rena45358c2012-10-11 00:59:55 +00001709 bool HasF16C;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001710
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001711 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1712 ///
1713 /// Each enumeration represents a particular CPU supported by Clang. These
1714 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1715 enum CPUKind {
1716 CK_Generic,
1717
1718 /// \name i386
1719 /// i386-generation processors.
1720 //@{
1721 CK_i386,
1722 //@}
1723
1724 /// \name i486
1725 /// i486-generation processors.
1726 //@{
1727 CK_i486,
1728 CK_WinChipC6,
1729 CK_WinChip2,
1730 CK_C3,
1731 //@}
1732
1733 /// \name i586
1734 /// i586-generation processors, P5 microarchitecture based.
1735 //@{
1736 CK_i586,
1737 CK_Pentium,
1738 CK_PentiumMMX,
1739 //@}
1740
1741 /// \name i686
1742 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1743 //@{
1744 CK_i686,
1745 CK_PentiumPro,
1746 CK_Pentium2,
1747 CK_Pentium3,
1748 CK_Pentium3M,
1749 CK_PentiumM,
1750 CK_C3_2,
1751
1752 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1753 /// Clang however has some logic to suport this.
1754 // FIXME: Warn, deprecate, and potentially remove this.
1755 CK_Yonah,
1756 //@}
1757
1758 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001759 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001760 //@{
1761 CK_Pentium4,
1762 CK_Pentium4M,
1763 CK_Prescott,
1764 CK_Nocona,
1765 //@}
1766
1767 /// \name Core
1768 /// Core microarchitecture based processors.
1769 //@{
1770 CK_Core2,
1771
1772 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1773 /// codename which GCC no longer accepts as an option to -march, but Clang
1774 /// has some logic for recognizing it.
1775 // FIXME: Warn, deprecate, and potentially remove this.
1776 CK_Penryn,
1777 //@}
1778
1779 /// \name Atom
1780 /// Atom processors
1781 //@{
1782 CK_Atom,
1783 //@}
1784
1785 /// \name Nehalem
1786 /// Nehalem microarchitecture based processors.
1787 //@{
1788 CK_Corei7,
1789 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001790 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001791 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001792 //@}
1793
1794 /// \name K6
1795 /// K6 architecture processors.
1796 //@{
1797 CK_K6,
1798 CK_K6_2,
1799 CK_K6_3,
1800 //@}
1801
1802 /// \name K7
1803 /// K7 architecture processors.
1804 //@{
1805 CK_Athlon,
1806 CK_AthlonThunderbird,
1807 CK_Athlon4,
1808 CK_AthlonXP,
1809 CK_AthlonMP,
1810 //@}
1811
1812 /// \name K8
1813 /// K8 architecture processors.
1814 //@{
1815 CK_Athlon64,
1816 CK_Athlon64SSE3,
1817 CK_AthlonFX,
1818 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001819 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001820 CK_Opteron,
1821 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001822 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001823 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001824
Benjamin Kramer569f2152012-01-10 11:50:18 +00001825 /// \name Bobcat
1826 /// Bobcat architecture processors.
1827 //@{
1828 CK_BTVER1,
1829 //@}
1830
1831 /// \name Bulldozer
1832 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001833 //@{
1834 CK_BDVER1,
1835 CK_BDVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001836 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001837
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001838 /// This specification is deprecated and will be removed in the future.
1839 /// Users should prefer \see CK_K8.
1840 // FIXME: Warn on this when the CPU is set to it.
1841 CK_x86_64,
1842 //@}
1843
1844 /// \name Geode
1845 /// Geode processors.
1846 //@{
1847 CK_Geode
1848 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001849 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001850
Eli Friedman3fd920a2008-08-20 02:34:37 +00001851public:
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001852 X86TargetInfo(const std::string& triple)
Eli Friedman33465822011-07-08 23:31:17 +00001853 : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Benjamin Kramer1e250392012-07-07 09:39:18 +00001854 HasAES(false), HasPCLMUL(false), HasLZCNT(false), HasRDRND(false),
Michael Liao625a8752012-11-10 05:17:46 +00001855 HasBMI(false), HasBMI2(false), HasPOPCNT(false), HasRTM(false),
Michael Liao74f4eaf2013-03-26 17:52:08 +00001856 HasPRFCHW(false), HasSSE4a(false), HasFMA4(false),
1857 HasFMA(false), HasXOP(false), HasF16C(false), CPU(CK_Generic) {
Eli Friedman803acb32011-12-22 03:51:45 +00001858 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001859 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001860 }
Benjamin Kramercf501472011-12-28 15:47:06 +00001861 virtual unsigned getFloatEvalMethod() const {
1862 // X87 evaluates with 80 bits "long double" precision.
1863 return SSELevel == NoSSE ? 2 : 0;
1864 }
Chris Lattner10a5b382007-01-29 05:24:35 +00001865 virtual void getTargetBuiltins(const Builtin::Info *&Records,
1866 unsigned &NumRecords) const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001867 Records = BuiltinInfo;
1868 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001869 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001870 virtual void getGCCRegNames(const char * const *&Names,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001871 unsigned &NumNames) const {
1872 Names = GCCRegNames;
1873 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001874 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001875 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001876 unsigned &NumAliases) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001877 Aliases = 0;
1878 NumAliases = 0;
1879 }
1880 virtual void getGCCAddlRegNames(const AddlRegName *&Names,
Eric Christopherfd081ca2012-11-14 22:08:59 +00001881 unsigned &NumNames) const {
Eric Christophercdd36352011-06-21 00:05:20 +00001882 Names = AddlRegNames;
1883 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001884 }
Anders Carlsson58436352009-02-28 17:11:49 +00001885 virtual bool validateAsmConstraint(const char *&Name,
Eli Friedman3fd920a2008-08-20 02:34:37 +00001886 TargetInfo::ConstraintInfo &info) const;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00001887 virtual std::string convertConstraint(const char *&Constraint) const;
Anders Carlssonf511f642007-11-27 04:11:28 +00001888 virtual const char *getClobbers() const {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001889 return "~{dirflag},~{fpsr},~{flags}";
1890 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001891 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001892 MacroBuilder &Builder) const;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001893 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer27402c62012-03-05 15:10:44 +00001894 StringRef Name,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00001895 bool Enabled) const;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00001896 virtual void getDefaultFeatures(llvm::StringMap<bool> &Features) const;
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001897 virtual bool hasFeature(StringRef Feature) const;
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00001898 virtual void HandleTargetFeatures(std::vector<std::string> &Features);
Eli Friedman33465822011-07-08 23:31:17 +00001899 virtual const char* getABI() const {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001900 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001901 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001902 else if (getTriple().getArch() == llvm::Triple::x86 &&
1903 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001904 return "no-mmx";
1905 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001906 }
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001907 virtual bool setCPU(const std::string &Name) {
Chandler Carruth212334f2011-09-28 08:55:37 +00001908 CPU = llvm::StringSwitch<CPUKind>(Name)
1909 .Case("i386", CK_i386)
1910 .Case("i486", CK_i486)
1911 .Case("winchip-c6", CK_WinChipC6)
1912 .Case("winchip2", CK_WinChip2)
1913 .Case("c3", CK_C3)
1914 .Case("i586", CK_i586)
1915 .Case("pentium", CK_Pentium)
1916 .Case("pentium-mmx", CK_PentiumMMX)
1917 .Case("i686", CK_i686)
1918 .Case("pentiumpro", CK_PentiumPro)
1919 .Case("pentium2", CK_Pentium2)
1920 .Case("pentium3", CK_Pentium3)
1921 .Case("pentium3m", CK_Pentium3M)
1922 .Case("pentium-m", CK_PentiumM)
1923 .Case("c3-2", CK_C3_2)
1924 .Case("yonah", CK_Yonah)
1925 .Case("pentium4", CK_Pentium4)
1926 .Case("pentium4m", CK_Pentium4M)
1927 .Case("prescott", CK_Prescott)
1928 .Case("nocona", CK_Nocona)
1929 .Case("core2", CK_Core2)
1930 .Case("penryn", CK_Penryn)
1931 .Case("atom", CK_Atom)
1932 .Case("corei7", CK_Corei7)
1933 .Case("corei7-avx", CK_Corei7AVX)
1934 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001935 .Case("core-avx2", CK_CoreAVX2)
Chandler Carruth212334f2011-09-28 08:55:37 +00001936 .Case("k6", CK_K6)
1937 .Case("k6-2", CK_K6_2)
1938 .Case("k6-3", CK_K6_3)
1939 .Case("athlon", CK_Athlon)
1940 .Case("athlon-tbird", CK_AthlonThunderbird)
1941 .Case("athlon-4", CK_Athlon4)
1942 .Case("athlon-xp", CK_AthlonXP)
1943 .Case("athlon-mp", CK_AthlonMP)
1944 .Case("athlon64", CK_Athlon64)
1945 .Case("athlon64-sse3", CK_Athlon64SSE3)
1946 .Case("athlon-fx", CK_AthlonFX)
1947 .Case("k8", CK_K8)
1948 .Case("k8-sse3", CK_K8SSE3)
1949 .Case("opteron", CK_Opteron)
1950 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001951 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001952 .Case("btver1", CK_BTVER1)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001953 .Case("bdver1", CK_BDVER1)
1954 .Case("bdver2", CK_BDVER2)
Chandler Carruth212334f2011-09-28 08:55:37 +00001955 .Case("x86-64", CK_x86_64)
1956 .Case("geode", CK_Geode)
1957 .Default(CK_Generic);
1958
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001959 // Perform any per-CPU checks necessary to determine if this CPU is
1960 // acceptable.
1961 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1962 // invalid without explaining *why*.
1963 switch (CPU) {
1964 case CK_Generic:
1965 // No processor selected!
1966 return false;
1967
1968 case CK_i386:
1969 case CK_i486:
1970 case CK_WinChipC6:
1971 case CK_WinChip2:
1972 case CK_C3:
1973 case CK_i586:
1974 case CK_Pentium:
1975 case CK_PentiumMMX:
1976 case CK_i686:
1977 case CK_PentiumPro:
1978 case CK_Pentium2:
1979 case CK_Pentium3:
1980 case CK_Pentium3M:
1981 case CK_PentiumM:
1982 case CK_Yonah:
1983 case CK_C3_2:
1984 case CK_Pentium4:
1985 case CK_Pentium4M:
1986 case CK_Prescott:
1987 case CK_K6:
1988 case CK_K6_2:
1989 case CK_K6_3:
1990 case CK_Athlon:
1991 case CK_AthlonThunderbird:
1992 case CK_Athlon4:
1993 case CK_AthlonXP:
1994 case CK_AthlonMP:
1995 case CK_Geode:
1996 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00001997 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001998 return false;
1999
2000 // Fallthrough
2001 case CK_Nocona:
2002 case CK_Core2:
2003 case CK_Penryn:
2004 case CK_Atom:
2005 case CK_Corei7:
2006 case CK_Corei7AVX:
2007 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002008 case CK_CoreAVX2:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002009 case CK_Athlon64:
2010 case CK_Athlon64SSE3:
2011 case CK_AthlonFX:
2012 case CK_K8:
2013 case CK_K8SSE3:
2014 case CK_Opteron:
2015 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002016 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002017 case CK_BTVER1:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002018 case CK_BDVER1:
2019 case CK_BDVER2:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002020 case CK_x86_64:
2021 return true;
2022 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002023 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002024 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002025
2026 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
2027 // We accept all non-ARM calling conventions
2028 return (CC == CC_X86ThisCall ||
2029 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00002030 CC == CC_X86StdCall ||
2031 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002032 CC == CC_X86Pascal ||
2033 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002034 }
2035
Aaron Ballman02df2e02012-12-09 17:45:41 +00002036 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
2037 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002038 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002039};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002040
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002041void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002042 // FIXME: This should not be here.
2043 Features["3dnow"] = false;
2044 Features["3dnowa"] = false;
2045 Features["mmx"] = false;
2046 Features["sse"] = false;
2047 Features["sse2"] = false;
2048 Features["sse3"] = false;
2049 Features["ssse3"] = false;
2050 Features["sse41"] = false;
2051 Features["sse42"] = false;
Roman Divackyce253d82011-10-30 13:47:56 +00002052 Features["sse4a"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00002053 Features["aes"] = false;
Craig Topper3f122a72012-05-31 05:18:48 +00002054 Features["pclmul"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002055 Features["avx"] = false;
Craig Topper865fff52011-12-17 19:55:21 +00002056 Features["avx2"] = false;
Craig Topper22967d42011-12-25 05:06:45 +00002057 Features["lzcnt"] = false;
Benjamin Kramer1e250392012-07-07 09:39:18 +00002058 Features["rdrand"] = false;
Craig Topper22967d42011-12-25 05:06:45 +00002059 Features["bmi"] = false;
2060 Features["bmi2"] = false;
Craig Topper1de83482011-12-29 16:10:46 +00002061 Features["popcnt"] = false;
Michael Liao625a8752012-11-10 05:17:46 +00002062 Features["rtm"] = false;
Michael Liao74f4eaf2013-03-26 17:52:08 +00002063 Features["prfchw"] = false;
Craig Topperffdb46c2011-12-30 07:33:42 +00002064 Features["fma4"] = false;
Craig Topperbba778b2012-06-03 21:46:30 +00002065 Features["fma"] = false;
Craig Topperf561a9562012-06-09 22:24:14 +00002066 Features["xop"] = false;
Manman Rena45358c2012-10-11 00:59:55 +00002067 Features["f16c"] = false;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002068
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002069 // FIXME: This *really* should not be here.
2070
2071 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002072 if (getTriple().getArch() == llvm::Triple::x86_64)
Eli Friedman1beddcf2012-11-17 01:16:19 +00002073 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002074
Chandler Carruth212334f2011-09-28 08:55:37 +00002075 switch (CPU) {
2076 case CK_Generic:
2077 case CK_i386:
2078 case CK_i486:
2079 case CK_i586:
2080 case CK_Pentium:
2081 case CK_i686:
2082 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002083 break;
2084 case CK_PentiumMMX:
2085 case CK_Pentium2:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00002086 setFeatureEnabled(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002087 break;
2088 case CK_Pentium3:
2089 case CK_Pentium3M:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00002090 setFeatureEnabled(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002091 break;
2092 case CK_PentiumM:
2093 case CK_Pentium4:
2094 case CK_Pentium4M:
2095 case CK_x86_64:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00002096 setFeatureEnabled(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002097 break;
2098 case CK_Yonah:
2099 case CK_Prescott:
2100 case CK_Nocona:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00002101 setFeatureEnabled(Features, "sse3", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002102 break;
2103 case CK_Core2:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00002104 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002105 break;
2106 case CK_Penryn:
Benjamin Kramer6dced3b2012-01-04 14:36:57 +00002107 setFeatureEnabled(Features, "sse4.1", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002108 break;
2109 case CK_Atom:
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002110 setFeatureEnabled(Features, "ssse3", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002111 break;
2112 case CK_Corei7:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00002113 setFeatureEnabled(Features, "sse4", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002114 break;
2115 case CK_Corei7AVX:
Benjamin Kramer1e250392012-07-07 09:39:18 +00002116 setFeatureEnabled(Features, "avx", true);
2117 setFeatureEnabled(Features, "aes", true);
2118 setFeatureEnabled(Features, "pclmul", true);
2119 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002120 case CK_CoreAVXi:
Craig Topper5f365e92012-04-26 07:31:30 +00002121 setFeatureEnabled(Features, "avx", true);
Roman Divacky27ec14f2011-04-05 20:32:44 +00002122 setFeatureEnabled(Features, "aes", true);
Craig Topper3f122a72012-05-31 05:18:48 +00002123 setFeatureEnabled(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002124 setFeatureEnabled(Features, "rdrnd", true);
Eli Friedman3e94f572012-11-17 01:43:10 +00002125 setFeatureEnabled(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002126 break;
Craig Topper865fff52011-12-17 19:55:21 +00002127 case CK_CoreAVX2:
Craig Topper5f365e92012-04-26 07:31:30 +00002128 setFeatureEnabled(Features, "avx2", true);
Craig Topper865fff52011-12-17 19:55:21 +00002129 setFeatureEnabled(Features, "aes", true);
Craig Topper3f122a72012-05-31 05:18:48 +00002130 setFeatureEnabled(Features, "pclmul", true);
Craig Topper22967d42011-12-25 05:06:45 +00002131 setFeatureEnabled(Features, "lzcnt", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002132 setFeatureEnabled(Features, "rdrnd", true);
Eli Friedman3e94f572012-11-17 01:43:10 +00002133 setFeatureEnabled(Features, "f16c", true);
Craig Topper22967d42011-12-25 05:06:45 +00002134 setFeatureEnabled(Features, "bmi", true);
2135 setFeatureEnabled(Features, "bmi2", true);
Michael Liao625a8752012-11-10 05:17:46 +00002136 setFeatureEnabled(Features, "rtm", true);
Craig Topperbba778b2012-06-03 21:46:30 +00002137 setFeatureEnabled(Features, "fma", true);
Craig Topper865fff52011-12-17 19:55:21 +00002138 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002139 case CK_K6:
2140 case CK_WinChipC6:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00002141 setFeatureEnabled(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002142 break;
2143 case CK_K6_2:
2144 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002145 case CK_WinChip2:
2146 case CK_C3:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00002147 setFeatureEnabled(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002148 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002149 case CK_Athlon:
2150 case CK_AthlonThunderbird:
2151 case CK_Geode:
2152 setFeatureEnabled(Features, "3dnowa", true);
2153 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002154 case CK_Athlon4:
2155 case CK_AthlonXP:
2156 case CK_AthlonMP:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00002157 setFeatureEnabled(Features, "sse", true);
2158 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002159 break;
2160 case CK_K8:
2161 case CK_Opteron:
2162 case CK_Athlon64:
2163 case CK_AthlonFX:
Mike Stump11289f42009-09-09 15:08:12 +00002164 setFeatureEnabled(Features, "sse2", true);
Daniel Dunbarf9d90272009-05-06 21:56:32 +00002165 setFeatureEnabled(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002166 break;
2167 case CK_K8SSE3:
2168 case CK_OpteronSSE3:
2169 case CK_Athlon64SSE3:
Roman Divackyce253d82011-10-30 13:47:56 +00002170 setFeatureEnabled(Features, "sse3", true);
2171 setFeatureEnabled(Features, "3dnowa", true);
2172 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002173 case CK_AMDFAM10:
Roman Divackydacbfe42010-12-29 13:28:29 +00002174 setFeatureEnabled(Features, "sse3", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002175 setFeatureEnabled(Features, "sse4a", true);
Roman Divackydacbfe42010-12-29 13:28:29 +00002176 setFeatureEnabled(Features, "3dnowa", true);
Eli Friedman3e94f572012-11-17 01:43:10 +00002177 setFeatureEnabled(Features, "lzcnt", true);
2178 setFeatureEnabled(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002179 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002180 case CK_BTVER1:
2181 setFeatureEnabled(Features, "ssse3", true);
2182 setFeatureEnabled(Features, "sse4a", true);
Eli Friedman3e94f572012-11-17 01:43:10 +00002183 setFeatureEnabled(Features, "lzcnt", true);
2184 setFeatureEnabled(Features, "popcnt", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002185 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002186 case CK_BDVER1:
Craig Topperf561a9562012-06-09 22:24:14 +00002187 setFeatureEnabled(Features, "xop", true);
Eli Friedman3e94f572012-11-17 01:43:10 +00002188 setFeatureEnabled(Features, "lzcnt", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002189 setFeatureEnabled(Features, "aes", true);
Craig Topper3f122a72012-05-31 05:18:48 +00002190 setFeatureEnabled(Features, "pclmul", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002191 break;
Eli Friedman3e94f572012-11-17 01:43:10 +00002192 case CK_BDVER2:
2193 setFeatureEnabled(Features, "xop", true);
2194 setFeatureEnabled(Features, "lzcnt", true);
2195 setFeatureEnabled(Features, "aes", true);
2196 setFeatureEnabled(Features, "pclmul", true);
2197 setFeatureEnabled(Features, "bmi", true);
2198 setFeatureEnabled(Features, "fma", true);
2199 setFeatureEnabled(Features, "f16c", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002200 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002201 case CK_C3_2:
Daniel Dunbarf9d90272009-05-06 21:56:32 +00002202 setFeatureEnabled(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002203 break;
Eli Friedman33465822011-07-08 23:31:17 +00002204 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002205}
2206
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002207bool X86TargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer27402c62012-03-05 15:10:44 +00002208 StringRef Name,
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002209 bool Enabled) const {
Eric Christopher399ffa52010-03-04 02:26:37 +00002210 // FIXME: This *really* should not be here. We need some way of translating
2211 // options into llvm subtarget features.
2212 if (!Features.count(Name) &&
Benjamin Kramer1e250392012-07-07 09:39:18 +00002213 (Name != "sse4" && Name != "sse4.2" && Name != "sse4.1" &&
2214 Name != "rdrnd"))
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002215 return false;
2216
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002217 // FIXME: this should probably use a switch with fall through.
2218
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002219 if (Enabled) {
2220 if (Name == "mmx")
2221 Features["mmx"] = true;
2222 else if (Name == "sse")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002223 Features["mmx"] = Features["sse"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002224 else if (Name == "sse2")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002225 Features["mmx"] = Features["sse"] = Features["sse2"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002226 else if (Name == "sse3")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002227 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2228 true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002229 else if (Name == "ssse3")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002230 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002231 Features["ssse3"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00002232 else if (Name == "sse4" || Name == "sse4.2")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002233 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper1de83482011-12-29 16:10:46 +00002234 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2235 Features["popcnt"] = true;
Eric Christopher399ffa52010-03-04 02:26:37 +00002236 else if (Name == "sse4.1")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002237 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Eric Christopher399ffa52010-03-04 02:26:37 +00002238 Features["ssse3"] = Features["sse41"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002239 else if (Name == "3dnow")
Eli Friedman33465822011-07-08 23:31:17 +00002240 Features["mmx"] = Features["3dnow"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002241 else if (Name == "3dnowa")
Eli Friedman33465822011-07-08 23:31:17 +00002242 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = true;
Eric Christophere1ddaf92010-04-02 23:50:19 +00002243 else if (Name == "aes")
Craig Topper1e9e01f2012-06-03 21:56:22 +00002244 Features["sse"] = Features["sse2"] = Features["aes"] = true;
Craig Topper3f122a72012-05-31 05:18:48 +00002245 else if (Name == "pclmul")
Craig Topper1e9e01f2012-06-03 21:56:22 +00002246 Features["sse"] = Features["sse2"] = Features["pclmul"] = true;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002247 else if (Name == "avx")
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002248 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2249 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper1de83482011-12-29 16:10:46 +00002250 Features["popcnt"] = Features["avx"] = true;
Craig Topper865fff52011-12-17 19:55:21 +00002251 else if (Name == "avx2")
2252 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2253 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper1de83482011-12-29 16:10:46 +00002254 Features["popcnt"] = Features["avx"] = Features["avx2"] = true;
Craig Topperbba778b2012-06-03 21:46:30 +00002255 else if (Name == "fma")
2256 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
2257 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2258 Features["popcnt"] = Features["avx"] = Features["fma"] = true;
Craig Topperffdb46c2011-12-30 07:33:42 +00002259 else if (Name == "fma4")
Eli Friedman1beddcf2012-11-17 01:16:19 +00002260 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topperffdb46c2011-12-30 07:33:42 +00002261 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper9ee12502012-05-30 05:54:54 +00002262 Features["popcnt"] = Features["avx"] = Features["sse4a"] =
2263 Features["fma4"] = true;
Craig Topperf561a9562012-06-09 22:24:14 +00002264 else if (Name == "xop")
Eli Friedman1beddcf2012-11-17 01:16:19 +00002265 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topperf561a9562012-06-09 22:24:14 +00002266 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2267 Features["popcnt"] = Features["avx"] = Features["sse4a"] =
2268 Features["fma4"] = Features["xop"] = true;
Roman Divackyce253d82011-10-30 13:47:56 +00002269 else if (Name == "sse4a")
Craig Topperffdb46c2011-12-30 07:33:42 +00002270 Features["mmx"] = Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topper9ee12502012-05-30 05:54:54 +00002271 Features["sse4a"] = true;
Craig Topper22967d42011-12-25 05:06:45 +00002272 else if (Name == "lzcnt")
2273 Features["lzcnt"] = true;
Benjamin Kramer1e250392012-07-07 09:39:18 +00002274 else if (Name == "rdrnd")
2275 Features["rdrand"] = true;
Craig Topper22967d42011-12-25 05:06:45 +00002276 else if (Name == "bmi")
2277 Features["bmi"] = true;
2278 else if (Name == "bmi2")
2279 Features["bmi2"] = true;
Craig Topper1de83482011-12-29 16:10:46 +00002280 else if (Name == "popcnt")
2281 Features["popcnt"] = true;
Manman Rena45358c2012-10-11 00:59:55 +00002282 else if (Name == "f16c")
2283 Features["f16c"] = true;
Michael Liao625a8752012-11-10 05:17:46 +00002284 else if (Name == "rtm")
2285 Features["rtm"] = true;
Michael Liao74f4eaf2013-03-26 17:52:08 +00002286 else if (Name == "prfchw")
2287 Features["prfchw"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002288 } else {
2289 if (Name == "mmx")
Eli Friedman33465822011-07-08 23:31:17 +00002290 Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002291 else if (Name == "sse")
Mike Stump11289f42009-09-09 15:08:12 +00002292 Features["sse"] = Features["sse2"] = Features["sse3"] =
Craig Topperffdb46c2011-12-30 07:33:42 +00002293 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
Craig Topper12c9df32012-06-03 22:23:42 +00002294 Features["sse4a"] = Features["avx"] = Features["avx2"] =
2295 Features["fma"] = Features["fma4"] = Features["aes"] =
Craig Topperf561a9562012-06-09 22:24:14 +00002296 Features["pclmul"] = Features["xop"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002297 else if (Name == "sse2")
Mike Stump11289f42009-09-09 15:08:12 +00002298 Features["sse2"] = Features["sse3"] = Features["ssse3"] =
Craig Topper1e9e01f2012-06-03 21:56:22 +00002299 Features["sse41"] = Features["sse42"] = Features["sse4a"] =
Craig Topper12c9df32012-06-03 22:23:42 +00002300 Features["avx"] = Features["avx2"] = Features["fma"] =
Craig Topperf561a9562012-06-09 22:24:14 +00002301 Features["fma4"] = Features["aes"] = Features["pclmul"] =
2302 Features["xop"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002303 else if (Name == "sse3")
Mike Stump11289f42009-09-09 15:08:12 +00002304 Features["sse3"] = Features["ssse3"] = Features["sse41"] =
Craig Topper12c9df32012-06-03 22:23:42 +00002305 Features["sse42"] = Features["sse4a"] = Features["avx"] =
Craig Topperf561a9562012-06-09 22:24:14 +00002306 Features["avx2"] = Features["fma"] = Features["fma4"] =
2307 Features["xop"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002308 else if (Name == "ssse3")
Craig Topper12c9df32012-06-03 22:23:42 +00002309 Features["ssse3"] = Features["sse41"] = Features["sse42"] =
2310 Features["avx"] = Features["avx2"] = Features["fma"] = false;
Michael J. Spencera9e41172011-04-17 19:22:03 +00002311 else if (Name == "sse4" || Name == "sse4.1")
Craig Topper12c9df32012-06-03 22:23:42 +00002312 Features["sse41"] = Features["sse42"] = Features["avx"] =
2313 Features["avx2"] = Features["fma"] = false;
Eric Christophercfeceff2010-03-04 02:31:44 +00002314 else if (Name == "sse4.2")
Craig Topper12c9df32012-06-03 22:23:42 +00002315 Features["sse42"] = Features["avx"] = Features["avx2"] =
2316 Features["fma"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002317 else if (Name == "3dnow")
2318 Features["3dnow"] = Features["3dnowa"] = false;
2319 else if (Name == "3dnowa")
2320 Features["3dnowa"] = false;
Eric Christophere1ddaf92010-04-02 23:50:19 +00002321 else if (Name == "aes")
2322 Features["aes"] = false;
Craig Topper3f122a72012-05-31 05:18:48 +00002323 else if (Name == "pclmul")
2324 Features["pclmul"] = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002325 else if (Name == "avx")
Craig Topperbba778b2012-06-03 21:46:30 +00002326 Features["avx"] = Features["avx2"] = Features["fma"] =
Craig Topperf561a9562012-06-09 22:24:14 +00002327 Features["fma4"] = Features["xop"] = false;
Craig Topper865fff52011-12-17 19:55:21 +00002328 else if (Name == "avx2")
2329 Features["avx2"] = false;
Craig Topperbba778b2012-06-03 21:46:30 +00002330 else if (Name == "fma")
2331 Features["fma"] = false;
Roman Divackyce253d82011-10-30 13:47:56 +00002332 else if (Name == "sse4a")
Craig Topperf561a9562012-06-09 22:24:14 +00002333 Features["sse4a"] = Features["fma4"] = Features["xop"] = false;
Craig Topper22967d42011-12-25 05:06:45 +00002334 else if (Name == "lzcnt")
2335 Features["lzcnt"] = false;
Benjamin Kramer1e250392012-07-07 09:39:18 +00002336 else if (Name == "rdrnd")
2337 Features["rdrand"] = false;
Craig Topper22967d42011-12-25 05:06:45 +00002338 else if (Name == "bmi")
2339 Features["bmi"] = false;
2340 else if (Name == "bmi2")
2341 Features["bmi2"] = false;
Craig Topper1de83482011-12-29 16:10:46 +00002342 else if (Name == "popcnt")
2343 Features["popcnt"] = false;
Craig Topperffdb46c2011-12-30 07:33:42 +00002344 else if (Name == "fma4")
Craig Topperf561a9562012-06-09 22:24:14 +00002345 Features["fma4"] = Features["xop"] = false;
2346 else if (Name == "xop")
2347 Features["xop"] = false;
Manman Rena45358c2012-10-11 00:59:55 +00002348 else if (Name == "f16c")
2349 Features["f16c"] = false;
Michael Liao625a8752012-11-10 05:17:46 +00002350 else if (Name == "rtm")
2351 Features["rtm"] = false;
Michael Liao74f4eaf2013-03-26 17:52:08 +00002352 else if (Name == "prfchw")
2353 Features["prfchw"] = false;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002354 }
2355
2356 return true;
2357}
2358
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002359/// HandleTargetOptions - Perform initialization based on the user
2360/// configured set of features.
Daniel Dunbar7b245ed2009-12-19 03:30:57 +00002361void X86TargetInfo::HandleTargetFeatures(std::vector<std::string> &Features) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002362 // Remember the maximum enabled sselevel.
2363 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2364 // Ignore disabled features.
2365 if (Features[i][0] == '-')
2366 continue;
2367
Benjamin Kramer27402c62012-03-05 15:10:44 +00002368 StringRef Feature = StringRef(Features[i]).substr(1);
2369
2370 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002371 HasAES = true;
2372 continue;
2373 }
2374
Craig Topper3f122a72012-05-31 05:18:48 +00002375 if (Feature == "pclmul") {
2376 HasPCLMUL = true;
2377 continue;
2378 }
2379
Benjamin Kramer27402c62012-03-05 15:10:44 +00002380 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002381 HasLZCNT = true;
2382 continue;
2383 }
2384
Benjamin Kramer1e250392012-07-07 09:39:18 +00002385 if (Feature == "rdrand") {
2386 HasRDRND = true;
2387 continue;
2388 }
2389
Benjamin Kramer27402c62012-03-05 15:10:44 +00002390 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002391 HasBMI = true;
2392 continue;
2393 }
2394
Benjamin Kramer27402c62012-03-05 15:10:44 +00002395 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002396 HasBMI2 = true;
2397 continue;
2398 }
2399
Benjamin Kramer27402c62012-03-05 15:10:44 +00002400 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002401 HasPOPCNT = true;
2402 continue;
2403 }
2404
Michael Liao625a8752012-11-10 05:17:46 +00002405 if (Feature == "rtm") {
2406 HasRTM = true;
2407 continue;
2408 }
2409
Michael Liao74f4eaf2013-03-26 17:52:08 +00002410 if (Feature == "prfchw") {
2411 HasPRFCHW = true;
2412 continue;
2413 }
2414
Benjamin Kramer8ac9c222012-05-29 17:48:39 +00002415 if (Feature == "sse4a") {
2416 HasSSE4a = true;
2417 continue;
2418 }
2419
Benjamin Kramer27402c62012-03-05 15:10:44 +00002420 if (Feature == "fma4") {
Craig Topperffdb46c2011-12-30 07:33:42 +00002421 HasFMA4 = true;
2422 continue;
2423 }
2424
Craig Topperbba778b2012-06-03 21:46:30 +00002425 if (Feature == "fma") {
2426 HasFMA = true;
2427 continue;
2428 }
2429
Craig Topperf561a9562012-06-09 22:24:14 +00002430 if (Feature == "xop") {
2431 HasXOP = true;
2432 continue;
2433 }
2434
Manman Rena45358c2012-10-11 00:59:55 +00002435 if (Feature == "f16c") {
2436 HasF16C = true;
2437 continue;
2438 }
2439
Daniel Dunbar979586e2009-11-11 09:38:56 +00002440 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002441 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper23b92192012-01-09 09:19:09 +00002442 .Case("avx2", AVX2)
2443 .Case("avx", AVX)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002444 .Case("sse42", SSE42)
2445 .Case("sse41", SSE41)
2446 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002447 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002448 .Case("sse2", SSE2)
2449 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002450 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002451 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002452
Eli Friedman33465822011-07-08 23:31:17 +00002453 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002454 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002455 .Case("3dnowa", AMD3DNowAthlon)
2456 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002457 .Case("mmx", MMX)
2458 .Default(NoMMX3DNow);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002459
Eli Friedman33465822011-07-08 23:31:17 +00002460 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002461 }
Eli Friedman33465822011-07-08 23:31:17 +00002462
2463 // Don't tell the backend if we're turning off mmx; it will end up disabling
2464 // SSE, which we don't want.
2465 std::vector<std::string>::iterator it;
2466 it = std::find(Features.begin(), Features.end(), "-mmx");
2467 if (it != Features.end())
2468 Features.erase(it);
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002469}
Chris Lattnerecd49032009-03-02 22:27:17 +00002470
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002471/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2472/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002473void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002474 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002475 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002476 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002477 Builder.defineMacro("__amd64__");
2478 Builder.defineMacro("__amd64");
2479 Builder.defineMacro("__x86_64");
2480 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002481 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002482 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002483 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002484
Chris Lattnerecd49032009-03-02 22:27:17 +00002485 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002486 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2487 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002488 switch (CPU) {
2489 case CK_Generic:
2490 break;
2491 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002492 // The rest are coming from the i386 define above.
2493 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002494 break;
2495 case CK_i486:
2496 case CK_WinChipC6:
2497 case CK_WinChip2:
2498 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002499 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002500 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002501 case CK_PentiumMMX:
2502 Builder.defineMacro("__pentium_mmx__");
2503 Builder.defineMacro("__tune_pentium_mmx__");
2504 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002505 case CK_i586:
2506 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002507 defineCPUMacros(Builder, "i586");
2508 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002509 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002510 case CK_Pentium3:
2511 case CK_Pentium3M:
2512 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002513 Builder.defineMacro("__tune_pentium3__");
2514 // Fallthrough
2515 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002516 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002517 Builder.defineMacro("__tune_pentium2__");
2518 // Fallthrough
2519 case CK_PentiumPro:
2520 Builder.defineMacro("__tune_i686__");
2521 Builder.defineMacro("__tune_pentiumpro__");
2522 // Fallthrough
2523 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002524 Builder.defineMacro("__i686");
2525 Builder.defineMacro("__i686__");
2526 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2527 Builder.defineMacro("__pentiumpro");
2528 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002529 break;
2530 case CK_Pentium4:
2531 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002532 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002533 break;
2534 case CK_Yonah:
2535 case CK_Prescott:
2536 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002537 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002538 break;
2539 case CK_Core2:
2540 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002541 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002542 break;
2543 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002544 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002545 break;
2546 case CK_Corei7:
2547 case CK_Corei7AVX:
2548 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002549 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002550 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002551 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002552 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002553 Builder.defineMacro("__k6_2__");
2554 Builder.defineMacro("__tune_k6_2__");
2555 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002556 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002557 if (CPU != CK_K6_2) { // In case of fallthrough
2558 // FIXME: GCC may be enabling these in cases where some other k6
2559 // architecture is specified but -m3dnow is explicitly provided. The
2560 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002561 Builder.defineMacro("__k6_3__");
2562 Builder.defineMacro("__tune_k6_3__");
2563 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002564 // Fallthrough
2565 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002566 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002567 break;
2568 case CK_Athlon:
2569 case CK_AthlonThunderbird:
2570 case CK_Athlon4:
2571 case CK_AthlonXP:
2572 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002573 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002574 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002575 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002576 Builder.defineMacro("__tune_athlon_sse__");
2577 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002578 break;
2579 case CK_K8:
2580 case CK_K8SSE3:
2581 case CK_x86_64:
2582 case CK_Opteron:
2583 case CK_OpteronSSE3:
2584 case CK_Athlon64:
2585 case CK_Athlon64SSE3:
2586 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002587 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002588 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002589 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002590 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002591 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002592 case CK_BTVER1:
2593 defineCPUMacros(Builder, "btver1");
2594 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002595 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002596 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002597 break;
2598 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002599 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002600 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002601 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002602 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002603 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002604 }
Chris Lattner96e43572009-03-02 22:40:39 +00002605
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002606 // Target properties.
2607 Builder.defineMacro("__LITTLE_ENDIAN__");
2608 Builder.defineMacro("__REGISTER_PREFIX__", "");
2609
Chris Lattner6df41af2009-04-19 17:32:33 +00002610 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2611 // functions in glibc header files that use FP Stack inline asm which the
2612 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002613 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002614
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002615 if (HasAES)
2616 Builder.defineMacro("__AES__");
2617
Craig Topper3f122a72012-05-31 05:18:48 +00002618 if (HasPCLMUL)
2619 Builder.defineMacro("__PCLMUL__");
2620
Craig Topper22967d42011-12-25 05:06:45 +00002621 if (HasLZCNT)
2622 Builder.defineMacro("__LZCNT__");
2623
Benjamin Kramer1e250392012-07-07 09:39:18 +00002624 if (HasRDRND)
2625 Builder.defineMacro("__RDRND__");
2626
Craig Topper22967d42011-12-25 05:06:45 +00002627 if (HasBMI)
2628 Builder.defineMacro("__BMI__");
2629
2630 if (HasBMI2)
2631 Builder.defineMacro("__BMI2__");
2632
Craig Topper1de83482011-12-29 16:10:46 +00002633 if (HasPOPCNT)
2634 Builder.defineMacro("__POPCNT__");
2635
Michael Liao625a8752012-11-10 05:17:46 +00002636 if (HasRTM)
2637 Builder.defineMacro("__RTM__");
2638
Michael Liao74f4eaf2013-03-26 17:52:08 +00002639 if (HasPRFCHW)
2640 Builder.defineMacro("__PRFCHW__");
2641
Benjamin Kramer8ac9c222012-05-29 17:48:39 +00002642 if (HasSSE4a)
2643 Builder.defineMacro("__SSE4A__");
2644
Craig Topperffdb46c2011-12-30 07:33:42 +00002645 if (HasFMA4)
2646 Builder.defineMacro("__FMA4__");
2647
Craig Topperbba778b2012-06-03 21:46:30 +00002648 if (HasFMA)
2649 Builder.defineMacro("__FMA__");
2650
Craig Topperf561a9562012-06-09 22:24:14 +00002651 if (HasXOP)
2652 Builder.defineMacro("__XOP__");
2653
Manman Rena45358c2012-10-11 00:59:55 +00002654 if (HasF16C)
2655 Builder.defineMacro("__F16C__");
2656
Chris Lattner96e43572009-03-02 22:40:39 +00002657 // Each case falls through to the previous one here.
2658 switch (SSELevel) {
Craig Topper23b92192012-01-09 09:19:09 +00002659 case AVX2:
2660 Builder.defineMacro("__AVX2__");
2661 case AVX:
2662 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002663 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002664 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002665 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002666 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002667 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002668 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002669 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002670 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002671 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002672 Builder.defineMacro("__SSE2__");
2673 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002674 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002675 Builder.defineMacro("__SSE__");
2676 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002677 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002678 break;
2679 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002680
Derek Schuffc7dd7222012-10-11 15:52:22 +00002681 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002682 switch (SSELevel) {
Craig Topper23b92192012-01-09 09:19:09 +00002683 case AVX2:
2684 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002685 case SSE42:
2686 case SSE41:
2687 case SSSE3:
2688 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002689 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002690 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002691 break;
2692 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002693 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002694 break;
2695 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002696 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002697 }
2698 }
2699
Anders Carlssone437c682010-01-27 03:47:49 +00002700 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002701 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002702 case AMD3DNowAthlon:
2703 Builder.defineMacro("__3dNOW_A__");
2704 case AMD3DNow:
2705 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002706 case MMX:
2707 Builder.defineMacro("__MMX__");
2708 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002709 break;
2710 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002711}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002712
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002713bool X86TargetInfo::hasFeature(StringRef Feature) const {
2714 return llvm::StringSwitch<bool>(Feature)
2715 .Case("aes", HasAES)
2716 .Case("avx", SSELevel >= AVX)
2717 .Case("avx2", SSELevel >= AVX2)
2718 .Case("bmi", HasBMI)
2719 .Case("bmi2", HasBMI2)
Craig Topperbba778b2012-06-03 21:46:30 +00002720 .Case("fma", HasFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002721 .Case("fma4", HasFMA4)
2722 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002723 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002724 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2725 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2726 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002727 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002728 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002729 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002730 .Case("prfchw", HasPRFCHW)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002731 .Case("sse", SSELevel >= SSE1)
2732 .Case("sse2", SSELevel >= SSE2)
2733 .Case("sse3", SSELevel >= SSE3)
2734 .Case("ssse3", SSELevel >= SSSE3)
2735 .Case("sse41", SSELevel >= SSE41)
2736 .Case("sse42", SSELevel >= SSE42)
Craig Topper3f122a72012-05-31 05:18:48 +00002737 .Case("sse4a", HasSSE4a)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002738 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002739 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2740 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Craig Topperf561a9562012-06-09 22:24:14 +00002741 .Case("xop", HasXOP)
Manman Rena45358c2012-10-11 00:59:55 +00002742 .Case("f16c", HasF16C)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002743 .Default(false);
2744}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002745
Eli Friedman3fd920a2008-08-20 02:34:37 +00002746bool
Anders Carlsson58436352009-02-28 17:11:49 +00002747X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002748 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002749 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002750 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002751 case 'Y': // first letter of a pair:
2752 switch (*(Name+1)) {
2753 default: return false;
2754 case '0': // First SSE register.
2755 case 't': // Any SSE register, when SSE2 is enabled.
2756 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2757 case 'm': // any MMX register, when inter-unit moves enabled.
2758 break; // falls through to setAllowsRegister.
2759 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002760 case 'a': // eax.
2761 case 'b': // ebx.
2762 case 'c': // ecx.
2763 case 'd': // edx.
2764 case 'S': // esi.
2765 case 'D': // edi.
2766 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00002767 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002768 case 't': // top of floating point stack.
2769 case 'u': // second from top of floating point stack.
2770 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002771 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002772 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002773 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002774 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2775 case 'l': // "Index" registers: any general register that can be used as an
2776 // index in a base+index memory access.
2777 Info.setAllowsRegister();
2778 return true;
2779 case 'C': // SSE floating point constant.
2780 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002781 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002782 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002783 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002784 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002785 return true;
2786 }
2787}
2788
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002789
Eli Friedman3fd920a2008-08-20 02:34:37 +00002790std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002791X86TargetInfo::convertConstraint(const char *&Constraint) const {
2792 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002793 case 'a': return std::string("{ax}");
2794 case 'b': return std::string("{bx}");
2795 case 'c': return std::string("{cx}");
2796 case 'd': return std::string("{dx}");
2797 case 'S': return std::string("{si}");
2798 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002799 case 'p': // address
2800 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002801 case 't': // top of floating point stack.
2802 return std::string("{st}");
2803 case 'u': // second from top of floating point stack.
2804 return std::string("{st(1)}"); // second from top of floating point stack.
2805 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002806 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002807 }
2808}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002809} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002810
2811namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002812// X86-32 generic target
2813class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002814public:
Eli Friedman3fd920a2008-08-20 02:34:37 +00002815 X86_32TargetInfo(const std::string& triple) : X86TargetInfo(triple) {
2816 DoubleAlign = LongLongAlign = 32;
2817 LongDoubleWidth = 96;
2818 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002819 SuitableAlign = 128;
Eli Friedman873f65a2008-08-21 00:13:15 +00002820 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2821 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames4f4aa1a2011-10-11 00:52:51 +00002822 "a0:0:64-f80:32:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002823 SizeType = UnsignedInt;
2824 PtrDiffType = SignedInt;
2825 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002826 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002827
2828 // Use fpret for all types.
2829 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2830 (1 << TargetInfo::Double) |
2831 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002832
2833 // x86-32 has atomics up to 8 bytes
2834 // FIXME: Check that we actually have cmpxchg8b before setting
2835 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2836 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002837 }
Meador Inge5d3fb222012-06-16 03:34:49 +00002838 virtual BuiltinVaListKind getBuiltinVaListKind() const {
2839 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002840 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002841
Chris Lattnerd545ad12009-09-23 06:06:36 +00002842 int getEHDataRegisterNumber(unsigned RegNo) const {
2843 if (RegNo == 0) return 0;
2844 if (RegNo == 1) return 2;
2845 return -1;
2846 }
Bill Wendling887b4852012-11-12 06:42:51 +00002847 virtual bool validateInputSize(StringRef Constraint,
2848 unsigned Size) const {
2849 switch (Constraint[0]) {
2850 default: break;
2851 case 'a':
2852 case 'b':
2853 case 'c':
2854 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00002855 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00002856 }
2857
2858 return true;
2859 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002860};
2861} // end anonymous namespace
2862
2863namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002864class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2865public:
2866 NetBSDI386TargetInfo(const std::string &triple) :
2867 NetBSDTargetInfo<X86_32TargetInfo>(triple) {
2868 }
2869
2870 virtual unsigned getFloatEvalMethod() const {
2871 // NetBSD defaults to "double" rounding
2872 return 1;
2873 }
2874};
2875} // end anonymous namespace
2876
2877namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00002878class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2879public:
2880 OpenBSDI386TargetInfo(const std::string& triple) :
2881 OpenBSDTargetInfo<X86_32TargetInfo>(triple) {
2882 SizeType = UnsignedLong;
2883 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00002884 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00002885 }
2886};
2887} // end anonymous namespace
2888
2889namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00002890class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
2891public:
2892 BitrigI386TargetInfo(const std::string& triple) :
2893 BitrigTargetInfo<X86_32TargetInfo>(triple) {
2894 SizeType = UnsignedLong;
2895 IntPtrType = SignedLong;
2896 PtrDiffType = SignedLong;
2897 }
2898};
2899} // end anonymous namespace
2900
2901namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00002902class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002903public:
Torok Edwinb2b37c62009-06-30 17:10:35 +00002904 DarwinI386TargetInfo(const std::string& triple) :
2905 DarwinTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002906 LongDoubleWidth = 128;
2907 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00002908 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00002909 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00002910 SizeType = UnsignedLong;
2911 IntPtrType = SignedLong;
Eli Friedman873f65a2008-08-21 00:13:15 +00002912 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
2913 "i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002914 "a0:0:64-f80:128:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00002915 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00002916 }
2917
Eli Friedman3fd920a2008-08-20 02:34:37 +00002918};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002919} // end anonymous namespace
2920
2921namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00002922// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002923class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00002924public:
2925 WindowsX86_32TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002926 : WindowsTargetInfo<X86_32TargetInfo>(triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00002927 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00002928 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00002929 DoubleAlign = LongLongAlign = 64;
2930 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Anton Korobeynikovd7e4a092009-12-19 02:05:07 +00002931 "i64:64:64-f32:32:32-f64:64:64-f80:128:128-v64:64:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00002932 "v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00002933 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002934 virtual void getTargetDefines(const LangOptions &Opts,
2935 MacroBuilder &Builder) const {
2936 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
2937 }
2938};
2939} // end anonymous namespace
2940
2941namespace {
2942
2943// x86-32 Windows Visual Studio target
2944class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
2945public:
2946 VisualStudioWindowsX86_32TargetInfo(const std::string& triple)
2947 : WindowsX86_32TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00002948 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002949 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
2950 }
2951 virtual void getTargetDefines(const LangOptions &Opts,
2952 MacroBuilder &Builder) const {
2953 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
2954 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
2955 // The value of the following reflects processor type.
2956 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
2957 // We lost the original triple, so we use the default.
2958 Builder.defineMacro("_M_IX86", "600");
2959 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002960};
2961} // end anonymous namespace
2962
2963namespace {
2964// x86-32 MinGW target
2965class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
2966public:
2967 MinGWX86_32TargetInfo(const std::string& triple)
2968 : WindowsX86_32TargetInfo(triple) {
2969 }
2970 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002971 MacroBuilder &Builder) const {
2972 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002973 DefineStd(Builder, "WIN32", Opts);
2974 DefineStd(Builder, "WINNT", Opts);
2975 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002976 Builder.defineMacro("__MSVCRT__");
2977 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00002978
2979 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
2980 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00002981 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00002982 // Provide "as-is" __declspec.
2983 Builder.defineMacro("__declspec", "__declspec");
2984 else
2985 // Provide alias of __attribute__ like mingw32-gcc.
2986 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002987 }
2988};
2989} // end anonymous namespace
2990
2991namespace {
2992// x86-32 Cygwin target
2993class CygwinX86_32TargetInfo : public X86_32TargetInfo {
2994public:
2995 CygwinX86_32TargetInfo(const std::string& triple)
2996 : X86_32TargetInfo(triple) {
2997 TLSSupported = false;
2998 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00002999 DoubleAlign = LongLongAlign = 64;
3000 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3001 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00003002 "a0:0:64-f80:32:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003003 }
3004 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003005 MacroBuilder &Builder) const {
3006 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003007 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003008 Builder.defineMacro("__CYGWIN__");
3009 Builder.defineMacro("__CYGWIN32__");
3010 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003011 if (Opts.CPlusPlus)
3012 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003013 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003014};
3015} // end anonymous namespace
3016
3017namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003018// x86-32 Haiku target
3019class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3020public:
3021 HaikuX86_32TargetInfo(const std::string& triple)
3022 : X86_32TargetInfo(triple) {
3023 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003024 IntPtrType = SignedLong;
3025 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003026 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003027 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003028 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003029 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00003030 virtual void getTargetDefines(const LangOptions &Opts,
3031 MacroBuilder &Builder) const {
3032 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3033 Builder.defineMacro("__INTEL__");
3034 Builder.defineMacro("__HAIKU__");
3035 }
3036};
3037} // end anonymous namespace
3038
Douglas Gregor9fabd852011-07-01 22:41:14 +00003039// RTEMS Target
3040template<typename Target>
3041class RTEMSTargetInfo : public OSTargetInfo<Target> {
3042protected:
3043 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3044 MacroBuilder &Builder) const {
3045 // RTEMS defines; list based off of gcc output
3046
Douglas Gregor9fabd852011-07-01 22:41:14 +00003047 Builder.defineMacro("__rtems__");
3048 Builder.defineMacro("__ELF__");
3049 }
3050public:
3051 RTEMSTargetInfo(const std::string &triple)
3052 : OSTargetInfo<Target>(triple) {
3053 this->UserLabelPrefix = "";
3054
3055 llvm::Triple Triple(triple);
3056 switch (Triple.getArch()) {
3057 default:
3058 case llvm::Triple::x86:
3059 // this->MCountName = ".mcount";
3060 break;
3061 case llvm::Triple::mips:
3062 case llvm::Triple::mipsel:
3063 case llvm::Triple::ppc:
3064 case llvm::Triple::ppc64:
3065 // this->MCountName = "_mcount";
3066 break;
3067 case llvm::Triple::arm:
3068 // this->MCountName = "__mcount";
3069 break;
3070 }
3071
3072 }
3073};
3074
3075namespace {
3076// x86-32 RTEMS target
3077class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3078public:
3079 RTEMSX86_32TargetInfo(const std::string& triple)
3080 : X86_32TargetInfo(triple) {
3081 SizeType = UnsignedLong;
3082 IntPtrType = SignedLong;
3083 PtrDiffType = SignedLong;
3084 this->UserLabelPrefix = "";
3085 }
3086 virtual void getTargetDefines(const LangOptions &Opts,
3087 MacroBuilder &Builder) const {
3088 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3089 Builder.defineMacro("__INTEL__");
3090 Builder.defineMacro("__rtems__");
3091 }
3092};
3093} // end anonymous namespace
3094
Chris Lattnerb986aba2010-04-11 19:29:39 +00003095namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003096// x86-64 generic target
3097class X86_64TargetInfo : public X86TargetInfo {
3098public:
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003099 X86_64TargetInfo(const std::string &triple) : X86TargetInfo(triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00003100 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003101 LongDoubleWidth = 128;
3102 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003103 LargeArrayMinWidth = 128;
3104 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003105 SuitableAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003106 IntMaxType = SignedLong;
3107 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003108 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003109 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003110
Eli Friedman873f65a2008-08-21 00:13:15 +00003111 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3112 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00003113 "a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003114
3115 // Use fpret only for long double.
3116 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003117
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003118 // Use fp2ret for _Complex long double.
3119 ComplexLongDoubleUsesFP2Ret = true;
3120
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003121 // x86-64 has atomics up to 16 bytes.
3122 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3123 // on CPUs with cmpxchg16b
3124 MaxAtomicPromoteWidth = 128;
3125 MaxAtomicInlineWidth = 64;
Chris Lattner10a5b382007-01-29 05:24:35 +00003126 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003127 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3128 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003129 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003130
Chris Lattnerd545ad12009-09-23 06:06:36 +00003131 int getEHDataRegisterNumber(unsigned RegNo) const {
3132 if (RegNo == 0) return 0;
3133 if (RegNo == 1) return 1;
3134 return -1;
3135 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003136
3137 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00003138 return (CC == CC_Default ||
3139 CC == CC_C ||
3140 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003141 }
3142
Aaron Ballman02df2e02012-12-09 17:45:41 +00003143 virtual CallingConv getDefaultCallingConv(CallingConvMethodType MT) const {
3144 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003145 }
3146
Eli Friedman3fd920a2008-08-20 02:34:37 +00003147};
3148} // end anonymous namespace
3149
3150namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003151// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003152class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003153public:
3154 WindowsX86_64TargetInfo(const std::string& triple)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003155 : WindowsTargetInfo<X86_64TargetInfo>(triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003156 TLSSupported = false;
3157 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003158 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003159 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003160 IntMaxType = SignedLongLong;
3161 UIntMaxType = UnsignedLongLong;
3162 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003163 SizeType = UnsignedLongLong;
3164 PtrDiffType = SignedLongLong;
3165 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003166 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003167 }
3168 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003169 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003170 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003171 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003172 }
Meador Inge5d3fb222012-06-16 03:34:49 +00003173 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3174 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003175 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003176};
3177} // end anonymous namespace
3178
3179namespace {
3180// x86-64 Windows Visual Studio target
3181class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
3182public:
3183 VisualStudioWindowsX86_64TargetInfo(const std::string& triple)
3184 : WindowsX86_64TargetInfo(triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003185 LongDoubleWidth = LongDoubleAlign = 64;
3186 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003187 }
3188 virtual void getTargetDefines(const LangOptions &Opts,
3189 MacroBuilder &Builder) const {
3190 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3191 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003192 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003193 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003194 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003195};
3196} // end anonymous namespace
3197
3198namespace {
3199// x86-64 MinGW target
3200class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3201public:
3202 MinGWX86_64TargetInfo(const std::string& triple)
3203 : WindowsX86_64TargetInfo(triple) {
3204 }
3205 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003206 MacroBuilder &Builder) const {
3207 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003208 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003209 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00003210 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003211 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003212
3213 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3214 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003215 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003216 // Provide "as-is" __declspec.
3217 Builder.defineMacro("__declspec", "__declspec");
3218 else
3219 // Provide alias of __attribute__ like mingw32-gcc.
3220 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003221 }
3222};
3223} // end anonymous namespace
3224
3225namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003226class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3227public:
Mike Stump11289f42009-09-09 15:08:12 +00003228 DarwinX86_64TargetInfo(const std::string& triple)
Eli Friedman2857ccb2009-07-01 03:36:11 +00003229 : DarwinTargetInfo<X86_64TargetInfo>(triple) {
3230 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003231 MaxVectorAlign = 256;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003232 }
3233};
3234} // end anonymous namespace
3235
3236namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003237class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3238public:
Mike Stump11289f42009-09-09 15:08:12 +00003239 OpenBSDX86_64TargetInfo(const std::string& triple)
Eli Friedman245f2292009-07-05 22:31:18 +00003240 : OpenBSDTargetInfo<X86_64TargetInfo>(triple) {
3241 IntMaxType = SignedLongLong;
3242 UIntMaxType = UnsignedLongLong;
3243 Int64Type = SignedLongLong;
3244 }
3245};
3246} // end anonymous namespace
3247
3248namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003249class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3250public:
3251 BitrigX86_64TargetInfo(const std::string& triple)
3252 : BitrigTargetInfo<X86_64TargetInfo>(triple) {
3253 IntMaxType = SignedLongLong;
3254 UIntMaxType = UnsignedLongLong;
3255 Int64Type = SignedLongLong;
3256 }
3257};
Tim Northover9bb857a2013-01-31 12:13:10 +00003258}
3259
3260namespace {
3261class AArch64TargetInfo : public TargetInfo {
3262 static const char * const GCCRegNames[];
3263 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3264public:
3265 AArch64TargetInfo(const std::string& triple) : TargetInfo(triple) {
3266 BigEndian = false;
3267 LongWidth = LongAlign = 64;
3268 LongDoubleWidth = LongDoubleAlign = 128;
3269 PointerWidth = PointerAlign = 64;
3270 SuitableAlign = 128;
3271 DescriptionString = "e-p:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3272 "i64:64:64-i128:128:128-f32:32:32-f64:64:64-"
3273 "f128:128:128-n32:64-S128";
3274
3275 WCharType = UnsignedInt;
3276 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3277
Tim Northover847d2d42013-02-18 12:11:32 +00003278 // AArch64 backend supports 64-bit operations at the moment. In principle
3279 // 128-bit is possible if register-pairs are used.
3280 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3281
Tim Northover9bb857a2013-01-31 12:13:10 +00003282 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3283 }
3284 virtual void getTargetDefines(const LangOptions &Opts,
3285 MacroBuilder &Builder) const {
3286 // GCC defines theses currently
3287 Builder.defineMacro("__aarch64__");
3288 Builder.defineMacro("__AARCH64EL__");
3289
3290 // ACLE predefines. Many can only have one possible value on v8 AArch64.
3291
3292 // FIXME: these were written based on an unreleased version of a 32-bit ACLE
3293 // which was intended to be compatible with a 64-bit implementation. They
3294 // will need updating when a real 64-bit ACLE exists. Particularly pressing
3295 // instances are: __AARCH_ISA_A32, __AARCH_ISA_T32, __ARCH_PCS.
3296 Builder.defineMacro("__AARCH_ACLE", "101");
3297 Builder.defineMacro("__AARCH", "8");
3298 Builder.defineMacro("__AARCH_PROFILE", "'A'");
3299
3300 Builder.defineMacro("__AARCH_FEATURE_UNALIGNED");
3301 Builder.defineMacro("__AARCH_FEATURE_CLZ");
3302 Builder.defineMacro("__AARCH_FEATURE_FMA");
3303
3304 // FIXME: ACLE 1.1 reserves bit 4. Will almost certainly come to mean
3305 // 128-bit LDXP present, at which point this becomes 0x1f.
3306 Builder.defineMacro("__AARCH_FEATURE_LDREX", "0xf");
3307
3308 // 0xe implies support for half, single and double precision operations.
3309 Builder.defineMacro("__AARCH_FP", "0xe");
3310
3311 // PCS specifies this for SysV variants, which is all we support. Other ABIs
3312 // may choose __AARCH_FP16_FORMAT_ALTERNATIVE.
3313 Builder.defineMacro("__AARCH_FP16_FORMAT_IEEE");
3314
3315 if (Opts.FastMath || Opts.FiniteMathOnly)
3316 Builder.defineMacro("__AARCH_FP_FAST");
3317
3318 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
3319 Builder.defineMacro("__AARCH_FP_FENV_ROUNDING");
3320
3321 Builder.defineMacro("__AARCH_SIZEOF_WCHAR_T",
3322 Opts.ShortWChar ? "2" : "4");
3323
3324 Builder.defineMacro("__AARCH_SIZEOF_MINIMAL_ENUM",
3325 Opts.ShortEnums ? "1" : "4");
3326
3327 if (BigEndian)
3328 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3329 }
3330 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3331 unsigned &NumRecords) const {
3332 Records = 0;
3333 NumRecords = 0;
3334 }
3335 virtual bool hasFeature(StringRef Feature) const {
3336 return Feature == "aarch64";
3337 }
3338 virtual void getGCCRegNames(const char * const *&Names,
3339 unsigned &NumNames) const;
3340 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3341 unsigned &NumAliases) const;
3342
3343 virtual bool isCLZForZeroUndef() const { return false; }
3344
3345 virtual bool validateAsmConstraint(const char *&Name,
3346 TargetInfo::ConstraintInfo &Info) const {
3347 switch (*Name) {
3348 default: return false;
3349 case 'w': // An FP/SIMD vector register
3350 Info.setAllowsRegister();
3351 return true;
3352 case 'I': // Constant that can be used with an ADD instruction
3353 case 'J': // Constant that can be used with a SUB instruction
3354 case 'K': // Constant that can be used with a 32-bit logical instruction
3355 case 'L': // Constant that can be used with a 64-bit logical instruction
3356 case 'M': // Constant that can be used as a 32-bit MOV immediate
3357 case 'N': // Constant that can be used as a 64-bit MOV immediate
3358 case 'Y': // Floating point constant zero
3359 case 'Z': // Integer constant zero
3360 return true;
3361 case 'Q': // A memory reference with base register and no offset
3362 Info.setAllowsMemory();
3363 return true;
3364 case 'S': // A symbolic address
3365 Info.setAllowsRegister();
3366 return true;
3367 case 'U':
3368 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3369 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3370 // Usa: An absolute symbolic address
3371 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3372 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3373 }
3374 }
3375
3376 virtual const char *getClobbers() const {
3377 // There are no AArch64 clobbers shared by all asm statements.
3378 return "";
3379 }
3380
3381 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3382 return TargetInfo::AArch64ABIBuiltinVaList;
3383 }
3384};
3385
3386const char * const AArch64TargetInfo::GCCRegNames[] = {
3387 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3388 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3389 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3390 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3391
3392 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3393 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3394 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3395 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3396
3397 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3398 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3399 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3400 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3401
3402 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3403 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3404 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3405 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3406
3407 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3408 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3409 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3410 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3411
3412 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3413 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3414 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3415 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3416
3417 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3418 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3419 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3420 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3421};
3422
3423void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3424 unsigned &NumNames) const {
3425 Names = GCCRegNames;
3426 NumNames = llvm::array_lengthof(GCCRegNames);
3427}
3428
3429const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3430 { { "x16" }, "ip0"},
3431 { { "x17" }, "ip1"},
3432 { { "x29" }, "fp" },
3433 { { "x30" }, "lr" }
3434};
3435
3436void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3437 unsigned &NumAliases) const {
3438 Aliases = GCCRegAliases;
3439 NumAliases = llvm::array_lengthof(GCCRegAliases);
3440
3441}
Eli Friedman9fa28852012-08-08 23:57:20 +00003442} // end anonymous namespace
3443
3444namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003445class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003446 // Possible FPU choices.
3447 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003448 VFP2FPU = (1 << 0),
3449 VFP3FPU = (1 << 1),
3450 VFP4FPU = (1 << 2),
3451 NeonFPU = (1 << 3)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003452 };
3453
3454 static bool FPUModeIsVFP(FPUMode Mode) {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003455 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003456 }
3457
3458 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3459 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003460
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003461 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003462
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003463 unsigned FPU : 4;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003464
Logan Chien57086ce2012-10-10 06:56:20 +00003465 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003466 unsigned IsThumb : 1;
3467
3468 // Initialized via features.
3469 unsigned SoftFloat : 1;
3470 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003471
Chris Lattner5cc15e02010-03-03 19:03:45 +00003472 static const Builtin::Info BuiltinInfo[];
3473
Chris Lattner17df24e2008-04-21 18:56:49 +00003474public:
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003475 ARMTargetInfo(const std::string &TripleStr)
Logan Chien57086ce2012-10-10 06:56:20 +00003476 : TargetInfo(TripleStr), ABI("aapcs-linux"), CPU("arm1136j-s"), IsAAPCS(true)
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003477 {
Eli Friedman803acb32011-12-22 03:51:45 +00003478 BigEndian = false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003479 SizeType = UnsignedInt;
3480 PtrDiffType = SignedInt;
James Molloyc445be42011-11-23 13:35:08 +00003481 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3482 WCharType = UnsignedInt;
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003483
Chris Lattner1a8f3942010-04-23 16:29:58 +00003484 // {} in inline assembly are neon specifiers, not assembly variant
3485 // specifiers.
3486 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003487
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003488 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003489 IsThumb = getTriple().getArchName().startswith("thumb");
Daniel Dunbar03184792009-09-22 21:44:58 +00003490 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00003491 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3492 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00003493 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
3494 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00003495 "v64:64:64-v128:64:128-a0:0:32-n32-S64");
Daniel Dunbar03184792009-09-22 21:44:58 +00003496 } else {
3497 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
3498 "i64:64:64-f32:32:32-f64:64:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00003499 "v64:64:64-v128:64:128-a0:0:64-n32-S64");
Daniel Dunbar03184792009-09-22 21:44:58 +00003500 }
John McCall86353412010-08-21 22:46:04 +00003501
3502 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003503 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003504
3505 // ARM has atomics up to 8 bytes
3506 // FIXME: Set MaxAtomicInlineWidth if we have the feature v6e
3507 MaxAtomicPromoteWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003508
3509 // Do force alignment of members that follow zero length bitfields. If
3510 // the alignment of the zero-length bitfield is greater than the member
3511 // that follows it, `bar', `bar' will be aligned as the type of the
3512 // zero length bitfield.
3513 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003514 }
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003515 virtual const char *getABI() const { return ABI.c_str(); }
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003516 virtual bool setABI(const std::string &Name) {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003517 ABI = Name;
3518
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003519 // The defaults (above) are for AAPCS, check if we need to change them.
3520 //
3521 // FIXME: We need support for -meabi... we could just mangle it into the
3522 // name.
3523 if (Name == "apcs-gnu") {
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003524 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003525 // size_t is unsigned int on FreeBSD.
3526 if (getTriple().getOS() != llvm::Triple::FreeBSD)
3527 SizeType = UnsignedLong;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003528
James Molloyc445be42011-11-23 13:35:08 +00003529 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3530 WCharType = SignedInt;
3531
Daniel Dunbarf8125062010-04-22 16:14:54 +00003532 // Do not respect the alignment of bit-field types when laying out
3533 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3534 UseBitFieldTypeAlignment = false;
3535
Chad Rosier18903ee2011-08-04 01:21:14 +00003536 /// gcc forces the alignment to 4 bytes, regardless of the type of the
Chad Rosiera336c6f2011-08-04 17:52:43 +00003537 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3538 /// gcc.
Chad Rosier18903ee2011-08-04 01:21:14 +00003539 ZeroLengthBitfieldBoundary = 32;
3540
Logan Chien57086ce2012-10-10 06:56:20 +00003541 IsAAPCS = false;
3542
Daniel Dunbar03184792009-09-22 21:44:58 +00003543 if (IsThumb) {
Sandeep Patelf87b3732011-04-04 22:58:12 +00003544 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3545 // so set preferred for small types to 32.
Daniel Dunbar03184792009-09-22 21:44:58 +00003546 DescriptionString = ("e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
Bob Wilson1957a2f2011-06-29 16:09:20 +00003547 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00003548 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbar03184792009-09-22 21:44:58 +00003549 } else {
3550 DescriptionString = ("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Bob Wilsone3a15fe2011-04-04 16:53:11 +00003551 "i64:32:64-f32:32:32-f64:32:64-"
Lang Hames60b2b2e2011-10-10 23:44:43 +00003552 "v64:32:64-v128:32:128-a0:0:32-n32-S32");
Daniel Dunbar03184792009-09-22 21:44:58 +00003553 }
3554
Chad Rosier99ee7822011-07-26 07:03:04 +00003555 // FIXME: Override "preferred align" for double and long long.
David Tweed8f676532012-10-25 13:33:01 +00003556 } else if (Name == "aapcs" || Name == "aapcs-vfp") {
Logan Chien57086ce2012-10-10 06:56:20 +00003557 IsAAPCS = true;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003558 // FIXME: Enumerated types are variable width in straight AAPCS.
3559 } else if (Name == "aapcs-linux") {
Logan Chien57086ce2012-10-10 06:56:20 +00003560 IsAAPCS = true;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003561 } else
3562 return false;
3563
3564 return true;
3565 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003566
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00003567 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003568 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3569 Features["vfp2"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003570 else if (CPU == "cortex-a8" || CPU == "cortex-a15" ||
3571 CPU == "cortex-a9" || CPU == "cortex-a9-mp")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003572 Features["neon"] = true;
Bob Wilsonf643afc2013-03-04 22:37:46 +00003573 else if (CPU == "swift" || CPU == "cortex-a7") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003574 Features["vfp4"] = true;
3575 Features["neon"] = true;
3576 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003577 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003578
Daniel Dunbar893d4752009-12-19 04:15:38 +00003579 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer27402c62012-03-05 15:10:44 +00003580 StringRef Name,
Daniel Dunbar893d4752009-12-19 04:15:38 +00003581 bool Enabled) const {
Evan Cheng491f56d2011-07-08 06:40:11 +00003582 if (Name == "soft-float" || Name == "soft-float-abi" ||
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003583 Name == "vfp2" || Name == "vfp3" || Name == "vfp4" || Name == "neon" ||
3584 Name == "d16" || Name == "neonfp") {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003585 Features[Name] = Enabled;
3586 } else
Daniel Dunbar893d4752009-12-19 04:15:38 +00003587 return false;
3588
Daniel Dunbar893d4752009-12-19 04:15:38 +00003589 return true;
3590 }
3591
3592 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003593 FPU = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003594 SoftFloat = SoftFloatABI = false;
3595 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3596 if (Features[i] == "+soft-float")
3597 SoftFloat = true;
3598 else if (Features[i] == "+soft-float-abi")
3599 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003600 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003601 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003602 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003603 FPU |= VFP3FPU;
3604 else if (Features[i] == "+vfp4")
3605 FPU |= VFP4FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003606 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003607 FPU |= NeonFPU;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003608 }
3609
3610 // Remove front-end specific options which the backend handles differently.
3611 std::vector<std::string>::iterator it;
3612 it = std::find(Features.begin(), Features.end(), "+soft-float");
3613 if (it != Features.end())
3614 Features.erase(it);
3615 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3616 if (it != Features.end())
3617 Features.erase(it);
3618 }
3619
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003620 virtual bool hasFeature(StringRef Feature) const {
3621 return llvm::StringSwitch<bool>(Feature)
3622 .Case("arm", true)
3623 .Case("softfloat", SoftFloat)
3624 .Case("thumb", IsThumb)
3625 .Case("neon", FPU == NeonFPU && !SoftFloat &&
3626 StringRef(getCPUDefineSuffix(CPU)).startswith("7"))
3627 .Default(false);
3628 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003629 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003630 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003631 return llvm::StringSwitch<const char*>(Name)
3632 .Cases("arm8", "arm810", "4")
3633 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3634 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3635 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3636 .Case("ep9312", "4T")
3637 .Cases("arm10tdmi", "arm1020t", "5T")
3638 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3639 .Case("arm926ej-s", "5TEJ")
3640 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3641 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003642 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003643 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003644 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003645 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonf643afc2013-03-04 22:37:46 +00003646 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
3647 .Cases("cortex-a9", "cortex-a15", "7A")
Quentin Colombetf5a37a32012-12-21 17:57:47 +00003648 .Case("cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003649 .Case("cortex-a9-mp", "7F")
3650 .Case("swift", "7S")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003651 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003652 .Case("cortex-m0", "6M")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003653 .Default(0);
3654 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003655 static const char *getCPUProfile(StringRef Name) {
3656 return llvm::StringSwitch<const char*>(Name)
3657 .Cases("cortex-a8", "cortex-a9", "A")
3658 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Quentin Colombetf5a37a32012-12-21 17:57:47 +00003659 .Case("cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00003660 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003661 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003662 virtual bool setCPU(const std::string &Name) {
3663 if (!getCPUDefineSuffix(Name))
3664 return false;
3665
3666 CPU = Name;
3667 return true;
3668 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003669 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003670 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003671 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003672 Builder.defineMacro("__arm");
3673 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003674
Chris Lattnerecd49032009-03-02 22:27:17 +00003675 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003676 Builder.defineMacro("__ARMEL__");
3677 Builder.defineMacro("__LITTLE_ENDIAN__");
3678 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003679
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003680 StringRef CPUArch = getCPUDefineSuffix(CPU);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003681 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003682 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3683 StringRef CPUProfile = getCPUProfile(CPU);
3684 if (!CPUProfile.empty())
3685 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
3686
Mike Stump9d54bd72009-04-08 02:07:04 +00003687 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003688
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003689 // FIXME: It's more complicated than this and we don't really support
3690 // interworking.
3691 if ('5' <= CPUArch[0] && CPUArch[0] <= '7')
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003692 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003693
David Tweed8f676532012-10-25 13:33:01 +00003694 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Daniel Dunbarf7124da2012-10-22 18:51:13 +00003695 // M-class CPUs on Darwin follow AAPCS, but not EABI.
Daniel Dunbard9debab2012-10-22 18:56:43 +00003696 if (!(getTriple().isOSDarwin() && CPUProfile == "M"))
Daniel Dunbarf7124da2012-10-22 18:51:13 +00003697 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003698 Builder.defineMacro("__ARM_PCS", "1");
3699
David Tweed8f676532012-10-25 13:33:01 +00003700 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003701 Builder.defineMacro("__ARM_PCS_VFP", "1");
3702 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003703
Daniel Dunbar893d4752009-12-19 04:15:38 +00003704 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003705 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003706
3707 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003708 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003709
Bob Wilson19c1b882011-05-13 18:56:03 +00003710 bool IsARMv7 = CPUArch.startswith("7");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003711 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003712 Builder.defineMacro("__THUMBEL__");
3713 Builder.defineMacro("__thumb__");
Bob Wilson19c1b882011-05-13 18:56:03 +00003714 if (CPUArch == "6T2" || IsARMv7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003715 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003716 }
3717
3718 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003719 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003720
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003721 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003722 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003723 if (FPU & VFP2FPU)
3724 Builder.defineMacro("__ARM_VFPV2__");
3725 if (FPU & VFP3FPU)
3726 Builder.defineMacro("__ARM_VFPV3__");
3727 if (FPU & VFP4FPU)
3728 Builder.defineMacro("__ARM_VFPV4__");
3729 }
3730
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003731 // This only gets set when Neon instructions are actually available, unlike
3732 // the VFP define, hence the soft float and arch check. This is subtly
3733 // different from gcc, we follow the intent which was that it should be set
3734 // when Neon instructions are actually available.
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003735 if ((FPU & NeonFPU) && !SoftFloat && IsARMv7)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003736 Builder.defineMacro("__ARM_NEON__");
Chris Lattner17df24e2008-04-21 18:56:49 +00003737 }
3738 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3739 unsigned &NumRecords) const {
Chris Lattner5cc15e02010-03-03 19:03:45 +00003740 Records = BuiltinInfo;
3741 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00003742 }
Bob Wilsona7a61e22012-01-26 22:14:27 +00003743 virtual bool isCLZForZeroUndef() const { return false; }
Meador Inge5d3fb222012-06-16 03:34:49 +00003744 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Logan Chien57086ce2012-10-10 06:56:20 +00003745 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00003746 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003747 virtual void getGCCRegNames(const char * const *&Names,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003748 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003749 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003750 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00003751 virtual bool validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003752 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003753 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00003754 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00003755 case 'l': // r0-r7
3756 case 'h': // r8-r15
3757 case 'w': // VFP Floating point register single precision
3758 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00003759 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00003760 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00003761 case 'Q': // A memory address that is a single base register.
3762 Info.setAllowsMemory();
3763 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003764 case 'U': // a memory reference...
3765 switch (Name[1]) {
3766 case 'q': // ...ARMV4 ldrsb
3767 case 'v': // ...VFP load/store (reg+constant offset)
3768 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00003769 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00003770 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00003771 case 'n': // valid address for Neon doubleword vector load/store
3772 case 'm': // valid address for Neon element and structure load/store
3773 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00003774 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003775 Info.setAllowsMemory();
3776 Name++;
3777 return true;
3778 }
Nate Begeman2908fa02008-04-22 05:03:19 +00003779 }
Chris Lattner17df24e2008-04-21 18:56:49 +00003780 return false;
3781 }
Evan Chengd863adb2011-06-16 19:13:15 +00003782 virtual std::string convertConstraint(const char *&Constraint) const {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003783 std::string R;
3784 switch (*Constraint) {
3785 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00003786 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003787 Constraint++;
3788 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00003789 case 'p': // 'p' should be translated to 'r' by default.
3790 R = std::string("r");
3791 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003792 default:
3793 return std::string(1, *Constraint);
3794 }
3795 return R;
3796 }
Bill Wendling9d1ee112012-10-25 23:28:48 +00003797 virtual bool validateConstraintModifier(StringRef Constraint,
3798 const char Modifier,
3799 unsigned Size) const {
Bill Wendling3c6591d2012-11-30 23:18:12 +00003800 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00003801 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00003802
Bill Wendling9d1ee112012-10-25 23:28:48 +00003803 // Strip off constraint modifiers.
3804 while (Constraint[0] == '=' ||
3805 Constraint[0] == '+' ||
3806 Constraint[0] == '&')
3807 Constraint = Constraint.substr(1);
3808
3809 switch (Constraint[0]) {
3810 default: break;
3811 case 'r': {
3812 switch (Modifier) {
3813 default:
Bill Wendling05175082012-11-30 23:46:56 +00003814 return isInOut || (isOutput && Size >= 32) ||
3815 (!isOutput && !isInOut && Size <= 32);
Bill Wendling9d1ee112012-10-25 23:28:48 +00003816 case 'q':
3817 // A register of size 32 cannot fit a vector type.
3818 return false;
3819 }
3820 }
3821 }
3822
3823 return true;
3824 }
Chris Lattner17df24e2008-04-21 18:56:49 +00003825 virtual const char *getClobbers() const {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003826 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00003827 return "";
3828 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003829
3830 virtual CallingConvCheckResult checkCallingConvention(CallingConv CC) const {
3831 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
3832 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00003833
3834 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
3835 if (RegNo == 0) return 0;
3836 if (RegNo == 1) return 1;
3837 return -1;
3838 }
Chris Lattner17df24e2008-04-21 18:56:49 +00003839};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003840
3841const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00003842 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003843 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00003844 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
3845
3846 // Float registers
3847 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3848 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3849 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00003850 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00003851
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00003852 // Double registers
3853 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3854 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00003855 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3856 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00003857
3858 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00003859 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3860 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003861};
3862
3863void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00003864 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003865 Names = GCCRegNames;
3866 NumNames = llvm::array_lengthof(GCCRegNames);
3867}
3868
3869const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003870 { { "a1" }, "r0" },
3871 { { "a2" }, "r1" },
3872 { { "a3" }, "r2" },
3873 { { "a4" }, "r3" },
3874 { { "v1" }, "r4" },
3875 { { "v2" }, "r5" },
3876 { { "v3" }, "r6" },
3877 { { "v4" }, "r7" },
3878 { { "v5" }, "r8" },
3879 { { "v6", "rfp" }, "r9" },
3880 { { "sl" }, "r10" },
3881 { { "fp" }, "r11" },
3882 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00003883 { { "r13" }, "sp" },
3884 { { "r14" }, "lr" },
3885 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00003886 // The S, D and Q registers overlap, but aren't really aliases; we
3887 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003888};
3889
3890void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3891 unsigned &NumAliases) const {
3892 Aliases = GCCRegAliases;
3893 NumAliases = llvm::array_lengthof(GCCRegAliases);
3894}
Chris Lattner5cc15e02010-03-03 19:03:45 +00003895
3896const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00003897#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00003898#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00003899 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00003900#include "clang/Basic/BuiltinsARM.def"
3901};
Chris Lattner17df24e2008-04-21 18:56:49 +00003902} // end anonymous namespace.
3903
Eli Friedmanf05b7722008-08-20 07:44:10 +00003904namespace {
Mike Stump11289f42009-09-09 15:08:12 +00003905class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00003906 public DarwinTargetInfo<ARMTargetInfo> {
3907protected:
Daniel Dunbar40165182009-08-24 09:10:05 +00003908 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003909 MacroBuilder &Builder) const {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00003910 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00003911 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00003912
Torok Edwinb2b37c62009-06-30 17:10:35 +00003913public:
Mike Stump11289f42009-09-09 15:08:12 +00003914 DarwinARMTargetInfo(const std::string& triple)
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00003915 : DarwinTargetInfo<ARMTargetInfo>(triple) {
3916 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003917 // iOS always has 64-bit atomic instructions.
3918 // FIXME: This should be based off of the target features in ARMTargetInfo.
3919 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00003920
3921 // Darwin on iOS uses a variant of the ARM C++ ABI.
3922 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00003923 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00003924};
3925} // end anonymous namespace.
3926
Tony Linthicum76329bf2011-12-12 21:14:55 +00003927
3928namespace {
3929// Hexagon abstract base class
3930class HexagonTargetInfo : public TargetInfo {
3931 static const Builtin::Info BuiltinInfo[];
3932 static const char * const GCCRegNames[];
3933 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3934 std::string CPU;
3935public:
3936 HexagonTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00003937 BigEndian = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003938 DescriptionString = ("e-p:32:32:32-"
Anshuman Dasgupta89730ce2013-01-02 21:25:57 +00003939 "i64:64:64-i32:32:32-i16:16:16-i1:32:32-"
Sirish Pande11ebc4e2012-05-10 20:19:54 +00003940 "f64:64:64-f32:32:32-a0:0-n32");
Tony Linthicum76329bf2011-12-12 21:14:55 +00003941
3942 // {} in inline assembly are packet specifiers, not assembly variant
3943 // specifiers.
3944 NoAsmVariants = true;
3945 }
3946
3947 virtual void getTargetBuiltins(const Builtin::Info *&Records,
3948 unsigned &NumRecords) const {
3949 Records = BuiltinInfo;
3950 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
3951 }
3952
3953 virtual bool validateAsmConstraint(const char *&Name,
3954 TargetInfo::ConstraintInfo &Info) const {
3955 return true;
3956 }
3957
3958 virtual void getTargetDefines(const LangOptions &Opts,
3959 MacroBuilder &Builder) const;
3960
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003961 virtual bool hasFeature(StringRef Feature) const {
3962 return Feature == "hexagon";
3963 }
3964
Meador Inge5d3fb222012-06-16 03:34:49 +00003965 virtual BuiltinVaListKind getBuiltinVaListKind() const {
3966 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003967 }
3968 virtual void getGCCRegNames(const char * const *&Names,
3969 unsigned &NumNames) const;
3970 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3971 unsigned &NumAliases) const;
3972 virtual const char *getClobbers() const {
3973 return "";
3974 }
Sebastian Pop86500282012-01-13 20:37:10 +00003975
3976 static const char *getHexagonCPUSuffix(StringRef Name) {
3977 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00003978 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00003979 .Case("hexagonv5", "5")
Sebastian Pop86500282012-01-13 20:37:10 +00003980 .Default(0);
3981 }
3982
Tony Linthicum76329bf2011-12-12 21:14:55 +00003983 virtual bool setCPU(const std::string &Name) {
Sebastian Pop86500282012-01-13 20:37:10 +00003984 if (!getHexagonCPUSuffix(Name))
3985 return false;
3986
Tony Linthicum76329bf2011-12-12 21:14:55 +00003987 CPU = Name;
3988 return true;
3989 }
3990};
3991
3992void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
3993 MacroBuilder &Builder) const {
3994 Builder.defineMacro("qdsp6");
3995 Builder.defineMacro("__qdsp6", "1");
3996 Builder.defineMacro("__qdsp6__", "1");
3997
3998 Builder.defineMacro("hexagon");
3999 Builder.defineMacro("__hexagon", "1");
4000 Builder.defineMacro("__hexagon__", "1");
4001
4002 if(CPU == "hexagonv1") {
4003 Builder.defineMacro("__HEXAGON_V1__");
4004 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4005 if(Opts.HexagonQdsp6Compat) {
4006 Builder.defineMacro("__QDSP6_V1__");
4007 Builder.defineMacro("__QDSP6_ARCH__", "1");
4008 }
4009 }
4010 else if(CPU == "hexagonv2") {
4011 Builder.defineMacro("__HEXAGON_V2__");
4012 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4013 if(Opts.HexagonQdsp6Compat) {
4014 Builder.defineMacro("__QDSP6_V2__");
4015 Builder.defineMacro("__QDSP6_ARCH__", "2");
4016 }
4017 }
4018 else if(CPU == "hexagonv3") {
4019 Builder.defineMacro("__HEXAGON_V3__");
4020 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4021 if(Opts.HexagonQdsp6Compat) {
4022 Builder.defineMacro("__QDSP6_V3__");
4023 Builder.defineMacro("__QDSP6_ARCH__", "3");
4024 }
4025 }
4026 else if(CPU == "hexagonv4") {
4027 Builder.defineMacro("__HEXAGON_V4__");
4028 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4029 if(Opts.HexagonQdsp6Compat) {
4030 Builder.defineMacro("__QDSP6_V4__");
4031 Builder.defineMacro("__QDSP6_ARCH__", "4");
4032 }
4033 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004034 else if(CPU == "hexagonv5") {
4035 Builder.defineMacro("__HEXAGON_V5__");
4036 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4037 if(Opts.HexagonQdsp6Compat) {
4038 Builder.defineMacro("__QDSP6_V5__");
4039 Builder.defineMacro("__QDSP6_ARCH__", "5");
4040 }
4041 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004042}
4043
4044const char * const HexagonTargetInfo::GCCRegNames[] = {
4045 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4046 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4047 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4048 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4049 "p0", "p1", "p2", "p3",
4050 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4051};
4052
4053void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4054 unsigned &NumNames) const {
4055 Names = GCCRegNames;
4056 NumNames = llvm::array_lengthof(GCCRegNames);
4057}
4058
4059
4060const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4061 { { "sp" }, "r29" },
4062 { { "fp" }, "r30" },
4063 { { "lr" }, "r31" },
4064 };
4065
4066void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4067 unsigned &NumAliases) const {
4068 Aliases = GCCRegAliases;
4069 NumAliases = llvm::array_lengthof(GCCRegAliases);
4070}
4071
4072
4073const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4074#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4075#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4076 ALL_LANGUAGES },
4077#include "clang/Basic/BuiltinsHexagon.def"
4078};
4079}
4080
4081
Chris Lattner5ba61f02006-10-14 07:39:34 +00004082namespace {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004083class SparcV8TargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004084 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4085 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004086 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004087public:
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004088 SparcV8TargetInfo(const std::string& triple) : TargetInfo(triple) {
4089 // FIXME: Support Sparc quad-precision long double?
Eli Friedman873f65a2008-08-21 00:13:15 +00004090 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
Chris Lattner5c67237f2009-11-07 18:59:41 +00004091 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32";
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004092 }
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004093 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
Benjamin Kramer27402c62012-03-05 15:10:44 +00004094 StringRef Name,
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004095 bool Enabled) const {
4096 if (Name == "soft-float")
4097 Features[Name] = Enabled;
4098 else
4099 return false;
4100
4101 return true;
4102 }
4103 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
4104 SoftFloat = false;
4105 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4106 if (Features[i] == "+soft-float")
4107 SoftFloat = true;
4108 }
Chris Lattner4ba73aa02009-03-20 15:52:06 +00004109 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004110 MacroBuilder &Builder) const {
4111 DefineStd(Builder, "sparc", Opts);
4112 Builder.defineMacro("__sparcv8");
4113 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004114
4115 if (SoftFloat)
4116 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004117 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004118
4119 virtual bool hasFeature(StringRef Feature) const {
4120 return llvm::StringSwitch<bool>(Feature)
4121 .Case("softfloat", SoftFloat)
4122 .Case("sparc", true)
4123 .Default(false);
4124 }
4125
Gabor Greif49991682008-02-21 16:29:08 +00004126 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4127 unsigned &NumRecords) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004128 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00004129 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004130 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4131 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00004132 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004133 virtual void getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00004134 unsigned &NumNames) const;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004135 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00004136 unsigned &NumAliases) const;
Anders Carlsson58436352009-02-28 17:11:49 +00004137 virtual bool validateAsmConstraint(const char *&Name,
Gabor Greif49991682008-02-21 16:29:08 +00004138 TargetInfo::ConstraintInfo &info) const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004139 // FIXME: Implement!
4140 return false;
Gabor Greif49991682008-02-21 16:29:08 +00004141 }
4142 virtual const char *getClobbers() const {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004143 // FIXME: Implement!
4144 return "";
Gabor Greif49991682008-02-21 16:29:08 +00004145 }
4146};
4147
Chris Lattner9b415d62009-01-27 01:58:38 +00004148const char * const SparcV8TargetInfo::GCCRegNames[] = {
4149 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4150 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4151 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4152 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4153};
4154
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004155void SparcV8TargetInfo::getGCCRegNames(const char * const *&Names,
Chris Lattner9b415d62009-01-27 01:58:38 +00004156 unsigned &NumNames) const {
4157 Names = GCCRegNames;
4158 NumNames = llvm::array_lengthof(GCCRegNames);
4159}
4160
4161const TargetInfo::GCCRegAlias SparcV8TargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004162 { { "g0" }, "r0" },
4163 { { "g1" }, "r1" },
4164 { { "g2" }, "r2" },
4165 { { "g3" }, "r3" },
4166 { { "g4" }, "r4" },
4167 { { "g5" }, "r5" },
4168 { { "g6" }, "r6" },
4169 { { "g7" }, "r7" },
4170 { { "o0" }, "r8" },
4171 { { "o1" }, "r9" },
4172 { { "o2" }, "r10" },
4173 { { "o3" }, "r11" },
4174 { { "o4" }, "r12" },
4175 { { "o5" }, "r13" },
4176 { { "o6", "sp" }, "r14" },
4177 { { "o7" }, "r15" },
4178 { { "l0" }, "r16" },
4179 { { "l1" }, "r17" },
4180 { { "l2" }, "r18" },
4181 { { "l3" }, "r19" },
4182 { { "l4" }, "r20" },
4183 { { "l5" }, "r21" },
4184 { { "l6" }, "r22" },
4185 { { "l7" }, "r23" },
4186 { { "i0" }, "r24" },
4187 { { "i1" }, "r25" },
4188 { { "i2" }, "r26" },
4189 { { "i3" }, "r27" },
4190 { { "i4" }, "r28" },
4191 { { "i5" }, "r29" },
4192 { { "i6", "fp" }, "r30" },
4193 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00004194};
4195
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004196void SparcV8TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Chris Lattner9b415d62009-01-27 01:58:38 +00004197 unsigned &NumAliases) const {
4198 Aliases = GCCRegAliases;
4199 NumAliases = llvm::array_lengthof(GCCRegAliases);
4200}
Gabor Greif49991682008-02-21 16:29:08 +00004201} // end anonymous namespace.
4202
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004203namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004204class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4205public:
4206 AuroraUXSparcV8TargetInfo(const std::string& triple) :
4207 AuroraUXTargetInfo<SparcV8TargetInfo>(triple) {
4208 SizeType = UnsignedInt;
4209 PtrDiffType = SignedInt;
4210 }
4211};
Torok Edwinb2b37c62009-06-30 17:10:35 +00004212class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004213public:
4214 SolarisSparcV8TargetInfo(const std::string& triple) :
Torok Edwinb2b37c62009-06-30 17:10:35 +00004215 SolarisTargetInfo<SparcV8TargetInfo>(triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00004216 SizeType = UnsignedInt;
4217 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004218 }
4219};
4220} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00004221
Chris Lattnerb781dc792008-05-08 05:58:21 +00004222namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004223 class MSP430TargetInfo : public TargetInfo {
4224 static const char * const GCCRegNames[];
4225 public:
4226 MSP430TargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004227 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004228 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00004229 IntWidth = 16; IntAlign = 16;
4230 LongWidth = 32; LongLongWidth = 64;
4231 LongAlign = LongLongAlign = 16;
4232 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004233 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004234 SizeType = UnsignedInt;
4235 IntMaxType = SignedLong;
4236 UIntMaxType = UnsignedLong;
4237 IntPtrType = SignedShort;
4238 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00004239 SigAtomicType = SignedLong;
Anton Korobeynikovd94329a2009-12-19 01:32:37 +00004240 DescriptionString = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004241 }
4242 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004243 MacroBuilder &Builder) const {
4244 Builder.defineMacro("MSP430");
4245 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004246 // FIXME: defines for different 'flavours' of MCU
4247 }
4248 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4249 unsigned &NumRecords) const {
4250 // FIXME: Implement.
4251 Records = 0;
4252 NumRecords = 0;
4253 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004254 virtual bool hasFeature(StringRef Feature) const {
4255 return Feature == "msp430";
4256 }
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004257 virtual void getGCCRegNames(const char * const *&Names,
4258 unsigned &NumNames) const;
4259 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4260 unsigned &NumAliases) const {
4261 // No aliases.
4262 Aliases = 0;
4263 NumAliases = 0;
4264 }
4265 virtual bool validateAsmConstraint(const char *&Name,
4266 TargetInfo::ConstraintInfo &info) const {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00004267 // No target constraints for now.
4268 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004269 }
4270 virtual const char *getClobbers() const {
4271 // FIXME: Is this really right?
4272 return "";
4273 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004274 virtual BuiltinVaListKind getBuiltinVaListKind() const {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004275 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00004276 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004277 }
4278 };
4279
4280 const char * const MSP430TargetInfo::GCCRegNames[] = {
4281 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4282 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4283 };
4284
4285 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4286 unsigned &NumNames) const {
4287 Names = GCCRegNames;
4288 NumNames = llvm::array_lengthof(GCCRegNames);
4289 }
4290}
4291
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00004292namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004293
Mike Stump11289f42009-09-09 15:08:12 +00004294 // LLVM and Clang cannot be used directly to output native binaries for
4295 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00004296 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00004297 //
4298 // TCE uses the llvm bitcode as input and uses it for generating customized
4299 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00004300 // publicly available in http://tce.cs.tut.fi
4301
Eli Friedman1f191002011-10-07 19:51:42 +00004302 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4303 3, // opencl_global
4304 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00004305 5, // opencl_constant
4306 0, // cuda_device
4307 0, // cuda_constant
4308 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00004309 };
4310
Eli Friedmana9c3d712009-08-19 20:47:07 +00004311 class TCETargetInfo : public TargetInfo{
4312 public:
4313 TCETargetInfo(const std::string& triple) : TargetInfo(triple) {
4314 TLSSupported = false;
4315 IntWidth = 32;
4316 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004317 PointerWidth = 32;
4318 IntAlign = 32;
4319 LongAlign = LongLongAlign = 32;
4320 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004321 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004322 SizeType = UnsignedInt;
4323 IntMaxType = SignedLong;
4324 UIntMaxType = UnsignedLong;
4325 IntPtrType = SignedInt;
4326 PtrDiffType = SignedInt;
4327 FloatWidth = 32;
4328 FloatAlign = 32;
4329 DoubleWidth = 32;
4330 DoubleAlign = 32;
4331 LongDoubleWidth = 32;
4332 LongDoubleAlign = 32;
4333 FloatFormat = &llvm::APFloat::IEEEsingle;
4334 DoubleFormat = &llvm::APFloat::IEEEsingle;
4335 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Chris Lattner09797542010-03-04 21:07:38 +00004336 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-"
4337 "i16:16:32-i32:32:32-i64:32:32-"
NAKAMURA Takumidba4ed32011-02-18 08:44:38 +00004338 "f32:32:32-f64:32:32-v64:32:32-"
4339 "v128:32:32-a0:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00004340 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004341 }
4342
4343 virtual void getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004344 MacroBuilder &Builder) const {
4345 DefineStd(Builder, "tce", Opts);
4346 Builder.defineMacro("__TCE__");
4347 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00004348 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004349 virtual bool hasFeature(StringRef Feature) const {
4350 return Feature == "tce";
4351 }
4352
Eli Friedmana9c3d712009-08-19 20:47:07 +00004353 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4354 unsigned &NumRecords) const {}
Daniel Dunbar576d90d2009-08-24 09:54:37 +00004355 virtual const char *getClobbers() const {
4356 return "";
4357 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004358 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4359 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004360 }
Eli Friedmana9c3d712009-08-19 20:47:07 +00004361 virtual void getGCCRegNames(const char * const *&Names,
4362 unsigned &NumNames) const {}
4363 virtual bool validateAsmConstraint(const char *&Name,
4364 TargetInfo::ConstraintInfo &info) const {
4365 return true;
4366 }
4367 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4368 unsigned &NumAliases) const {}
4369 };
4370}
4371
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004372namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004373class MipsTargetInfoBase : public TargetInfo {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004374 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004375 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00004376 bool IsMips16;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004377 enum MipsFloatABI {
4378 HardFloat, SingleFloat, SoftFloat
4379 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004380 enum DspRevEnum {
4381 NoDSP, DSP1, DSP2
4382 } DspRev;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004383
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004384protected:
4385 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004386
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004387public:
Simon Atanasyance74e9d2012-04-12 19:59:24 +00004388 MipsTargetInfoBase(const std::string& triple,
4389 const std::string& ABIStr,
4390 const std::string& CPUStr)
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004391 : TargetInfo(triple),
Simon Atanasyance74e9d2012-04-12 19:59:24 +00004392 CPU(CPUStr),
Simon Atanasyan72244b62012-07-05 16:06:06 +00004393 IsMips16(false),
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004394 FloatABI(HardFloat),
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004395 DspRev(NoDSP),
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004396 ABI(ABIStr)
4397 {}
4398
Eric Christopher0b26a612010-03-02 02:41:08 +00004399 virtual const char *getABI() const { return ABI.c_str(); }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004400 virtual bool setABI(const std::string &Name) = 0;
Eric Christopher0b26a612010-03-02 02:41:08 +00004401 virtual bool setCPU(const std::string &Name) {
4402 CPU = Name;
4403 return true;
4404 }
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00004405 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Eric Christopher0b26a612010-03-02 02:41:08 +00004406 Features[ABI] = true;
4407 Features[CPU] = true;
4408 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004409
Simon Atanasyan16ee0052012-08-29 19:59:32 +00004410 virtual void getTargetDefines(const LangOptions &Opts,
4411 MacroBuilder &Builder) const {
Simon Atanasyan683535b2012-08-29 19:14:58 +00004412 DefineStd(Builder, "mips", Opts);
4413 Builder.defineMacro("_mips");
4414 Builder.defineMacro("__REGISTER_PREFIX__", "");
4415
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004416 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004417 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004418 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004419 break;
4420 case SingleFloat:
4421 Builder.defineMacro("__mips_hard_float", Twine(1));
4422 Builder.defineMacro("__mips_single_float", Twine(1));
4423 break;
4424 case SoftFloat:
4425 Builder.defineMacro("__mips_soft_float", Twine(1));
4426 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004427 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00004428
Simon Atanasyan72244b62012-07-05 16:06:06 +00004429 if (IsMips16)
4430 Builder.defineMacro("__mips16", Twine(1));
4431
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004432 switch (DspRev) {
4433 default:
4434 break;
4435 case DSP1:
4436 Builder.defineMacro("__mips_dsp_rev", Twine(1));
4437 Builder.defineMacro("__mips_dsp", Twine(1));
4438 break;
4439 case DSP2:
4440 Builder.defineMacro("__mips_dsp_rev", Twine(2));
4441 Builder.defineMacro("__mips_dspr2", Twine(1));
4442 Builder.defineMacro("__mips_dsp", Twine(1));
4443 break;
4444 }
4445
Simon Atanasyan26f19672012-04-05 19:28:31 +00004446 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
4447 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
4448 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00004449
4450 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
4451 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004452 }
4453
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004454 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4455 unsigned &NumRecords) const {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004456 Records = BuiltinInfo;
4457 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004458 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004459 virtual bool hasFeature(StringRef Feature) const {
4460 return Feature == "mips";
4461 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004462 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4463 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004464 }
4465 virtual void getGCCRegNames(const char * const *&Names,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004466 unsigned &NumNames) const {
4467 static const char * const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00004468 // CPU register names
4469 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004470 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
4471 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
4472 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00004473 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
4474 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004475 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
4476 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
4477 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
4478 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00004479 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004480 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
4481 "$fcc5","$fcc6","$fcc7"
4482 };
4483 Names = GCCRegNames;
4484 NumNames = llvm::array_lengthof(GCCRegNames);
4485 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004486 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004487 unsigned &NumAliases) const = 0;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004488 virtual bool validateAsmConstraint(const char *&Name,
4489 TargetInfo::ConstraintInfo &Info) const {
4490 switch (*Name) {
4491 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00004492 return false;
4493
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004494 case 'r': // CPU registers.
4495 case 'd': // Equivalent to "r" unless generating MIPS16 code.
4496 case 'y': // Equivalent to "r", backwards compatibility only.
4497 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00004498 case 'c': // $25 for indirect jumps
4499 case 'l': // lo register
4500 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004501 Info.setAllowsRegister();
4502 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00004503 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00004504 Info.setAllowsMemory();
4505 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004506 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004507 }
4508
4509 virtual const char *getClobbers() const {
4510 // FIXME: Implement!
4511 return "";
4512 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004513
4514 virtual bool setFeatureEnabled(llvm::StringMap<bool> &Features,
4515 StringRef Name,
4516 bool Enabled) const {
Simon Atanasyan296a7bb2012-04-18 12:00:11 +00004517 if (Name == "soft-float" || Name == "single-float" ||
4518 Name == "o32" || Name == "n32" || Name == "n64" || Name == "eabi" ||
4519 Name == "mips32" || Name == "mips32r2" ||
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00004520 Name == "mips64" || Name == "mips64r2" ||
Simon Atanasyan9c6f1f72012-07-05 19:23:00 +00004521 Name == "mips16" || Name == "dsp" || Name == "dspr2") {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004522 Features[Name] = Enabled;
4523 return true;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00004524 } else if (Name == "32") {
4525 Features["o32"] = Enabled;
4526 return true;
4527 } else if (Name == "64") {
4528 Features["n64"] = Enabled;
4529 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004530 }
4531 return false;
4532 }
4533
4534 virtual void HandleTargetFeatures(std::vector<std::string> &Features) {
Simon Atanasyan72244b62012-07-05 16:06:06 +00004535 IsMips16 = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004536 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004537 DspRev = NoDSP;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004538
4539 for (std::vector<std::string>::iterator it = Features.begin(),
4540 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004541 if (*it == "+single-float")
4542 FloatABI = SingleFloat;
4543 else if (*it == "+soft-float")
4544 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00004545 else if (*it == "+mips16")
4546 IsMips16 = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004547 else if (*it == "+dsp")
4548 DspRev = std::max(DspRev, DSP1);
4549 else if (*it == "+dspr2")
4550 DspRev = std::max(DspRev, DSP2);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004551 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004552
4553 // Remove front-end specific option.
4554 std::vector<std::string>::iterator it =
4555 std::find(Features.begin(), Features.end(), "+soft-float");
4556 if (it != Features.end())
4557 Features.erase(it);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004558 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004559
4560 virtual int getEHDataRegisterNumber(unsigned RegNo) const {
4561 if (RegNo == 0) return 4;
4562 if (RegNo == 1) return 5;
4563 return -1;
4564 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004565};
4566
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004567const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
4568#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4569#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4570 ALL_LANGUAGES },
4571#include "clang/Basic/BuiltinsMips.def"
4572};
4573
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004574class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004575public:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004576 Mips32TargetInfoBase(const std::string& triple) :
Simon Atanasyance74e9d2012-04-12 19:59:24 +00004577 MipsTargetInfoBase(triple, "o32", "mips32") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00004578 SizeType = UnsignedInt;
4579 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00004580 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00004581 }
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004582 virtual bool setABI(const std::string &Name) {
4583 if ((Name == "o32") || (Name == "eabi")) {
4584 ABI = Name;
4585 return true;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00004586 } else if (Name == "32") {
4587 ABI = "o32";
4588 return true;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004589 } else
4590 return false;
4591 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00004592 virtual void getTargetDefines(const LangOptions &Opts,
4593 MacroBuilder &Builder) const {
4594 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004595
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004596 if (ABI == "o32") {
4597 Builder.defineMacro("__mips_o32");
4598 Builder.defineMacro("_ABIO32", "1");
4599 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
4600 }
4601 else if (ABI == "eabi")
4602 Builder.defineMacro("__mips_eabi");
4603 else
David Blaikie83d382b2011-09-23 05:06:16 +00004604 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004605 }
4606 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4607 unsigned &NumAliases) const {
4608 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4609 { { "at" }, "$1" },
4610 { { "v0" }, "$2" },
4611 { { "v1" }, "$3" },
4612 { { "a0" }, "$4" },
4613 { { "a1" }, "$5" },
4614 { { "a2" }, "$6" },
4615 { { "a3" }, "$7" },
4616 { { "t0" }, "$8" },
4617 { { "t1" }, "$9" },
4618 { { "t2" }, "$10" },
4619 { { "t3" }, "$11" },
4620 { { "t4" }, "$12" },
4621 { { "t5" }, "$13" },
4622 { { "t6" }, "$14" },
4623 { { "t7" }, "$15" },
4624 { { "s0" }, "$16" },
4625 { { "s1" }, "$17" },
4626 { { "s2" }, "$18" },
4627 { { "s3" }, "$19" },
4628 { { "s4" }, "$20" },
4629 { { "s5" }, "$21" },
4630 { { "s6" }, "$22" },
4631 { { "s7" }, "$23" },
4632 { { "t8" }, "$24" },
4633 { { "t9" }, "$25" },
4634 { { "k0" }, "$26" },
4635 { { "k1" }, "$27" },
4636 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00004637 { { "sp","$sp" }, "$29" },
4638 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004639 { { "ra" }, "$31" }
4640 };
4641 Aliases = GCCRegAliases;
4642 NumAliases = llvm::array_lengthof(GCCRegAliases);
4643 }
4644};
4645
4646class Mips32EBTargetInfo : public Mips32TargetInfoBase {
4647public:
4648 Mips32EBTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
4649 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanaka009173f2013-01-05 02:04:34 +00004650 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004651 }
4652 virtual void getTargetDefines(const LangOptions &Opts,
4653 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004654 DefineStd(Builder, "MIPSEB", Opts);
4655 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00004656 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004657 }
4658};
4659
4660class Mips32ELTargetInfo : public Mips32TargetInfoBase {
4661public:
4662 Mips32ELTargetInfo(const std::string& triple) : Mips32TargetInfoBase(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004663 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004664 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanaka009173f2013-01-05 02:04:34 +00004665 "i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004666 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004667 virtual void getTargetDefines(const LangOptions &Opts,
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004668 MacroBuilder &Builder) const {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004669 DefineStd(Builder, "MIPSEL", Opts);
4670 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00004671 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004672 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004673};
Akira Hatanakabef17452011-09-20 19:21:49 +00004674
4675class Mips64TargetInfoBase : public MipsTargetInfoBase {
4676 virtual void SetDescriptionString(const std::string &Name) = 0;
4677public:
4678 Mips64TargetInfoBase(const std::string& triple) :
Simon Atanasyance74e9d2012-04-12 19:59:24 +00004679 MipsTargetInfoBase(triple, "n64", "mips64") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00004680 LongWidth = LongAlign = 64;
4681 PointerWidth = PointerAlign = 64;
4682 LongDoubleWidth = LongDoubleAlign = 128;
4683 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00004684 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
4685 LongDoubleWidth = LongDoubleAlign = 64;
4686 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4687 }
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004688 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00004689 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00004690 }
Akira Hatanakabef17452011-09-20 19:21:49 +00004691 virtual bool setABI(const std::string &Name) {
4692 SetDescriptionString(Name);
Akira Hatanakac12a2712011-10-22 00:07:27 +00004693 if (Name == "n32") {
4694 LongWidth = LongAlign = 32;
4695 PointerWidth = PointerAlign = 32;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00004696 ABI = Name;
4697 return true;
4698 } else if (Name == "n64") {
4699 ABI = Name;
4700 return true;
4701 } else if (Name == "64") {
4702 ABI = "n64";
4703 return true;
4704 } else
4705 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00004706 }
Simon Atanasyan16ee0052012-08-29 19:59:32 +00004707 virtual void getTargetDefines(const LangOptions &Opts,
4708 MacroBuilder &Builder) const {
4709 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004710
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00004711 Builder.defineMacro("__mips64");
4712 Builder.defineMacro("__mips64__");
4713
Akira Hatanakabef17452011-09-20 19:21:49 +00004714 if (ABI == "n32") {
4715 Builder.defineMacro("__mips_n32");
4716 Builder.defineMacro("_ABIN32", "2");
4717 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
4718 }
4719 else if (ABI == "n64") {
4720 Builder.defineMacro("__mips_n64");
4721 Builder.defineMacro("_ABI64", "3");
4722 Builder.defineMacro("_MIPS_SIM", "_ABI64");
4723 }
4724 else
David Blaikie83d382b2011-09-23 05:06:16 +00004725 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00004726 }
4727 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4728 unsigned &NumAliases) const {
4729 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
4730 { { "at" }, "$1" },
4731 { { "v0" }, "$2" },
4732 { { "v1" }, "$3" },
4733 { { "a0" }, "$4" },
4734 { { "a1" }, "$5" },
4735 { { "a2" }, "$6" },
4736 { { "a3" }, "$7" },
4737 { { "a4" }, "$8" },
4738 { { "a5" }, "$9" },
4739 { { "a6" }, "$10" },
4740 { { "a7" }, "$11" },
4741 { { "t0" }, "$12" },
4742 { { "t1" }, "$13" },
4743 { { "t2" }, "$14" },
4744 { { "t3" }, "$15" },
4745 { { "s0" }, "$16" },
4746 { { "s1" }, "$17" },
4747 { { "s2" }, "$18" },
4748 { { "s3" }, "$19" },
4749 { { "s4" }, "$20" },
4750 { { "s5" }, "$21" },
4751 { { "s6" }, "$22" },
4752 { { "s7" }, "$23" },
4753 { { "t8" }, "$24" },
4754 { { "t9" }, "$25" },
4755 { { "k0" }, "$26" },
4756 { { "k1" }, "$27" },
4757 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00004758 { { "sp","$sp" }, "$29" },
4759 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00004760 { { "ra" }, "$31" }
4761 };
4762 Aliases = GCCRegAliases;
4763 NumAliases = llvm::array_lengthof(GCCRegAliases);
4764 }
4765};
4766
4767class Mips64EBTargetInfo : public Mips64TargetInfoBase {
4768 virtual void SetDescriptionString(const std::string &Name) {
4769 // Change DescriptionString only if ABI is n32.
4770 if (Name == "n32")
4771 DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac12a2712011-10-22 00:07:27 +00004772 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka009173f2013-01-05 02:04:34 +00004773 "v64:64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00004774 }
4775public:
4776 Mips64EBTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
4777 // Default ABI is n64.
4778 DescriptionString = "E-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac12a2712011-10-22 00:07:27 +00004779 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka009173f2013-01-05 02:04:34 +00004780 "v64:64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00004781 }
4782 virtual void getTargetDefines(const LangOptions &Opts,
4783 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00004784 DefineStd(Builder, "MIPSEB", Opts);
4785 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00004786 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00004787 }
4788};
4789
4790class Mips64ELTargetInfo : public Mips64TargetInfoBase {
4791 virtual void SetDescriptionString(const std::string &Name) {
4792 // Change DescriptionString only if ABI is n32.
4793 if (Name == "n32")
4794 DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac12a2712011-10-22 00:07:27 +00004795 "i64:64:64-f32:32:32-f64:64:64-f128:128:128"
Akira Hatanaka009173f2013-01-05 02:04:34 +00004796 "-v64:64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00004797 }
4798public:
4799 Mips64ELTargetInfo(const std::string& triple) : Mips64TargetInfoBase(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004800 // Default ABI is n64.
4801 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00004802 DescriptionString = "e-p:64:64:64-i1:8:8-i8:8:32-i16:16:32-i32:32:32-"
Akira Hatanakac12a2712011-10-22 00:07:27 +00004803 "i64:64:64-f32:32:32-f64:64:64-f128:128:128-"
Akira Hatanaka009173f2013-01-05 02:04:34 +00004804 "v64:64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00004805 }
4806 virtual void getTargetDefines(const LangOptions &Opts,
4807 MacroBuilder &Builder) const {
Akira Hatanakabef17452011-09-20 19:21:49 +00004808 DefineStd(Builder, "MIPSEL", Opts);
4809 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00004810 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00004811 }
4812};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004813} // end anonymous namespace.
4814
Ivan Krasindd7403e2011-08-24 20:22:22 +00004815namespace {
4816class PNaClTargetInfo : public TargetInfo {
4817public:
4818 PNaClTargetInfo(const std::string& triple) : TargetInfo(triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004819 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00004820 this->UserLabelPrefix = "";
4821 this->LongAlign = 32;
4822 this->LongWidth = 32;
4823 this->PointerAlign = 32;
4824 this->PointerWidth = 32;
4825 this->IntMaxType = TargetInfo::SignedLongLong;
4826 this->UIntMaxType = TargetInfo::UnsignedLongLong;
4827 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00004828 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00004829 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00004830 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00004831 this->SizeType = TargetInfo::UnsignedInt;
4832 this->PtrDiffType = TargetInfo::SignedInt;
4833 this->IntPtrType = TargetInfo::SignedInt;
David Meyerbfdbb252011-10-11 03:12:01 +00004834 this->RegParmMax = 2;
Ivan Krasindd7403e2011-08-24 20:22:22 +00004835 DescriptionString = "e-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
4836 "f32:32:32-f64:64:64-p:32:32:32-v128:32:32";
4837 }
4838
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00004839 void getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00004840 }
4841 virtual void getArchDefines(const LangOptions &Opts,
4842 MacroBuilder &Builder) const {
4843 Builder.defineMacro("__le32__");
4844 Builder.defineMacro("__pnacl__");
4845 }
4846 virtual void getTargetDefines(const LangOptions &Opts,
4847 MacroBuilder &Builder) const {
Jan Wen Voung1d4c2d92012-03-29 00:05:59 +00004848 Builder.defineMacro("__LITTLE_ENDIAN__");
Ivan Krasindd7403e2011-08-24 20:22:22 +00004849 getArchDefines(Opts, Builder);
4850 }
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004851 virtual bool hasFeature(StringRef Feature) const {
4852 return Feature == "pnacl";
4853 }
Ivan Krasindd7403e2011-08-24 20:22:22 +00004854 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4855 unsigned &NumRecords) const {
4856 }
Meador Inge5d3fb222012-06-16 03:34:49 +00004857 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4858 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00004859 }
4860 virtual void getGCCRegNames(const char * const *&Names,
4861 unsigned &NumNames) const;
4862 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4863 unsigned &NumAliases) const;
4864 virtual bool validateAsmConstraint(const char *&Name,
4865 TargetInfo::ConstraintInfo &Info) const {
4866 return false;
4867 }
4868
4869 virtual const char *getClobbers() const {
4870 return "";
4871 }
4872};
4873
4874void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
4875 unsigned &NumNames) const {
4876 Names = NULL;
4877 NumNames = 0;
4878}
4879
4880void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4881 unsigned &NumAliases) const {
4882 Aliases = NULL;
4883 NumAliases = 0;
4884}
4885} // end anonymous namespace.
4886
Guy Benyeib798fc92012-12-11 21:38:14 +00004887namespace {
4888 static const unsigned SPIRAddrSpaceMap[] = {
4889 1, // opencl_global
4890 3, // opencl_local
4891 2, // opencl_constant
4892 0, // cuda_device
4893 0, // cuda_constant
4894 0 // cuda_shared
4895 };
4896 class SPIRTargetInfo : public TargetInfo {
4897 static const char * const GCCRegNames[];
4898 static const Builtin::Info BuiltinInfo[];
Dmitri Gribenkof8579502013-01-12 19:30:44 +00004899 std::vector<StringRef> AvailableFeatures;
Guy Benyeib798fc92012-12-11 21:38:14 +00004900 public:
4901 SPIRTargetInfo(const std::string& triple) : TargetInfo(triple) {
4902 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
4903 "SPIR target must use unknown OS");
4904 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
4905 "SPIR target must use unknown environment type");
4906 BigEndian = false;
4907 TLSSupported = false;
4908 LongWidth = LongAlign = 64;
4909 AddrSpaceMap = &SPIRAddrSpaceMap;
4910 // Define available target features
4911 // These must be defined in sorted order!
4912 NoAsmVariants = true;
4913 }
4914 virtual void getTargetDefines(const LangOptions &Opts,
4915 MacroBuilder &Builder) const {
4916 DefineStd(Builder, "SPIR", Opts);
4917 }
4918 virtual bool hasFeature(StringRef Feature) const {
4919 return Feature == "spir";
4920 }
4921
4922 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4923 unsigned &NumRecords) const {}
4924 virtual const char *getClobbers() const {
4925 return "";
4926 }
4927 virtual void getGCCRegNames(const char * const *&Names,
4928 unsigned &NumNames) const {}
4929 virtual bool validateAsmConstraint(const char *&Name,
4930 TargetInfo::ConstraintInfo &info) const {
4931 return true;
4932 }
4933 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4934 unsigned &NumAliases) const {}
4935 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4936 return TargetInfo::VoidPtrBuiltinVaList;
4937 }
4938 };
4939
4940
4941 class SPIR32TargetInfo : public SPIRTargetInfo {
4942 public:
4943 SPIR32TargetInfo(const std::string& triple) : SPIRTargetInfo(triple) {
4944 PointerWidth = PointerAlign = 32;
4945 SizeType = TargetInfo::UnsignedInt;
4946 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
4947 DescriptionString
Guy Benyei5ea30272013-03-07 13:06:10 +00004948 = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
Guy Benyeib798fc92012-12-11 21:38:14 +00004949 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
4950 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
4951 "v512:512:512-v1024:1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00004952 }
4953 virtual void getTargetDefines(const LangOptions &Opts,
4954 MacroBuilder &Builder) const {
4955 DefineStd(Builder, "SPIR32", Opts);
4956 }
Guy Benyeib798fc92012-12-11 21:38:14 +00004957 };
4958
4959 class SPIR64TargetInfo : public SPIRTargetInfo {
4960 public:
4961 SPIR64TargetInfo(const std::string& triple) : SPIRTargetInfo(triple) {
4962 PointerWidth = PointerAlign = 64;
4963 SizeType = TargetInfo::UnsignedLong;
4964 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
4965 DescriptionString
Guy Benyei5ea30272013-03-07 13:06:10 +00004966 = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-"
Guy Benyeib798fc92012-12-11 21:38:14 +00004967 "f32:32:32-f64:64:64-v16:16:16-v24:32:32-v32:32:32-v48:64:64-"
4968 "v64:64:64-v96:128:128-v128:128:128-v192:256:256-v256:256:256-"
4969 "v512:512:512-v1024:1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00004970 }
4971 virtual void getTargetDefines(const LangOptions &Opts,
4972 MacroBuilder &Builder) const {
4973 DefineStd(Builder, "SPIR64", Opts);
4974 }
Guy Benyeib798fc92012-12-11 21:38:14 +00004975 };
4976}
4977
Ivan Krasindd7403e2011-08-24 20:22:22 +00004978
Chris Lattner5ba61f02006-10-14 07:39:34 +00004979//===----------------------------------------------------------------------===//
4980// Driver code
4981//===----------------------------------------------------------------------===//
4982
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00004983static TargetInfo *AllocateTarget(const std::string &T) {
Daniel Dunbar52322032009-08-18 05:47:58 +00004984 llvm::Triple Triple(T);
4985 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00004986
Daniel Dunbar52322032009-08-18 05:47:58 +00004987 switch (Triple.getArch()) {
4988 default:
4989 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00004990
Tony Linthicum76329bf2011-12-12 21:14:55 +00004991 case llvm::Triple::hexagon:
4992 return new HexagonTargetInfo(T);
4993
Tim Northover9bb857a2013-01-31 12:13:10 +00004994 case llvm::Triple::aarch64:
4995 switch (os) {
4996 case llvm::Triple::Linux:
4997 return new LinuxTargetInfo<AArch64TargetInfo>(T);
4998 default:
4999 return new AArch64TargetInfo(T);
5000 }
5001
Daniel Dunbar52322032009-08-18 05:47:58 +00005002 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00005003 case llvm::Triple::thumb:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005004 if (Triple.isOSDarwin())
5005 return new DarwinARMTargetInfo(T);
5006
Daniel Dunbar52322032009-08-18 05:47:58 +00005007 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00005008 case llvm::Triple::Linux:
5009 return new LinuxTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00005010 case llvm::Triple::FreeBSD:
Torok Edwinb2b37c62009-06-30 17:10:35 +00005011 return new FreeBSDTargetInfo<ARMTargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005012 case llvm::Triple::NetBSD:
5013 return new NetBSDTargetInfo<ARMTargetInfo>(T);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005014 case llvm::Triple::OpenBSD:
5015 return new OpenBSDTargetInfo<ARMTargetInfo>(T);
Eli Friedman9fa28852012-08-08 23:57:20 +00005016 case llvm::Triple::Bitrig:
5017 return new BitrigTargetInfo<ARMTargetInfo>(T);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005018 case llvm::Triple::RTEMS:
5019 return new RTEMSTargetInfo<ARMTargetInfo>(T);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005020 case llvm::Triple::NaCl:
Derek Schuff57b7e8f2012-10-11 16:55:58 +00005021 return new NaClTargetInfo<ARMTargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00005022 default:
5023 return new ARMTargetInfo(T);
5024 }
Eli Friedmanb5366062008-05-20 14:21:01 +00005025
Daniel Dunbar52322032009-08-18 05:47:58 +00005026 case llvm::Triple::msp430:
5027 return new MSP430TargetInfo(T);
Eli Friedmanb5366062008-05-20 14:21:01 +00005028
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005029 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005030 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005031 case llvm::Triple::Linux:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005032 return new LinuxTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005033 case llvm::Triple::RTEMS:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005034 return new RTEMSTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005035 case llvm::Triple::FreeBSD:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005036 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005037 case llvm::Triple::NetBSD:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005038 return new NetBSDTargetInfo<Mips32EBTargetInfo>(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005039 default:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005040 return new Mips32EBTargetInfo(T);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005041 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005042
5043 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005044 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005045 case llvm::Triple::Linux:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005046 return new LinuxTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005047 case llvm::Triple::RTEMS:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005048 return new RTEMSTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005049 case llvm::Triple::FreeBSD:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005050 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005051 case llvm::Triple::NetBSD:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005052 return new NetBSDTargetInfo<Mips32ELTargetInfo>(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005053 default:
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005054 return new Mips32ELTargetInfo(T);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005055 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005056
Akira Hatanakabef17452011-09-20 19:21:49 +00005057 case llvm::Triple::mips64:
5058 switch (os) {
5059 case llvm::Triple::Linux:
5060 return new LinuxTargetInfo<Mips64EBTargetInfo>(T);
5061 case llvm::Triple::RTEMS:
5062 return new RTEMSTargetInfo<Mips64EBTargetInfo>(T);
5063 case llvm::Triple::FreeBSD:
5064 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(T);
5065 case llvm::Triple::NetBSD:
5066 return new NetBSDTargetInfo<Mips64EBTargetInfo>(T);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005067 case llvm::Triple::OpenBSD:
5068 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(T);
Akira Hatanakabef17452011-09-20 19:21:49 +00005069 default:
5070 return new Mips64EBTargetInfo(T);
5071 }
5072
5073 case llvm::Triple::mips64el:
5074 switch (os) {
5075 case llvm::Triple::Linux:
5076 return new LinuxTargetInfo<Mips64ELTargetInfo>(T);
5077 case llvm::Triple::RTEMS:
5078 return new RTEMSTargetInfo<Mips64ELTargetInfo>(T);
5079 case llvm::Triple::FreeBSD:
5080 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(T);
5081 case llvm::Triple::NetBSD:
5082 return new NetBSDTargetInfo<Mips64ELTargetInfo>(T);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005083 case llvm::Triple::OpenBSD:
5084 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(T);
Akira Hatanakabef17452011-09-20 19:21:49 +00005085 default:
5086 return new Mips64ELTargetInfo(T);
5087 }
5088
Ivan Krasindd7403e2011-08-24 20:22:22 +00005089 case llvm::Triple::le32:
5090 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00005091 case llvm::Triple::NaCl:
Derek Schuff57b7e8f2012-10-11 16:55:58 +00005092 return new NaClTargetInfo<PNaClTargetInfo>(T);
Ivan Krasindd7403e2011-08-24 20:22:22 +00005093 default:
5094 return NULL;
5095 }
5096
Daniel Dunbar52322032009-08-18 05:47:58 +00005097 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005098 if (Triple.isOSDarwin())
Roman Divacky965b0b72011-01-06 08:27:10 +00005099 return new DarwinPPC32TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005100 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005101 case llvm::Triple::Linux:
5102 return new LinuxTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005103 case llvm::Triple::FreeBSD:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00005104 return new FreeBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005105 case llvm::Triple::NetBSD:
5106 return new NetBSDTargetInfo<PPC32TargetInfo>(T);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005107 case llvm::Triple::OpenBSD:
5108 return new OpenBSDTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005109 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00005110 return new RTEMSTargetInfo<PPC32TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005111 default:
5112 return new PPC32TargetInfo(T);
5113 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005114
5115 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005116 if (Triple.isOSDarwin())
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00005117 return new DarwinPPC64TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005118 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005119 case llvm::Triple::Linux:
5120 return new LinuxTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005121 case llvm::Triple::Lv2:
John Thompsone467e192009-11-19 17:18:50 +00005122 return new PS3PPUTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005123 case llvm::Triple::FreeBSD:
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00005124 return new FreeBSDTargetInfo<PPC64TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005125 case llvm::Triple::NetBSD:
5126 return new NetBSDTargetInfo<PPC64TargetInfo>(T);
5127 default:
5128 return new PPC64TargetInfo(T);
5129 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005130
Peter Collingbournec947aae2012-05-20 23:28:41 +00005131 case llvm::Triple::nvptx:
5132 return new NVPTX32TargetInfo(T);
5133 case llvm::Triple::nvptx64:
5134 return new NVPTX64TargetInfo(T);
5135
Chris Lattner5178f562010-03-06 21:21:27 +00005136 case llvm::Triple::mblaze:
5137 return new MBlazeTargetInfo(T);
5138
Eli Friedmand13b41e2012-10-12 23:32:00 +00005139 case llvm::Triple::r600:
5140 return new R600TargetInfo(T);
5141
Daniel Dunbar52322032009-08-18 05:47:58 +00005142 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005143 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005144 case llvm::Triple::Linux:
5145 return new LinuxTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005146 case llvm::Triple::AuroraUX:
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005147 return new AuroraUXSparcV8TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005148 case llvm::Triple::Solaris:
Daniel Dunbar52322032009-08-18 05:47:58 +00005149 return new SolarisSparcV8TargetInfo(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005150 case llvm::Triple::NetBSD:
5151 return new NetBSDTargetInfo<SparcV8TargetInfo>(T);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005152 case llvm::Triple::OpenBSD:
5153 return new OpenBSDTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005154 case llvm::Triple::RTEMS:
Douglas Gregor9fabd852011-07-01 22:41:14 +00005155 return new RTEMSTargetInfo<SparcV8TargetInfo>(T);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005156 default:
5157 return new SparcV8TargetInfo(T);
5158 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005159
Eli Friedmana9c3d712009-08-19 20:47:07 +00005160 case llvm::Triple::tce:
5161 return new TCETargetInfo(T);
5162
Daniel Dunbar52322032009-08-18 05:47:58 +00005163 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005164 if (Triple.isOSDarwin())
5165 return new DarwinI386TargetInfo(T);
5166
Daniel Dunbar52322032009-08-18 05:47:58 +00005167 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005168 case llvm::Triple::AuroraUX:
5169 return new AuroraUXTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00005170 case llvm::Triple::Linux:
5171 return new LinuxTargetInfo<X86_32TargetInfo>(T);
5172 case llvm::Triple::DragonFly:
5173 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(T);
5174 case llvm::Triple::NetBSD:
Joerg Sonnenberger16237142012-01-06 18:32:26 +00005175 return new NetBSDI386TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00005176 case llvm::Triple::OpenBSD:
5177 return new OpenBSDI386TargetInfo(T);
Eli Friedman9fa28852012-08-08 23:57:20 +00005178 case llvm::Triple::Bitrig:
5179 return new BitrigI386TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00005180 case llvm::Triple::FreeBSD:
5181 return new FreeBSDTargetInfo<X86_32TargetInfo>(T);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005182 case llvm::Triple::Minix:
5183 return new MinixTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00005184 case llvm::Triple::Solaris:
5185 return new SolarisTargetInfo<X86_32TargetInfo>(T);
5186 case llvm::Triple::Cygwin:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00005187 return new CygwinX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00005188 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00005189 return new MinGWX86_32TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00005190 case llvm::Triple::Win32:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00005191 return new VisualStudioWindowsX86_32TargetInfo(T);
Chris Lattnerb986aba2010-04-11 19:29:39 +00005192 case llvm::Triple::Haiku:
5193 return new HaikuX86_32TargetInfo(T);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005194 case llvm::Triple::RTEMS:
5195 return new RTEMSX86_32TargetInfo(T);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005196 case llvm::Triple::NaCl:
Derek Schuff57b7e8f2012-10-11 16:55:58 +00005197 return new NaClTargetInfo<X86_32TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00005198 default:
5199 return new X86_32TargetInfo(T);
5200 }
5201
5202 case llvm::Triple::x86_64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005203 if (Triple.isOSDarwin() || Triple.getEnvironment() == llvm::Triple::MachO)
5204 return new DarwinX86_64TargetInfo(T);
5205
Daniel Dunbar52322032009-08-18 05:47:58 +00005206 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005207 case llvm::Triple::AuroraUX:
5208 return new AuroraUXTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00005209 case llvm::Triple::Linux:
5210 return new LinuxTargetInfo<X86_64TargetInfo>(T);
Chris Lattner002ba6b2010-01-09 05:41:14 +00005211 case llvm::Triple::DragonFly:
5212 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00005213 case llvm::Triple::NetBSD:
5214 return new NetBSDTargetInfo<X86_64TargetInfo>(T);
5215 case llvm::Triple::OpenBSD:
5216 return new OpenBSDX86_64TargetInfo(T);
Eli Friedman9fa28852012-08-08 23:57:20 +00005217 case llvm::Triple::Bitrig:
5218 return new BitrigX86_64TargetInfo(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00005219 case llvm::Triple::FreeBSD:
5220 return new FreeBSDTargetInfo<X86_64TargetInfo>(T);
5221 case llvm::Triple::Solaris:
5222 return new SolarisTargetInfo<X86_64TargetInfo>(T);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00005223 case llvm::Triple::MinGW32:
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00005224 return new MinGWX86_64TargetInfo(T);
5225 case llvm::Triple::Win32: // This is what Triple.h supports now.
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005226 return new VisualStudioWindowsX86_64TargetInfo(T);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005227 case llvm::Triple::NaCl:
Derek Schuff57b7e8f2012-10-11 16:55:58 +00005228 return new NaClTargetInfo<X86_64TargetInfo>(T);
Daniel Dunbar52322032009-08-18 05:47:58 +00005229 default:
5230 return new X86_64TargetInfo(T);
5231 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005232
5233 case llvm::Triple::spir: {
5234 llvm::Triple Triple(T);
5235 if (Triple.getOS() != llvm::Triple::UnknownOS ||
5236 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
5237 return NULL;
5238 return new SPIR32TargetInfo(T);
5239 }
5240 case llvm::Triple::spir64: {
5241 llvm::Triple Triple(T);
5242 if (Triple.getOS() != llvm::Triple::UnknownOS ||
5243 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
5244 return NULL;
5245 return new SPIR64TargetInfo(T);
5246 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005247 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00005248}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005249
5250/// CreateTargetInfo - Return the target info object for the specified target
5251/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00005252TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregorf8715de2012-11-16 04:24:59 +00005253 TargetOptions *Opts) {
5254 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005255
5256 // Construct the target
Dylan Noblesmithe2778992012-02-05 02:12:40 +00005257 OwningPtr<TargetInfo> Target(AllocateTarget(Triple.str()));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005258 if (!Target) {
5259 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5260 return 0;
5261 }
Douglas Gregorbc10b9f2012-10-15 16:45:32 +00005262 Target->setTargetOpts(Opts);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005263
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005264 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005265 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5266 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005267 return 0;
5268 }
5269
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005270 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005271 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5272 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005273 return 0;
5274 }
5275
Charles Davis95a546e2010-06-11 01:06:47 +00005276 // Set the target C++ ABI.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005277 if (!Opts->CXXABI.empty() && !Target->setCXXABI(Opts->CXXABI)) {
5278 Diags.Report(diag::err_target_unknown_cxxabi) << Opts->CXXABI;
Charles Davis95a546e2010-06-11 01:06:47 +00005279 return 0;
5280 }
5281
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005282 // Compute the default target features, we need the target to handle this
5283 // because features may have dependencies on one another.
5284 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005285 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005286
5287 // Apply the user specified deltas.
Rafael Espindolaa6416a72011-11-27 20:00:43 +00005288 // First the enables.
Douglas Gregorcb177f12012-10-16 23:40:58 +00005289 for (std::vector<std::string>::const_iterator
Douglas Gregorf8715de2012-11-16 04:24:59 +00005290 it = Opts->FeaturesAsWritten.begin(),
5291 ie = Opts->FeaturesAsWritten.end();
Douglas Gregorcb177f12012-10-16 23:40:58 +00005292 it != ie; ++it) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005293 const char *Name = it->c_str();
5294
Rafael Espindolaa6416a72011-11-27 20:00:43 +00005295 if (Name[0] != '+')
5296 continue;
5297
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005298 // Apply the feature via the target.
Rafael Espindolaa6416a72011-11-27 20:00:43 +00005299 if (!Target->setFeatureEnabled(Features, Name + 1, true)) {
5300 Diags.Report(diag::err_target_invalid_feature) << Name;
5301 return 0;
5302 }
5303 }
5304
5305 // Then the disables.
Douglas Gregorcb177f12012-10-16 23:40:58 +00005306 for (std::vector<std::string>::const_iterator
Douglas Gregorf8715de2012-11-16 04:24:59 +00005307 it = Opts->FeaturesAsWritten.begin(),
5308 ie = Opts->FeaturesAsWritten.end();
Douglas Gregorcb177f12012-10-16 23:40:58 +00005309 it != ie; ++it) {
Rafael Espindolaa6416a72011-11-27 20:00:43 +00005310 const char *Name = it->c_str();
5311
5312 if (Name[0] == '+')
5313 continue;
5314
5315 // Apply the feature via the target.
5316 if (Name[0] != '-' ||
5317 !Target->setFeatureEnabled(Features, Name + 1, false)) {
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005318 Diags.Report(diag::err_target_invalid_feature) << Name;
5319 return 0;
5320 }
5321 }
5322
5323 // Add the features to the compile options.
5324 //
5325 // FIXME: If we are completely confident that we have the right set, we only
5326 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005327 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005328 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5329 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00005330 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
5331 Target->HandleTargetFeatures(Opts->Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005332
5333 return Target.take();
5334}