blob: 4fdbc24477197d6d415f1275fb0541cb69b828e5 [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 Dunbar979586e2009-11-11 09:38:56 +000023#include "llvm/ADT/STLExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000024#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000025#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000026#include "llvm/ADT/Triple.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000027#include "llvm/IR/Type.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000028#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000029#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000030#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000031#include <memory>
Chris Lattner5ba61f02006-10-14 07:39:34 +000032using namespace clang;
33
Chris Lattner5ba61f02006-10-14 07:39:34 +000034//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000035// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000036//===----------------------------------------------------------------------===//
37
Chris Lattner1e1c0b92009-03-20 16:06:38 +000038/// DefineStd - Define a macro name and standard variants. For example if
39/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
40/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000041static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000042 const LangOptions &Opts) {
43 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000044
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
46 // in the user's namespace.
47 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000048 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055}
56
Benjamin Kramere3b442d2012-01-10 11:50:09 +000057static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
58 bool Tuning = true) {
59 Builder.defineMacro("__" + CPUName);
60 Builder.defineMacro("__" + CPUName + "__");
61 if (Tuning)
62 Builder.defineMacro("__tune_" + CPUName + "__");
63}
64
Chris Lattner09d98f52008-10-05 21:50:58 +000065//===----------------------------------------------------------------------===//
66// Defines specific to certain operating systems.
67//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000068
Torok Edwinb2b37c62009-06-30 17:10:35 +000069namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000070template<typename TgtInfo>
71class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000072protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000073 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000074 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000075public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000076 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000077 void getTargetDefines(const LangOptions &Opts,
78 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000079 TgtInfo::getTargetDefines(Opts, Builder);
80 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000081 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000082
83};
Chris Lattner859c37a2009-08-12 06:24:27 +000084} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000085
Chris Lattner30ba6742009-08-10 19:03:04 +000086
Daniel Dunbard86666f2010-01-26 01:44:04 +000087static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000088 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000090 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000091 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000092 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000094 // AddressSanitizer doesn't play well with source fortification, which is on
95 // by default on Darwin.
Will Dietzf54319c2013-01-18 11:30:38 +000096 if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000097
John McCall5d36a8c2011-06-16 00:03:19 +000098 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +000099 // __weak is always defined, for use in blocks and with objc pointers.
100 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000101
John McCall31168b02011-06-15 23:02:42 +0000102 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000103 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000104 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
105 else
106 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000107
John McCall31168b02011-06-15 23:02:42 +0000108 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
109 // allow this in C, since one might have block pointers in structs that
110 // are used in pure C code and in Objective-C ARC.
111 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000112 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000113
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000114 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000115 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000116 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000117 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000118
119 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000121
Daniel Dunbarecf13562011-04-19 21:40:34 +0000122 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000123 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000124 if (Triple.isMacOSX()) {
125 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000126 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000127 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000128 Triple.getOSVersion(Maj, Min, Rev);
129 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000130 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000131
Sebastian Pop422377c2012-01-20 22:01:23 +0000132 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000133 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000134 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
135 if (PlatformName == "win32") {
136 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
137 return;
138 }
139
Evan Cheng31dd9a62014-01-26 23:12:43 +0000140 // Set the appropriate OS version define.
141 if (Triple.isiOS()) {
142 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
143 char Str[6];
144 Str[0] = '0' + Maj;
145 Str[1] = '0' + (Min / 10);
146 Str[2] = '0' + (Min % 10);
147 Str[3] = '0' + (Rev / 10);
148 Str[4] = '0' + (Rev % 10);
149 Str[5] = '\0';
150 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
151 Str);
152 } else if (Triple.isMacOSX()) {
153 // 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.
157 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
158 char Str[5];
159 Str[0] = '0' + (Maj / 10);
160 Str[1] = '0' + (Maj % 10);
161 Str[2] = '0' + std::min(Min, 9U);
162 Str[3] = '0' + std::min(Rev, 9U);
163 Str[4] = '\0';
164 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000165 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000166
Tim Northover157d9112014-01-16 08:48:16 +0000167 // Tell users about the kernel if there is one.
168 if (Triple.isOSDarwin())
169 Builder.defineMacro("__MACH__");
170
Daniel Dunbarecf13562011-04-19 21:40:34 +0000171 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000172}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000173
Chris Lattner30ba6742009-08-10 19:03:04 +0000174namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000175template<typename Target>
176class DarwinTargetInfo : public OSTargetInfo<Target> {
177protected:
Craig Topper3164f332014-03-11 03:39:26 +0000178 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
179 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000180 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000181 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000182 }
Mike Stump11289f42009-09-09 15:08:12 +0000183
Torok Edwinb2b37c62009-06-30 17:10:35 +0000184public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000185 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
186 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
187 this->MCountName = "\01mcount";
188 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000189
Craig Topper3164f332014-03-11 03:39:26 +0000190 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000191 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000192 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000193 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000194 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000195 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000196 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000197 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000198
Craig Topper3164f332014-03-11 03:39:26 +0000199 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000200 // FIXME: We should return 0 when building kexts.
201 return "__TEXT,__StaticInit,regular,pure_instructions";
202 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000203
John McCalleed64c72012-01-29 01:20:30 +0000204 /// Darwin does not support protected visibility. Darwin's "default"
205 /// is very similar to ELF's "protected"; Darwin requires a "weak"
206 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000207 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000208 return false;
209 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000210};
211
Chris Lattner30ba6742009-08-10 19:03:04 +0000212
Torok Edwinb2b37c62009-06-30 17:10:35 +0000213// DragonFlyBSD Target
214template<typename Target>
215class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
216protected:
Craig Topper3164f332014-03-11 03:39:26 +0000217 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
218 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000219 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000220 Builder.defineMacro("__DragonFly__");
221 Builder.defineMacro("__DragonFly_cc_version", "100001");
222 Builder.defineMacro("__ELF__");
223 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
224 Builder.defineMacro("__tune_i386__");
225 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000226 }
227public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000228 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
229 : OSTargetInfo<Target>(Triple) {
230 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000231
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000232 switch (Triple.getArch()) {
233 default:
234 case llvm::Triple::x86:
235 case llvm::Triple::x86_64:
236 this->MCountName = ".mcount";
237 break;
238 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000239 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000240};
241
242// FreeBSD Target
243template<typename Target>
244class FreeBSDTargetInfo : public OSTargetInfo<Target> {
245protected:
Craig Topper3164f332014-03-11 03:39:26 +0000246 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
247 MacroBuilder &Builder) const override {
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__");
Ed Schoutend0621462013-09-29 07:54:52 +0000259
260 // On FreeBSD, wchar_t contains the number of the code point as
261 // used by the character set of the locale. These character sets are
262 // not necessarily a superset of ASCII.
263 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000264 }
265public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000266 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
267 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000268
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000269 switch (Triple.getArch()) {
270 default:
271 case llvm::Triple::x86:
272 case llvm::Triple::x86_64:
273 this->MCountName = ".mcount";
274 break;
275 case llvm::Triple::mips:
276 case llvm::Triple::mipsel:
277 case llvm::Triple::ppc:
278 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000279 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000280 this->MCountName = "_mcount";
281 break;
282 case llvm::Triple::arm:
283 this->MCountName = "__mcount";
284 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000285 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000286 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000287};
288
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000289// GNU/kFreeBSD Target
290template<typename Target>
291class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
292protected:
Craig Topper3164f332014-03-11 03:39:26 +0000293 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
294 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000295 // GNU/kFreeBSD defines; list based off of gcc output
296
297 DefineStd(Builder, "unix", Opts);
298 Builder.defineMacro("__FreeBSD_kernel__");
299 Builder.defineMacro("__GLIBC__");
300 Builder.defineMacro("__ELF__");
301 if (Opts.POSIXThreads)
302 Builder.defineMacro("_REENTRANT");
303 if (Opts.CPlusPlus)
304 Builder.defineMacro("_GNU_SOURCE");
305 }
306public:
Sylvestre Ledru15832282013-09-05 13:58:07 +0000307 KFreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000308 this->UserLabelPrefix = "";
309 }
310};
311
Chris Lattner3e2ee142010-07-07 16:01:42 +0000312// Minix Target
313template<typename Target>
314class MinixTargetInfo : public OSTargetInfo<Target> {
315protected:
Craig Topper3164f332014-03-11 03:39:26 +0000316 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
317 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000318 // Minix defines
319
320 Builder.defineMacro("__minix", "3");
321 Builder.defineMacro("_EM_WSIZE", "4");
322 Builder.defineMacro("_EM_PSIZE", "4");
323 Builder.defineMacro("_EM_SSIZE", "2");
324 Builder.defineMacro("_EM_LSIZE", "4");
325 Builder.defineMacro("_EM_FSIZE", "4");
326 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000327 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000328 DefineStd(Builder, "unix", Opts);
329 }
330public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000331 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
332 this->UserLabelPrefix = "";
333 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000334};
335
Torok Edwinb2b37c62009-06-30 17:10:35 +0000336// Linux target
337template<typename Target>
338class LinuxTargetInfo : public OSTargetInfo<Target> {
339protected:
Craig Topper3164f332014-03-11 03:39:26 +0000340 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
341 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000343 DefineStd(Builder, "unix", Opts);
344 DefineStd(Builder, "linux", Opts);
345 Builder.defineMacro("__gnu_linux__");
346 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000347 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000348 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000349 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000350 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000351 if (Opts.CPlusPlus)
352 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000353 }
354public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000355 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000356 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000357 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000358
359 switch (Triple.getArch()) {
360 default:
361 break;
362 case llvm::Triple::ppc:
363 case llvm::Triple::ppc64:
364 case llvm::Triple::ppc64le:
365 this->MCountName = "_mcount";
366 break;
367 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000368 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000369
Craig Topper3164f332014-03-11 03:39:26 +0000370 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000371 return ".text.startup";
372 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000373};
374
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000375// NetBSD Target
376template<typename Target>
377class NetBSDTargetInfo : public OSTargetInfo<Target> {
378protected:
Craig Topper3164f332014-03-11 03:39:26 +0000379 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
380 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000381 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000382 Builder.defineMacro("__NetBSD__");
383 Builder.defineMacro("__unix__");
384 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000385 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000386 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000387
388 switch (Triple.getArch()) {
389 default:
390 break;
391 case llvm::Triple::arm:
392 case llvm::Triple::armeb:
393 case llvm::Triple::thumb:
394 case llvm::Triple::thumbeb:
395 Builder.defineMacro("__ARM_DWARF_EH__");
396 break;
397 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000398 }
399public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000400 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
401 this->UserLabelPrefix = "";
402 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000403};
404
Torok Edwinb2b37c62009-06-30 17:10:35 +0000405// OpenBSD Target
406template<typename Target>
407class OpenBSDTargetInfo : public OSTargetInfo<Target> {
408protected:
Craig Topper3164f332014-03-11 03:39:26 +0000409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000411 // OpenBSD defines; list based off of gcc output
412
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000413 Builder.defineMacro("__OpenBSD__");
414 DefineStd(Builder, "unix", Opts);
415 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000416 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000417 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000418 }
419public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000420 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
421 this->UserLabelPrefix = "";
422 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000423
Eli Friedman3715d1f2011-12-15 02:15:56 +0000424 switch (Triple.getArch()) {
425 default:
426 case llvm::Triple::x86:
427 case llvm::Triple::x86_64:
428 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000429 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000430 this->MCountName = "__mcount";
431 break;
432 case llvm::Triple::mips64:
433 case llvm::Triple::mips64el:
434 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000435 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000436 this->MCountName = "_mcount";
437 break;
438 }
439 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000440};
441
Eli Friedman9fa28852012-08-08 23:57:20 +0000442// Bitrig Target
443template<typename Target>
444class BitrigTargetInfo : public OSTargetInfo<Target> {
445protected:
Craig Topper3164f332014-03-11 03:39:26 +0000446 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
447 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000448 // Bitrig defines; list based off of gcc output
449
450 Builder.defineMacro("__Bitrig__");
451 DefineStd(Builder, "unix", Opts);
452 Builder.defineMacro("__ELF__");
453 if (Opts.POSIXThreads)
454 Builder.defineMacro("_REENTRANT");
455 }
456public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000457 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
458 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000459 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000460 }
461};
462
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000463// PSP Target
464template<typename Target>
465class PSPTargetInfo : public OSTargetInfo<Target> {
466protected:
Craig Topper3164f332014-03-11 03:39:26 +0000467 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
468 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000469 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000470 Builder.defineMacro("PSP");
471 Builder.defineMacro("_PSP");
472 Builder.defineMacro("__psp__");
473 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000474 }
475public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000476 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000477 this->UserLabelPrefix = "";
478 }
479};
480
John Thompsone467e192009-11-19 17:18:50 +0000481// PS3 PPU Target
482template<typename Target>
483class PS3PPUTargetInfo : public OSTargetInfo<Target> {
484protected:
Craig Topper3164f332014-03-11 03:39:26 +0000485 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
486 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000487 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000488 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000489 Builder.defineMacro("__PPU__");
490 Builder.defineMacro("__CELLOS_LV2__");
491 Builder.defineMacro("__ELF__");
492 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000493 Builder.defineMacro("_ARCH_PPC64");
494 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000495 }
496public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000497 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000498 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000499 this->LongWidth = this->LongAlign = 32;
500 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000501 this->IntMaxType = TargetInfo::SignedLongLong;
502 this->UIntMaxType = TargetInfo::UnsignedLongLong;
503 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000504 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000505 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000506 }
507};
508
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000509// AuroraUX target
510template<typename Target>
511class AuroraUXTargetInfo : public OSTargetInfo<Target> {
512protected:
Craig Topper3164f332014-03-11 03:39:26 +0000513 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
514 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000515 DefineStd(Builder, "sun", Opts);
516 DefineStd(Builder, "unix", Opts);
517 Builder.defineMacro("__ELF__");
518 Builder.defineMacro("__svr4__");
519 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000520 }
521public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000522 AuroraUXTargetInfo(const llvm::Triple &Triple)
523 : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000524 this->UserLabelPrefix = "";
525 this->WCharType = this->SignedLong;
526 // FIXME: WIntType should be SignedLong
527 }
528};
529
Torok Edwinb2b37c62009-06-30 17:10:35 +0000530// Solaris target
531template<typename Target>
532class SolarisTargetInfo : public OSTargetInfo<Target> {
533protected:
Craig Topper3164f332014-03-11 03:39:26 +0000534 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
535 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000536 DefineStd(Builder, "sun", Opts);
537 DefineStd(Builder, "unix", Opts);
538 Builder.defineMacro("__ELF__");
539 Builder.defineMacro("__svr4__");
540 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000541 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
542 // newer, but to 500 for everything else. feature_test.h has a check to
543 // ensure that you are not using C99 with an old version of X/Open or C89
544 // with a new version.
545 if (Opts.C99 || Opts.C11)
546 Builder.defineMacro("_XOPEN_SOURCE", "600");
547 else
548 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000549 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000550 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000551 Builder.defineMacro("_LARGEFILE_SOURCE");
552 Builder.defineMacro("_LARGEFILE64_SOURCE");
553 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000554 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000555 }
556public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000557 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000558 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000559 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000560 // FIXME: WIntType should be SignedLong
561 }
562};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000563
564// Windows target
565template<typename Target>
566class WindowsTargetInfo : public OSTargetInfo<Target> {
567protected:
Craig Topper3164f332014-03-11 03:39:26 +0000568 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
569 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000570 Builder.defineMacro("_WIN32");
571 }
572 void getVisualStudioDefines(const LangOptions &Opts,
573 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000574 if (Opts.CPlusPlus) {
575 if (Opts.RTTI)
576 Builder.defineMacro("_CPPRTTI");
577
578 if (Opts.Exceptions)
579 Builder.defineMacro("_CPPUNWIND");
580 }
581
582 if (!Opts.CharIsSigned)
583 Builder.defineMacro("_CHAR_UNSIGNED");
584
585 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
586 // but it works for now.
587 if (Opts.POSIXThreads)
588 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000589
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000590 if (Opts.MSCVersion != 0) {
591 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion / 100000));
592 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCVersion));
593 // FIXME We cannot encode the revision information into 32-bits
594 Builder.defineMacro("_MSC_BUILD", Twine(1));
595 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000596
597 if (Opts.MicrosoftExt) {
598 Builder.defineMacro("_MSC_EXTENSIONS");
599
600 if (Opts.CPlusPlus11) {
601 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
602 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
603 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
604 }
605 }
606
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000607 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000608 }
609
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000610public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000611 WindowsTargetInfo(const llvm::Triple &Triple)
612 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000613};
614
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000615template <typename Target>
616class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000617protected:
Craig Topper3164f332014-03-11 03:39:26 +0000618 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
619 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000620 if (Opts.POSIXThreads)
621 Builder.defineMacro("_REENTRANT");
622 if (Opts.CPlusPlus)
623 Builder.defineMacro("_GNU_SOURCE");
624
625 DefineStd(Builder, "unix", Opts);
626 Builder.defineMacro("__ELF__");
627 Builder.defineMacro("__native_client__");
628 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000629
630public:
631 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000632 this->UserLabelPrefix = "";
633 this->LongAlign = 32;
634 this->LongWidth = 32;
635 this->PointerAlign = 32;
636 this->PointerWidth = 32;
637 this->IntMaxType = TargetInfo::SignedLongLong;
638 this->UIntMaxType = TargetInfo::UnsignedLongLong;
639 this->Int64Type = TargetInfo::SignedLongLong;
640 this->DoubleAlign = 64;
641 this->LongDoubleWidth = 64;
642 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000643 this->LongLongWidth = 64;
644 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000645 this->SizeType = TargetInfo::UnsignedInt;
646 this->PtrDiffType = TargetInfo::SignedInt;
647 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000648 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000649 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000650 if (Triple.getArch() == llvm::Triple::arm) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000651 this->DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000652 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000653 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000654 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000655 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000656 } else if (Triple.getArch() == llvm::Triple::mipsel) {
657 // Handled on mips' setDescriptionString.
658 } else {
659 assert(Triple.getArch() == llvm::Triple::le32);
660 this->DescriptionString = "e-p:32:32-i64:64";
661 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000662 }
Craig Topper3164f332014-03-11 03:39:26 +0000663 typename Target::CallingConvCheckResult checkCallingConvention(
664 CallingConv CC) const override {
Derek Schuffa2020962012-10-16 22:30:41 +0000665 return CC == CC_PnaclCall ? Target::CCCR_OK :
666 Target::checkCallingConvention(CC);
667 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000668};
Mike Stump11289f42009-09-09 15:08:12 +0000669} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000670
Chris Lattner09d98f52008-10-05 21:50:58 +0000671//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000672// Specific target implementations.
673//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000674
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000675namespace {
676// PPC abstract base class
677class PPCTargetInfo : public TargetInfo {
678 static const Builtin::Info BuiltinInfo[];
679 static const char * const GCCRegNames[];
680 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000681 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000682
683 // Target cpu features.
684 bool HasVSX;
685
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000686public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000687 PPCTargetInfo(const llvm::Triple &Triple)
688 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000689 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000690 LongDoubleWidth = LongDoubleAlign = 128;
691 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
692 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000693
Hal Finkel6b984f02012-07-03 16:51:04 +0000694 /// \brief Flags for architecture specific defines.
695 typedef enum {
696 ArchDefineNone = 0,
697 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
698 ArchDefinePpcgr = 1 << 1,
699 ArchDefinePpcsq = 1 << 2,
700 ArchDefine440 = 1 << 3,
701 ArchDefine603 = 1 << 4,
702 ArchDefine604 = 1 << 5,
703 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000704 ArchDefinePwr5 = 1 << 7,
705 ArchDefinePwr5x = 1 << 8,
706 ArchDefinePwr6 = 1 << 9,
707 ArchDefinePwr6x = 1 << 10,
708 ArchDefinePwr7 = 1 << 11,
709 ArchDefineA2 = 1 << 12,
710 ArchDefineA2q = 1 << 13
Hal Finkel6b984f02012-07-03 16:51:04 +0000711 } ArchDefineTypes;
712
Bill Schmidt38378a02013-02-01 20:23:10 +0000713 // Note: GCC recognizes the following additional cpus:
714 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
715 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
716 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000717 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000718 bool CPUKnown = llvm::StringSwitch<bool>(Name)
719 .Case("generic", true)
720 .Case("440", true)
721 .Case("450", true)
722 .Case("601", true)
723 .Case("602", true)
724 .Case("603", true)
725 .Case("603e", true)
726 .Case("603ev", true)
727 .Case("604", true)
728 .Case("604e", true)
729 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000730 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000731 .Case("g3", true)
732 .Case("7400", true)
733 .Case("g4", true)
734 .Case("7450", true)
735 .Case("g4+", true)
736 .Case("750", true)
737 .Case("970", true)
738 .Case("g5", true)
739 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000740 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000741 .Case("e500mc", true)
742 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000743 .Case("power3", true)
744 .Case("pwr3", true)
745 .Case("power4", true)
746 .Case("pwr4", true)
747 .Case("power5", true)
748 .Case("pwr5", true)
749 .Case("power5x", true)
750 .Case("pwr5x", true)
751 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000752 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000753 .Case("power6x", true)
754 .Case("pwr6x", true)
755 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000756 .Case("pwr7", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000757 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000758 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000759 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000760 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000761 .Case("powerpc64le", true)
762 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000763 .Default(false);
764
765 if (CPUKnown)
766 CPU = Name;
767
768 return CPUKnown;
769 }
770
Craig Topper3164f332014-03-11 03:39:26 +0000771 void getTargetBuiltins(const Builtin::Info *&Records,
772 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000773 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000774 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000775 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000776
Craig Topper3164f332014-03-11 03:39:26 +0000777 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000778
Craig Topper3164f332014-03-11 03:39:26 +0000779 void getTargetDefines(const LangOptions &Opts,
780 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000781
Craig Topper3164f332014-03-11 03:39:26 +0000782 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000783
Craig Topper3164f332014-03-11 03:39:26 +0000784 bool handleTargetFeatures(std::vector<std::string> &Features,
785 DiagnosticsEngine &Diags) override;
786 bool hasFeature(StringRef Feature) const override;
787
788 void getGCCRegNames(const char * const *&Names,
789 unsigned &NumNames) const override;
790 void getGCCRegAliases(const GCCRegAlias *&Aliases,
791 unsigned &NumAliases) const override;
792 bool validateAsmConstraint(const char *&Name,
793 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000794 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000795 default: return false;
796 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000797 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000798 case 'b': // Base register
799 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000800 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000801 break;
802 // FIXME: The following are added to allow parsing.
803 // I just took a guess at what the actions should be.
804 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000805 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000806 case 'v': // Altivec vector register
807 Info.setAllowsRegister();
808 break;
809 case 'w':
810 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000811 case 'd':// VSX vector register to hold vector double data
812 case 'f':// VSX vector register to hold vector float data
813 case 's':// VSX vector register to hold scalar float data
814 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000815 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000816 break;
817 default:
818 return false;
819 }
820 Info.setAllowsRegister();
821 Name++; // Skip over 'w'.
822 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000823 case 'h': // `MQ', `CTR', or `LINK' register
824 case 'q': // `MQ' register
825 case 'c': // `CTR' register
826 case 'l': // `LINK' register
827 case 'x': // `CR' register (condition register) number 0
828 case 'y': // `CR' register (condition register)
829 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000830 Info.setAllowsRegister();
831 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000832 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000833 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000834 // (use `L' instead for SImode constants)
835 case 'K': // Unsigned 16-bit constant
836 case 'L': // Signed 16-bit constant shifted left 16 bits
837 case 'M': // Constant larger than 31
838 case 'N': // Exact power of 2
839 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000840 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000841 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000842 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000843 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000844 break;
845 case 'm': // Memory operand. Note that on PowerPC targets, m can
846 // include addresses that update the base register. It
847 // is therefore only safe to use `m' in an asm statement
848 // if that asm statement accesses the operand exactly once.
849 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000850 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000851 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000852 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000853 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000854 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
855 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000856 // register to be updated.
857 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000858 if (Name[1] != 's')
859 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000860 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000861 // include any automodification of the base register. Unlike
862 // `m', this constraint can be used in asm statements that
863 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000864 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000865 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000866 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000867 break;
868 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000869 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000870 case 'Z': // Memory operand that is an indexed or indirect from a
871 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000872 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000873 Info.setAllowsMemory();
874 Info.setAllowsRegister();
875 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000876 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000877 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000878 // register (`p' is preferable for asm statements)
879 case 'S': // Constant suitable as a 64-bit mask operand
880 case 'T': // Constant suitable as a 32-bit mask operand
881 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000882 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000883 // instructions
884 case 'W': // Vector constant that does not require memory
885 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000886 break;
887 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000888 }
John Thompson07a61a42010-06-24 22:44:13 +0000889 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000890 }
Craig Topper3164f332014-03-11 03:39:26 +0000891 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000892 std::string R;
893 switch (*Constraint) {
894 case 'e':
895 case 'w':
896 // Two-character constraint; add "^" hint for later parsing.
897 R = std::string("^") + std::string(Constraint, 2);
898 Constraint++;
899 break;
900 default:
901 return TargetInfo::convertConstraint(Constraint);
902 }
903 return R;
904 }
Craig Topper3164f332014-03-11 03:39:26 +0000905 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000906 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000907 }
Craig Topper3164f332014-03-11 03:39:26 +0000908 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000909 if (RegNo == 0) return 3;
910 if (RegNo == 1) return 4;
911 return -1;
912 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000913};
Anders Carlssonf511f642007-11-27 04:11:28 +0000914
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000915const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000916#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000917#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000918 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000919#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000920};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000921
Eric Christopher3ff21b32013-10-16 21:26:26 +0000922 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000923/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000924bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000925 DiagnosticsEngine &Diags) {
926 // Remember the maximum enabled sselevel.
927 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
928 // Ignore disabled features.
929 if (Features[i][0] == '-')
930 continue;
931
932 StringRef Feature = StringRef(Features[i]).substr(1);
933
934 if (Feature == "vsx") {
935 HasVSX = true;
936 continue;
937 }
938
939 // TODO: Finish this list and add an assert that we've handled them
940 // all.
941 }
942
943 return true;
944}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000945
Chris Lattnerecd49032009-03-02 22:27:17 +0000946/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
947/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000948void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000949 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000950 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000951 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000952 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000953 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000954 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000955 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000956 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000957 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000958 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000959 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000960 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000961 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000962
Chris Lattnerecd49032009-03-02 22:27:17 +0000963 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000964 if (getTriple().getArch() == llvm::Triple::ppc64le) {
965 Builder.defineMacro("_LITTLE_ENDIAN");
Will Schmidt22d24352014-03-24 17:27:03 +0000966 Builder.defineMacro("_CALL_ELF","2");
Bill Schmidt778d3872013-07-26 01:36:11 +0000967 } else {
968 if (getTriple().getOS() != llvm::Triple::NetBSD &&
969 getTriple().getOS() != llvm::Triple::OpenBSD)
970 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000971 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000972
Chris Lattnerecd49032009-03-02 22:27:17 +0000973 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000974 Builder.defineMacro("__NATURAL_ALIGNMENT__");
975 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000976
Chris Lattnerecd49032009-03-02 22:27:17 +0000977 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000978 if (LongDoubleWidth == 128)
979 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000980
John Thompsone467e192009-11-19 17:18:50 +0000981 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000982 Builder.defineMacro("__VEC__", "10206");
983 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000984 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000985
986 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000987 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
988 .Case("440", ArchDefineName)
989 .Case("450", ArchDefineName | ArchDefine440)
990 .Case("601", ArchDefineName)
991 .Case("602", ArchDefineName | ArchDefinePpcgr)
992 .Case("603", ArchDefineName | ArchDefinePpcgr)
993 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
994 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
995 .Case("604", ArchDefineName | ArchDefinePpcgr)
996 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
997 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +0000998 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +0000999 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1000 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1001 .Case("750", ArchDefineName | ArchDefinePpcgr)
1002 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1003 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001004 .Case("a2", ArchDefineA2)
1005 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001006 .Case("pwr3", ArchDefinePpcgr)
1007 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1008 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1009 | ArchDefinePpcsq)
1010 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1011 | ArchDefinePpcgr | ArchDefinePpcsq)
1012 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1013 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1014 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1015 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1016 | ArchDefinePpcsq)
1017 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1018 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1019 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
1020 .Case("power3", ArchDefinePpcgr)
1021 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1022 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1023 | ArchDefinePpcsq)
1024 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1025 | ArchDefinePpcgr | ArchDefinePpcsq)
1026 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1027 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1028 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1029 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1030 | ArchDefinePpcsq)
1031 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1032 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1033 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001034 .Default(ArchDefineNone);
1035
1036 if (defs & ArchDefineName)
1037 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1038 if (defs & ArchDefinePpcgr)
1039 Builder.defineMacro("_ARCH_PPCGR");
1040 if (defs & ArchDefinePpcsq)
1041 Builder.defineMacro("_ARCH_PPCSQ");
1042 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001043 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001044 if (defs & ArchDefine603)
1045 Builder.defineMacro("_ARCH_603");
1046 if (defs & ArchDefine604)
1047 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001048 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001049 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001050 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001051 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001052 if (defs & ArchDefinePwr5x)
1053 Builder.defineMacro("_ARCH_PWR5X");
1054 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001055 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001056 if (defs & ArchDefinePwr6x)
1057 Builder.defineMacro("_ARCH_PWR6X");
1058 if (defs & ArchDefinePwr7)
1059 Builder.defineMacro("_ARCH_PWR7");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001060 if (defs & ArchDefineA2)
1061 Builder.defineMacro("_ARCH_A2");
1062 if (defs & ArchDefineA2q) {
1063 Builder.defineMacro("_ARCH_A2Q");
1064 Builder.defineMacro("_ARCH_QP");
1065 }
1066
1067 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1068 Builder.defineMacro("__bg__");
1069 Builder.defineMacro("__THW_BLUEGENE__");
1070 Builder.defineMacro("__bgq__");
1071 Builder.defineMacro("__TOS_BGQ__");
1072 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001073
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001074 if (HasVSX)
1075 Builder.defineMacro("__VSX__");
1076
Bill Schmidt38378a02013-02-01 20:23:10 +00001077 // FIXME: The following are not yet generated here by Clang, but are
1078 // generated by GCC:
1079 //
1080 // _SOFT_FLOAT_
1081 // __RECIP_PRECISION__
1082 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001083 // __RECIP__
1084 // __RECIPF__
1085 // __RSQRTE__
1086 // __RSQRTEF__
1087 // _SOFT_DOUBLE_
1088 // __NO_LWSYNC__
1089 // __HAVE_BSWAP__
1090 // __LONGDOUBLE128
1091 // __CMODEL_MEDIUM__
1092 // __CMODEL_LARGE__
1093 // _CALL_SYSV
1094 // _CALL_DARWIN
1095 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001096}
1097
1098void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1099 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1100 .Case("7400", true)
1101 .Case("g4", true)
1102 .Case("7450", true)
1103 .Case("g4+", true)
1104 .Case("970", true)
1105 .Case("g5", true)
1106 .Case("pwr6", true)
1107 .Case("pwr7", true)
1108 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001109 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001110 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001111
1112 Features["qpx"] = (CPU == "a2q");
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001113}
1114
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001115bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1116 return Feature == "powerpc";
1117}
Chris Lattner17df24e2008-04-21 18:56:49 +00001118
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001119
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001120const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001121 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1122 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1123 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1124 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1125 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1126 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1127 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1128 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001129 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001130 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001131 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001132 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1133 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1134 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1135 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001136 "vrsave", "vscr",
1137 "spe_acc", "spefscr",
1138 "sfp"
1139};
Chris Lattner10a5b382007-01-29 05:24:35 +00001140
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001141void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001142 unsigned &NumNames) const {
1143 Names = GCCRegNames;
1144 NumNames = llvm::array_lengthof(GCCRegNames);
1145}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001146
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001147const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1148 // While some of these aliases do map to different registers
1149 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001150 { { "0" }, "r0" },
1151 { { "1"}, "r1" },
1152 { { "2" }, "r2" },
1153 { { "3" }, "r3" },
1154 { { "4" }, "r4" },
1155 { { "5" }, "r5" },
1156 { { "6" }, "r6" },
1157 { { "7" }, "r7" },
1158 { { "8" }, "r8" },
1159 { { "9" }, "r9" },
1160 { { "10" }, "r10" },
1161 { { "11" }, "r11" },
1162 { { "12" }, "r12" },
1163 { { "13" }, "r13" },
1164 { { "14" }, "r14" },
1165 { { "15" }, "r15" },
1166 { { "16" }, "r16" },
1167 { { "17" }, "r17" },
1168 { { "18" }, "r18" },
1169 { { "19" }, "r19" },
1170 { { "20" }, "r20" },
1171 { { "21" }, "r21" },
1172 { { "22" }, "r22" },
1173 { { "23" }, "r23" },
1174 { { "24" }, "r24" },
1175 { { "25" }, "r25" },
1176 { { "26" }, "r26" },
1177 { { "27" }, "r27" },
1178 { { "28" }, "r28" },
1179 { { "29" }, "r29" },
1180 { { "30" }, "r30" },
1181 { { "31" }, "r31" },
1182 { { "fr0" }, "f0" },
1183 { { "fr1" }, "f1" },
1184 { { "fr2" }, "f2" },
1185 { { "fr3" }, "f3" },
1186 { { "fr4" }, "f4" },
1187 { { "fr5" }, "f5" },
1188 { { "fr6" }, "f6" },
1189 { { "fr7" }, "f7" },
1190 { { "fr8" }, "f8" },
1191 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001192 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001193 { { "fr11" }, "f11" },
1194 { { "fr12" }, "f12" },
1195 { { "fr13" }, "f13" },
1196 { { "fr14" }, "f14" },
1197 { { "fr15" }, "f15" },
1198 { { "fr16" }, "f16" },
1199 { { "fr17" }, "f17" },
1200 { { "fr18" }, "f18" },
1201 { { "fr19" }, "f19" },
1202 { { "fr20" }, "f20" },
1203 { { "fr21" }, "f21" },
1204 { { "fr22" }, "f22" },
1205 { { "fr23" }, "f23" },
1206 { { "fr24" }, "f24" },
1207 { { "fr25" }, "f25" },
1208 { { "fr26" }, "f26" },
1209 { { "fr27" }, "f27" },
1210 { { "fr28" }, "f28" },
1211 { { "fr29" }, "f29" },
1212 { { "fr30" }, "f30" },
1213 { { "fr31" }, "f31" },
1214 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001215};
1216
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001217void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001218 unsigned &NumAliases) const {
1219 Aliases = GCCRegAliases;
1220 NumAliases = llvm::array_lengthof(GCCRegAliases);
1221}
1222} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001223
Chris Lattner5ba61f02006-10-14 07:39:34 +00001224namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001225class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001226public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001227 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001228 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001229
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001230 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001231 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001232 case llvm::Triple::FreeBSD:
1233 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001234 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001235 PtrDiffType = SignedInt;
1236 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001237 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001238 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001239 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001240 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001241
Roman Divacky3ffe7462012-03-13 19:20:17 +00001242 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1243 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001244 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001245 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001246
1247 // PPC32 supports atomics up to 4 bytes.
1248 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001249 }
1250
Craig Topper3164f332014-03-11 03:39:26 +00001251 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001252 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001253 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001254 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001255};
1256} // end anonymous namespace.
1257
Bill Schmidt778d3872013-07-26 01:36:11 +00001258// Note: ABI differences may eventually require us to have a separate
1259// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001260namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001261class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001262public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001263 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001264 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001265 IntMaxType = SignedLong;
1266 UIntMaxType = UnsignedLong;
1267 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001268
Roman Divacky3ffe7462012-03-13 19:20:17 +00001269 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1270 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001271 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001272 DescriptionString = "E-m:e-i64:64-n32:64";
Will Schmidt0c67b7e2014-03-24 15:48:02 +00001273 } else {
1274 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1275 DescriptionString = "e-m:e-i64:64-n32:64";
1276 } else {
1277 DescriptionString = "E-m:e-i64:64-n32:64";
1278 }
1279}
Benjamin Kramer37196de2012-11-17 17:30:55 +00001280
1281 // PPC64 supports atomics up to 8 bytes.
1282 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001283 }
Craig Topper3164f332014-03-11 03:39:26 +00001284 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001285 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001286 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001287};
1288} // end anonymous namespace.
1289
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001290
1291namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001292class DarwinPPC32TargetInfo :
1293 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001294public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001295 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1296 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001297 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001298 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherc04fe092013-10-16 21:19:19 +00001299 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001300 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001301 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001302 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001303 }
Craig Topper3164f332014-03-11 03:39:26 +00001304 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001305 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001306 }
1307};
1308
1309class DarwinPPC64TargetInfo :
1310 public DarwinTargetInfo<PPC64TargetInfo> {
1311public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001312 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1313 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001314 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001315 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001316 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001317 }
1318};
1319} // end anonymous namespace.
1320
Chris Lattner5ba61f02006-10-14 07:39:34 +00001321namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001322 static const unsigned NVPTXAddrSpaceMap[] = {
1323 1, // opencl_global
1324 3, // opencl_local
1325 4, // opencl_constant
1326 1, // cuda_device
1327 4, // cuda_constant
1328 3, // cuda_shared
1329 };
1330 class NVPTXTargetInfo : public TargetInfo {
1331 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001332 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001333 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001334 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001335 BigEndian = false;
1336 TLSSupported = false;
1337 LongWidth = LongAlign = 64;
1338 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001339 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001340 // Define available target features
1341 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001342 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001343 }
Craig Topper3164f332014-03-11 03:39:26 +00001344 void getTargetDefines(const LangOptions &Opts,
1345 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001346 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001347 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001348 }
Craig Topper3164f332014-03-11 03:39:26 +00001349 void getTargetBuiltins(const Builtin::Info *&Records,
1350 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001351 Records = BuiltinInfo;
1352 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001353 }
Craig Topper3164f332014-03-11 03:39:26 +00001354 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001355 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001356 }
Craig Topper3164f332014-03-11 03:39:26 +00001357
1358 void getGCCRegNames(const char * const *&Names,
1359 unsigned &NumNames) const override;
1360 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1361 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001362 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001363 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001364 NumAliases = 0;
1365 }
Craig Topper3164f332014-03-11 03:39:26 +00001366 bool validateAsmConstraint(const char *&Name,
1367 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001368 switch (*Name) {
1369 default: return false;
1370 case 'c':
1371 case 'h':
1372 case 'r':
1373 case 'l':
1374 case 'f':
1375 case 'd':
1376 Info.setAllowsRegister();
1377 return true;
1378 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001379 }
Craig Topper3164f332014-03-11 03:39:26 +00001380 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001381 // FIXME: Is this really right?
1382 return "";
1383 }
Craig Topper3164f332014-03-11 03:39:26 +00001384 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001385 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001386 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001387 }
Craig Topper3164f332014-03-11 03:39:26 +00001388 bool setCPU(const std::string &Name) override {
Justin Holewinski91203e82013-03-30 14:38:26 +00001389 bool Valid = llvm::StringSwitch<bool>(Name)
1390 .Case("sm_20", true)
1391 .Case("sm_21", true)
1392 .Case("sm_30", true)
1393 .Case("sm_35", true)
1394 .Default(false);
1395
1396 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001397 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001398 };
1399
1400 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1401#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1402#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1403 ALL_LANGUAGES },
1404#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001405 };
1406
1407 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1408 "r0"
1409 };
1410
1411 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1412 unsigned &NumNames) const {
1413 Names = GCCRegNames;
1414 NumNames = llvm::array_lengthof(GCCRegNames);
1415 }
1416
1417 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1418 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001419 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001420 PointerWidth = PointerAlign = 32;
Justin Holewinski83e96682012-05-24 17:43:12 +00001421 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001422 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001423 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001424 };
1425
1426 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1427 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001428 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001429 PointerWidth = PointerAlign = 64;
Justin Holewinski83e96682012-05-24 17:43:12 +00001430 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001431 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001432 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001433 };
1434}
1435
1436namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001437
1438static const unsigned R600AddrSpaceMap[] = {
1439 1, // opencl_global
1440 3, // opencl_local
1441 2, // opencl_constant
1442 1, // cuda_device
1443 2, // cuda_constant
1444 3 // cuda_shared
1445};
1446
Tom Stellardc74b1e02013-03-04 17:40:53 +00001447static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001448 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1449 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001450
1451static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001452 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1453 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001454
1455static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001456 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001457 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1458 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001459
Eli Friedmand13b41e2012-10-12 23:32:00 +00001460class R600TargetInfo : public TargetInfo {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001461 /// \brief The GPU profiles supported by the R600 target.
1462 enum GPUKind {
1463 GK_NONE,
1464 GK_R600,
1465 GK_R600_DOUBLE_OPS,
1466 GK_R700,
1467 GK_R700_DOUBLE_OPS,
1468 GK_EVERGREEN,
1469 GK_EVERGREEN_DOUBLE_OPS,
1470 GK_NORTHERN_ISLANDS,
1471 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001472 GK_SOUTHERN_ISLANDS,
1473 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001474 } GPU;
1475
Eli Friedmand13b41e2012-10-12 23:32:00 +00001476public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001477 R600TargetInfo(const llvm::Triple &Triple)
1478 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001479 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001480 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001481 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001482 }
1483
Craig Topper3164f332014-03-11 03:39:26 +00001484 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001485 return "";
1486 }
1487
Craig Topper3164f332014-03-11 03:39:26 +00001488 void getGCCRegNames(const char * const *&Names,
1489 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001490 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001491 numNames = 0;
1492 }
1493
Craig Topper3164f332014-03-11 03:39:26 +00001494 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1495 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001496 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001497 NumAliases = 0;
1498 }
1499
Craig Topper3164f332014-03-11 03:39:26 +00001500 bool validateAsmConstraint(const char *&Name,
1501 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001502 return true;
1503 }
1504
Craig Topper3164f332014-03-11 03:39:26 +00001505 void getTargetBuiltins(const Builtin::Info *&Records,
1506 unsigned &NumRecords) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001507 Records = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001508 NumRecords = 0;
1509 }
1510
1511
Craig Topper3164f332014-03-11 03:39:26 +00001512 void getTargetDefines(const LangOptions &Opts,
1513 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001514 Builder.defineMacro("__R600__");
1515 }
1516
Craig Topper3164f332014-03-11 03:39:26 +00001517 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001518 return TargetInfo::CharPtrBuiltinVaList;
1519 }
1520
Craig Topper3164f332014-03-11 03:39:26 +00001521 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001522 GPU = llvm::StringSwitch<GPUKind>(Name)
1523 .Case("r600" , GK_R600)
1524 .Case("rv610", GK_R600)
1525 .Case("rv620", GK_R600)
1526 .Case("rv630", GK_R600)
1527 .Case("rv635", GK_R600)
1528 .Case("rs780", GK_R600)
1529 .Case("rs880", GK_R600)
1530 .Case("rv670", GK_R600_DOUBLE_OPS)
1531 .Case("rv710", GK_R700)
1532 .Case("rv730", GK_R700)
1533 .Case("rv740", GK_R700_DOUBLE_OPS)
1534 .Case("rv770", GK_R700_DOUBLE_OPS)
1535 .Case("palm", GK_EVERGREEN)
1536 .Case("cedar", GK_EVERGREEN)
1537 .Case("sumo", GK_EVERGREEN)
1538 .Case("sumo2", GK_EVERGREEN)
1539 .Case("redwood", GK_EVERGREEN)
1540 .Case("juniper", GK_EVERGREEN)
1541 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1542 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1543 .Case("barts", GK_NORTHERN_ISLANDS)
1544 .Case("turks", GK_NORTHERN_ISLANDS)
1545 .Case("caicos", GK_NORTHERN_ISLANDS)
1546 .Case("cayman", GK_CAYMAN)
1547 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001548 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001549 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1550 .Case("verde", GK_SOUTHERN_ISLANDS)
1551 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001552 .Case("bonaire", GK_SEA_ISLANDS)
1553 .Case("kabini", GK_SEA_ISLANDS)
1554 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001555 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001556 .Default(GK_NONE);
1557
1558 if (GPU == GK_NONE) {
1559 return false;
1560 }
1561
1562 // Set the correct data layout
1563 switch (GPU) {
1564 case GK_NONE:
1565 case GK_R600:
1566 case GK_R700:
1567 case GK_EVERGREEN:
1568 case GK_NORTHERN_ISLANDS:
1569 DescriptionString = DescriptionStringR600;
1570 break;
1571 case GK_R600_DOUBLE_OPS:
1572 case GK_R700_DOUBLE_OPS:
1573 case GK_EVERGREEN_DOUBLE_OPS:
1574 case GK_CAYMAN:
1575 DescriptionString = DescriptionStringR600DoubleOps;
1576 break;
1577 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001578 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001579 DescriptionString = DescriptionStringSI;
1580 break;
1581 }
1582
1583 return true;
1584 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001585};
1586
1587} // end anonymous namespace
1588
1589namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001590// Namespace for x86 abstract base class
1591const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001592#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001593#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001594 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001595#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001596};
Eli Friedmanb5366062008-05-20 14:21:01 +00001597
Nuno Lopescfca1f02009-12-23 17:49:57 +00001598static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001599 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1600 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001601 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001602 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1603 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1604 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001605 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001606 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1607 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001608};
1609
Eric Christophercdd36352011-06-21 00:05:20 +00001610const TargetInfo::AddlRegName AddlRegNames[] = {
1611 { { "al", "ah", "eax", "rax" }, 0 },
1612 { { "bl", "bh", "ebx", "rbx" }, 3 },
1613 { { "cl", "ch", "ecx", "rcx" }, 2 },
1614 { { "dl", "dh", "edx", "rdx" }, 1 },
1615 { { "esi", "rsi" }, 4 },
1616 { { "edi", "rdi" }, 5 },
1617 { { "esp", "rsp" }, 7 },
1618 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001619};
1620
1621// X86 target abstract base class; x86-32 and x86-64 are very close, so
1622// most of the implementation can be shared.
1623class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001624 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001625 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001626 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001627 enum MMX3DNowEnum {
1628 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1629 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001630 enum XOPEnum {
1631 NoXOP,
1632 SSE4A,
1633 FMA4,
1634 XOP
1635 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001636
Eric Christophere1ddaf92010-04-02 23:50:19 +00001637 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001638 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001639 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001640 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001641 bool HasBMI;
1642 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001643 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001644 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001645 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001646 bool HasRDSEED;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001647 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001648 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001649 bool HasF16C;
Craig Topper679b53a2013-08-21 05:29:10 +00001650 bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
Ben Langmuir58078d02013-09-19 13:22:04 +00001651 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001652 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001653
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001654 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1655 ///
1656 /// Each enumeration represents a particular CPU supported by Clang. These
1657 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1658 enum CPUKind {
1659 CK_Generic,
1660
1661 /// \name i386
1662 /// i386-generation processors.
1663 //@{
1664 CK_i386,
1665 //@}
1666
1667 /// \name i486
1668 /// i486-generation processors.
1669 //@{
1670 CK_i486,
1671 CK_WinChipC6,
1672 CK_WinChip2,
1673 CK_C3,
1674 //@}
1675
1676 /// \name i586
1677 /// i586-generation processors, P5 microarchitecture based.
1678 //@{
1679 CK_i586,
1680 CK_Pentium,
1681 CK_PentiumMMX,
1682 //@}
1683
1684 /// \name i686
1685 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1686 //@{
1687 CK_i686,
1688 CK_PentiumPro,
1689 CK_Pentium2,
1690 CK_Pentium3,
1691 CK_Pentium3M,
1692 CK_PentiumM,
1693 CK_C3_2,
1694
1695 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1696 /// Clang however has some logic to suport this.
1697 // FIXME: Warn, deprecate, and potentially remove this.
1698 CK_Yonah,
1699 //@}
1700
1701 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001702 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001703 //@{
1704 CK_Pentium4,
1705 CK_Pentium4M,
1706 CK_Prescott,
1707 CK_Nocona,
1708 //@}
1709
1710 /// \name Core
1711 /// Core microarchitecture based processors.
1712 //@{
1713 CK_Core2,
1714
1715 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1716 /// codename which GCC no longer accepts as an option to -march, but Clang
1717 /// has some logic for recognizing it.
1718 // FIXME: Warn, deprecate, and potentially remove this.
1719 CK_Penryn,
1720 //@}
1721
1722 /// \name Atom
1723 /// Atom processors
1724 //@{
1725 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001726 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001727 //@}
1728
1729 /// \name Nehalem
1730 /// Nehalem microarchitecture based processors.
1731 //@{
1732 CK_Corei7,
1733 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001734 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001735 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001736 //@}
1737
Craig Topper449314e2013-08-20 07:09:39 +00001738 /// \name Knights Landing
1739 /// Knights Landing processor.
1740 CK_KNL,
1741
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001742 /// \name K6
1743 /// K6 architecture processors.
1744 //@{
1745 CK_K6,
1746 CK_K6_2,
1747 CK_K6_3,
1748 //@}
1749
1750 /// \name K7
1751 /// K7 architecture processors.
1752 //@{
1753 CK_Athlon,
1754 CK_AthlonThunderbird,
1755 CK_Athlon4,
1756 CK_AthlonXP,
1757 CK_AthlonMP,
1758 //@}
1759
1760 /// \name K8
1761 /// K8 architecture processors.
1762 //@{
1763 CK_Athlon64,
1764 CK_Athlon64SSE3,
1765 CK_AthlonFX,
1766 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001767 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001768 CK_Opteron,
1769 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001770 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001771 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001772
Benjamin Kramer569f2152012-01-10 11:50:18 +00001773 /// \name Bobcat
1774 /// Bobcat architecture processors.
1775 //@{
1776 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001777 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001778 //@}
1779
1780 /// \name Bulldozer
1781 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001782 //@{
1783 CK_BDVER1,
1784 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001785 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001786 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001787 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001788
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001789 /// This specification is deprecated and will be removed in the future.
1790 /// Users should prefer \see CK_K8.
1791 // FIXME: Warn on this when the CPU is set to it.
1792 CK_x86_64,
1793 //@}
1794
1795 /// \name Geode
1796 /// Geode processors.
1797 //@{
1798 CK_Geode
1799 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001800 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001801
Rafael Espindolaeb265472013-08-21 21:59:03 +00001802 enum FPMathKind {
1803 FP_Default,
1804 FP_SSE,
1805 FP_387
1806 } FPMath;
1807
Eli Friedman3fd920a2008-08-20 02:34:37 +00001808public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001809 X86TargetInfo(const llvm::Triple &Triple)
1810 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001811 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1812 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001813 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1814 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001815 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1816 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001817 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001818 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001819 }
Craig Topper3164f332014-03-11 03:39:26 +00001820 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001821 // X87 evaluates with 80 bits "long double" precision.
1822 return SSELevel == NoSSE ? 2 : 0;
1823 }
Craig Topper3164f332014-03-11 03:39:26 +00001824 void getTargetBuiltins(const Builtin::Info *&Records,
1825 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001826 Records = BuiltinInfo;
1827 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001828 }
Craig Topper3164f332014-03-11 03:39:26 +00001829 void getGCCRegNames(const char * const *&Names,
1830 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001831 Names = GCCRegNames;
1832 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001833 }
Craig Topper3164f332014-03-11 03:39:26 +00001834 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1835 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001836 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00001837 NumAliases = 0;
1838 }
Craig Topper3164f332014-03-11 03:39:26 +00001839 void getGCCAddlRegNames(const AddlRegName *&Names,
1840 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001841 Names = AddlRegNames;
1842 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001843 }
Craig Topper3164f332014-03-11 03:39:26 +00001844 bool validateAsmConstraint(const char *&Name,
1845 TargetInfo::ConstraintInfo &info) const override;
1846 std::string convertConstraint(const char *&Constraint) const override;
1847 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001848 return "~{dirflag},~{fpsr},~{flags}";
1849 }
Craig Topper3164f332014-03-11 03:39:26 +00001850 void getTargetDefines(const LangOptions &Opts,
1851 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001852 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1853 bool Enabled);
1854 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1855 bool Enabled);
1856 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1857 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001858 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1859 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00001860 setFeatureEnabledImpl(Features, Name, Enabled);
1861 }
1862 // This exists purely to cut down on the number of virtual calls in
1863 // getDefaultFeatures which calls this repeatedly.
1864 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1865 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001866 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1867 bool hasFeature(StringRef Feature) const override;
1868 bool handleTargetFeatures(std::vector<std::string> &Features,
1869 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00001870 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001871 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001872 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001873 else if (getTriple().getArch() == llvm::Triple::x86 &&
1874 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001875 return "no-mmx";
1876 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001877 }
Craig Topper3164f332014-03-11 03:39:26 +00001878 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00001879 CPU = llvm::StringSwitch<CPUKind>(Name)
1880 .Case("i386", CK_i386)
1881 .Case("i486", CK_i486)
1882 .Case("winchip-c6", CK_WinChipC6)
1883 .Case("winchip2", CK_WinChip2)
1884 .Case("c3", CK_C3)
1885 .Case("i586", CK_i586)
1886 .Case("pentium", CK_Pentium)
1887 .Case("pentium-mmx", CK_PentiumMMX)
1888 .Case("i686", CK_i686)
1889 .Case("pentiumpro", CK_PentiumPro)
1890 .Case("pentium2", CK_Pentium2)
1891 .Case("pentium3", CK_Pentium3)
1892 .Case("pentium3m", CK_Pentium3M)
1893 .Case("pentium-m", CK_PentiumM)
1894 .Case("c3-2", CK_C3_2)
1895 .Case("yonah", CK_Yonah)
1896 .Case("pentium4", CK_Pentium4)
1897 .Case("pentium4m", CK_Pentium4M)
1898 .Case("prescott", CK_Prescott)
1899 .Case("nocona", CK_Nocona)
1900 .Case("core2", CK_Core2)
1901 .Case("penryn", CK_Penryn)
1902 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001903 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001904 .Case("corei7", CK_Corei7)
1905 .Case("corei7-avx", CK_Corei7AVX)
1906 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001907 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001908 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00001909 .Case("k6", CK_K6)
1910 .Case("k6-2", CK_K6_2)
1911 .Case("k6-3", CK_K6_3)
1912 .Case("athlon", CK_Athlon)
1913 .Case("athlon-tbird", CK_AthlonThunderbird)
1914 .Case("athlon-4", CK_Athlon4)
1915 .Case("athlon-xp", CK_AthlonXP)
1916 .Case("athlon-mp", CK_AthlonMP)
1917 .Case("athlon64", CK_Athlon64)
1918 .Case("athlon64-sse3", CK_Athlon64SSE3)
1919 .Case("athlon-fx", CK_AthlonFX)
1920 .Case("k8", CK_K8)
1921 .Case("k8-sse3", CK_K8SSE3)
1922 .Case("opteron", CK_Opteron)
1923 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001924 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001925 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001926 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001927 .Case("bdver1", CK_BDVER1)
1928 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001929 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00001930 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00001931 .Case("x86-64", CK_x86_64)
1932 .Case("geode", CK_Geode)
1933 .Default(CK_Generic);
1934
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001935 // Perform any per-CPU checks necessary to determine if this CPU is
1936 // acceptable.
1937 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1938 // invalid without explaining *why*.
1939 switch (CPU) {
1940 case CK_Generic:
1941 // No processor selected!
1942 return false;
1943
1944 case CK_i386:
1945 case CK_i486:
1946 case CK_WinChipC6:
1947 case CK_WinChip2:
1948 case CK_C3:
1949 case CK_i586:
1950 case CK_Pentium:
1951 case CK_PentiumMMX:
1952 case CK_i686:
1953 case CK_PentiumPro:
1954 case CK_Pentium2:
1955 case CK_Pentium3:
1956 case CK_Pentium3M:
1957 case CK_PentiumM:
1958 case CK_Yonah:
1959 case CK_C3_2:
1960 case CK_Pentium4:
1961 case CK_Pentium4M:
1962 case CK_Prescott:
1963 case CK_K6:
1964 case CK_K6_2:
1965 case CK_K6_3:
1966 case CK_Athlon:
1967 case CK_AthlonThunderbird:
1968 case CK_Athlon4:
1969 case CK_AthlonXP:
1970 case CK_AthlonMP:
1971 case CK_Geode:
1972 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00001973 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001974 return false;
1975
1976 // Fallthrough
1977 case CK_Nocona:
1978 case CK_Core2:
1979 case CK_Penryn:
1980 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00001981 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001982 case CK_Corei7:
1983 case CK_Corei7AVX:
1984 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00001985 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00001986 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001987 case CK_Athlon64:
1988 case CK_Athlon64SSE3:
1989 case CK_AthlonFX:
1990 case CK_K8:
1991 case CK_K8SSE3:
1992 case CK_Opteron:
1993 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00001994 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00001995 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001996 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001997 case CK_BDVER1:
1998 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001999 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002000 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002001 case CK_x86_64:
2002 return true;
2003 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002004 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002005 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002006
Craig Topper3164f332014-03-11 03:39:26 +00002007 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002008
Craig Topper3164f332014-03-11 03:39:26 +00002009 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002010 // We accept all non-ARM calling conventions
2011 return (CC == CC_X86ThisCall ||
2012 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00002013 CC == CC_X86StdCall ||
2014 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002015 CC == CC_X86Pascal ||
2016 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002017 }
2018
Craig Topper3164f332014-03-11 03:39:26 +00002019 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002020 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002021 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002022};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002023
Rafael Espindolaeb265472013-08-21 21:59:03 +00002024bool X86TargetInfo::setFPMath(StringRef Name) {
2025 if (Name == "387") {
2026 FPMath = FP_387;
2027 return true;
2028 }
2029 if (Name == "sse") {
2030 FPMath = FP_SSE;
2031 return true;
2032 }
2033 return false;
2034}
2035
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002036void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002037 // FIXME: This *really* should not be here.
2038
2039 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002040 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002041 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002042
Chandler Carruth212334f2011-09-28 08:55:37 +00002043 switch (CPU) {
2044 case CK_Generic:
2045 case CK_i386:
2046 case CK_i486:
2047 case CK_i586:
2048 case CK_Pentium:
2049 case CK_i686:
2050 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002051 break;
2052 case CK_PentiumMMX:
2053 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002054 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002055 break;
2056 case CK_Pentium3:
2057 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002058 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002059 break;
2060 case CK_PentiumM:
2061 case CK_Pentium4:
2062 case CK_Pentium4M:
2063 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002064 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002065 break;
2066 case CK_Yonah:
2067 case CK_Prescott:
2068 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002069 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002070 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002071 break;
2072 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002073 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002074 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002075 break;
2076 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002077 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002078 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002079 break;
2080 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002081 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002082 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002083 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002084 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002085 setFeatureEnabledImpl(Features, "sse4.2", true);
2086 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002087 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002088 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002089 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002090 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002091 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002092 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002093 break;
2094 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002095 setFeatureEnabledImpl(Features, "avx", true);
2096 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002097 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002098 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002099 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002100 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002101 setFeatureEnabledImpl(Features, "avx", true);
2102 setFeatureEnabledImpl(Features, "aes", true);
2103 setFeatureEnabledImpl(Features, "pclmul", true);
2104 setFeatureEnabledImpl(Features, "rdrnd", true);
2105 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002106 break;
Craig Topper865fff52011-12-17 19:55:21 +00002107 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002108 setFeatureEnabledImpl(Features, "avx2", true);
2109 setFeatureEnabledImpl(Features, "aes", true);
2110 setFeatureEnabledImpl(Features, "pclmul", true);
2111 setFeatureEnabledImpl(Features, "lzcnt", true);
2112 setFeatureEnabledImpl(Features, "rdrnd", true);
2113 setFeatureEnabledImpl(Features, "f16c", true);
2114 setFeatureEnabledImpl(Features, "bmi", true);
2115 setFeatureEnabledImpl(Features, "bmi2", true);
2116 setFeatureEnabledImpl(Features, "rtm", true);
2117 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002118 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002119 break;
Craig Topper449314e2013-08-20 07:09:39 +00002120 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002121 setFeatureEnabledImpl(Features, "avx512f", true);
2122 setFeatureEnabledImpl(Features, "avx512cd", true);
2123 setFeatureEnabledImpl(Features, "avx512er", true);
2124 setFeatureEnabledImpl(Features, "avx512pf", true);
2125 setFeatureEnabledImpl(Features, "aes", true);
2126 setFeatureEnabledImpl(Features, "pclmul", true);
2127 setFeatureEnabledImpl(Features, "lzcnt", true);
2128 setFeatureEnabledImpl(Features, "rdrnd", true);
2129 setFeatureEnabledImpl(Features, "f16c", true);
2130 setFeatureEnabledImpl(Features, "bmi", true);
2131 setFeatureEnabledImpl(Features, "bmi2", true);
2132 setFeatureEnabledImpl(Features, "rtm", true);
2133 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002134 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002135 case CK_K6:
2136 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002137 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002138 break;
2139 case CK_K6_2:
2140 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002141 case CK_WinChip2:
2142 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002143 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002144 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002145 case CK_Athlon:
2146 case CK_AthlonThunderbird:
2147 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002148 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002149 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002150 case CK_Athlon4:
2151 case CK_AthlonXP:
2152 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002153 setFeatureEnabledImpl(Features, "sse", true);
2154 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002155 break;
2156 case CK_K8:
2157 case CK_Opteron:
2158 case CK_Athlon64:
2159 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002160 setFeatureEnabledImpl(Features, "sse2", true);
2161 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002162 break;
2163 case CK_K8SSE3:
2164 case CK_OpteronSSE3:
2165 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002166 setFeatureEnabledImpl(Features, "sse3", true);
2167 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002168 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002169 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002170 setFeatureEnabledImpl(Features, "sse3", true);
2171 setFeatureEnabledImpl(Features, "sse4a", true);
2172 setFeatureEnabledImpl(Features, "3dnowa", true);
2173 setFeatureEnabledImpl(Features, "lzcnt", true);
2174 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002175 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002176 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002177 setFeatureEnabledImpl(Features, "ssse3", true);
2178 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002179 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002180 setFeatureEnabledImpl(Features, "lzcnt", true);
2181 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002182 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002183 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002184 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002185 setFeatureEnabledImpl(Features, "avx", true);
2186 setFeatureEnabledImpl(Features, "sse4a", true);
2187 setFeatureEnabledImpl(Features, "lzcnt", true);
2188 setFeatureEnabledImpl(Features, "aes", true);
2189 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002190 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002191 setFeatureEnabledImpl(Features, "bmi", true);
2192 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002193 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002194 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002195 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002196 setFeatureEnabledImpl(Features, "xop", true);
2197 setFeatureEnabledImpl(Features, "lzcnt", true);
2198 setFeatureEnabledImpl(Features, "aes", true);
2199 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002200 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002201 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002202 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002203 case CK_BDVER4:
2204 setFeatureEnabledImpl(Features, "avx2", true);
2205 setFeatureEnabledImpl(Features, "bmi2", true);
2206 // FALLTHROUGH
Eli Friedman3e94f572012-11-17 01:43:10 +00002207 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002208 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002209 setFeatureEnabledImpl(Features, "xop", true);
2210 setFeatureEnabledImpl(Features, "lzcnt", true);
2211 setFeatureEnabledImpl(Features, "aes", true);
2212 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002213 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002214 setFeatureEnabledImpl(Features, "bmi", true);
2215 setFeatureEnabledImpl(Features, "fma", true);
2216 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002217 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002218 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002219 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002220 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002221 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002222 break;
Eli Friedman33465822011-07-08 23:31:17 +00002223 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002224}
2225
Rafael Espindolae62e2792013-08-20 13:44:29 +00002226void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002227 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002228 if (Enabled) {
2229 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002230 case AVX512F:
2231 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002232 case AVX2:
2233 Features["avx2"] = true;
2234 case AVX:
2235 Features["avx"] = true;
2236 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002237 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002238 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002239 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002240 case SSSE3:
2241 Features["ssse3"] = true;
2242 case SSE3:
2243 Features["sse3"] = true;
2244 case SSE2:
2245 Features["sse2"] = true;
2246 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002247 Features["sse"] = true;
2248 case NoSSE:
2249 break;
2250 }
2251 return;
2252 }
2253
2254 switch (Level) {
2255 case NoSSE:
2256 case SSE1:
2257 Features["sse"] = false;
2258 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002259 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2260 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002261 case SSE3:
2262 Features["sse3"] = false;
2263 setXOPLevel(Features, NoXOP, false);
2264 case SSSE3:
2265 Features["ssse3"] = false;
2266 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002267 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002268 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002269 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002270 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002271 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002272 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002273 case AVX2:
2274 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002275 case AVX512F:
Craig Topper679b53a2013-08-21 05:29:10 +00002276 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2277 Features["avx512pf"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002278 }
2279}
2280
2281void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002282 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002283 if (Enabled) {
2284 switch (Level) {
2285 case AMD3DNowAthlon:
2286 Features["3dnowa"] = true;
2287 case AMD3DNow:
2288 Features["3dnow"] = true;
2289 case MMX:
2290 Features["mmx"] = true;
2291 case NoMMX3DNow:
2292 break;
2293 }
2294 return;
2295 }
2296
2297 switch (Level) {
2298 case NoMMX3DNow:
2299 case MMX:
2300 Features["mmx"] = false;
2301 case AMD3DNow:
2302 Features["3dnow"] = false;
2303 case AMD3DNowAthlon:
2304 Features["3dnowa"] = false;
2305 }
2306}
2307
2308void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002309 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002310 if (Enabled) {
2311 switch (Level) {
2312 case XOP:
2313 Features["xop"] = true;
2314 case FMA4:
2315 Features["fma4"] = true;
2316 setSSELevel(Features, AVX, true);
2317 case SSE4A:
2318 Features["sse4a"] = true;
2319 setSSELevel(Features, SSE3, true);
2320 case NoXOP:
2321 break;
2322 }
2323 return;
2324 }
2325
2326 switch (Level) {
2327 case NoXOP:
2328 case SSE4A:
2329 Features["sse4a"] = false;
2330 case FMA4:
2331 Features["fma4"] = false;
2332 case XOP:
2333 Features["xop"] = false;
2334 }
2335}
2336
Craig Topper86d79ef2013-09-17 04:51:29 +00002337void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2338 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002339 // FIXME: This *really* should not be here. We need some way of translating
2340 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002341 if (Name == "sse4")
2342 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002343
Rafael Espindolae62e2792013-08-20 13:44:29 +00002344 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002345
Craig Topper29561122013-09-19 01:13:07 +00002346 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002347 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002348 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002349 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002350 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002351 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002352 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002353 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002354 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002355 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002356 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002357 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002358 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002359 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002360 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002361 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002362 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002363 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002364 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002365 if (Enabled)
2366 setSSELevel(Features, SSE2, Enabled);
2367 } else if (Name == "pclmul") {
2368 if (Enabled)
2369 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002370 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002371 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002372 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002373 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002374 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002375 setSSELevel(Features, AVX512F, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002376 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002377 if (Enabled)
2378 setSSELevel(Features, AVX512F, Enabled);
2379 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002380 if (Enabled)
2381 setSSELevel(Features, AVX, Enabled);
2382 } else if (Name == "fma4") {
2383 setXOPLevel(Features, FMA4, Enabled);
2384 } else if (Name == "xop") {
2385 setXOPLevel(Features, XOP, Enabled);
2386 } else if (Name == "sse4a") {
2387 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002388 } else if (Name == "f16c") {
2389 if (Enabled)
2390 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002391 } else if (Name == "sha") {
2392 if (Enabled)
2393 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002394 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002395}
2396
Eric Christopher3ff21b32013-10-16 21:26:26 +00002397/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002398/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002399bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002400 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002401 // Remember the maximum enabled sselevel.
2402 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2403 // Ignore disabled features.
2404 if (Features[i][0] == '-')
2405 continue;
2406
Benjamin Kramer27402c62012-03-05 15:10:44 +00002407 StringRef Feature = StringRef(Features[i]).substr(1);
2408
2409 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002410 HasAES = true;
2411 continue;
2412 }
2413
Craig Topper3f122a72012-05-31 05:18:48 +00002414 if (Feature == "pclmul") {
2415 HasPCLMUL = true;
2416 continue;
2417 }
2418
Benjamin Kramer27402c62012-03-05 15:10:44 +00002419 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002420 HasLZCNT = true;
2421 continue;
2422 }
2423
Rafael Espindola89049822013-08-23 20:21:37 +00002424 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002425 HasRDRND = true;
2426 continue;
2427 }
2428
Benjamin Kramer27402c62012-03-05 15:10:44 +00002429 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002430 HasBMI = true;
2431 continue;
2432 }
2433
Benjamin Kramer27402c62012-03-05 15:10:44 +00002434 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002435 HasBMI2 = true;
2436 continue;
2437 }
2438
Benjamin Kramer27402c62012-03-05 15:10:44 +00002439 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002440 HasPOPCNT = true;
2441 continue;
2442 }
2443
Michael Liao625a8752012-11-10 05:17:46 +00002444 if (Feature == "rtm") {
2445 HasRTM = true;
2446 continue;
2447 }
2448
Michael Liao74f4eaf2013-03-26 17:52:08 +00002449 if (Feature == "prfchw") {
2450 HasPRFCHW = true;
2451 continue;
2452 }
2453
Michael Liaoffaae352013-03-29 05:17:55 +00002454 if (Feature == "rdseed") {
2455 HasRDSEED = true;
2456 continue;
2457 }
2458
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002459 if (Feature == "tbm") {
2460 HasTBM = true;
2461 continue;
2462 }
2463
Craig Topperbba778b2012-06-03 21:46:30 +00002464 if (Feature == "fma") {
2465 HasFMA = true;
2466 continue;
2467 }
2468
Manman Rena45358c2012-10-11 00:59:55 +00002469 if (Feature == "f16c") {
2470 HasF16C = true;
2471 continue;
2472 }
2473
Craig Topper679b53a2013-08-21 05:29:10 +00002474 if (Feature == "avx512cd") {
2475 HasAVX512CD = true;
2476 continue;
2477 }
2478
2479 if (Feature == "avx512er") {
2480 HasAVX512ER = true;
2481 continue;
2482 }
2483
2484 if (Feature == "avx512pf") {
2485 HasAVX512PF = true;
2486 continue;
2487 }
2488
Ben Langmuir58078d02013-09-19 13:22:04 +00002489 if (Feature == "sha") {
2490 HasSHA = true;
2491 continue;
2492 }
2493
Nick Lewycky50e8f482013-10-05 20:14:27 +00002494 if (Feature == "cx16") {
2495 HasCX16 = true;
2496 continue;
2497 }
2498
Daniel Dunbar979586e2009-11-11 09:38:56 +00002499 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002500 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002501 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002502 .Case("avx2", AVX2)
2503 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002504 .Case("sse4.2", SSE42)
2505 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002506 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002507 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002508 .Case("sse2", SSE2)
2509 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002510 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002511 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002512
Eli Friedman33465822011-07-08 23:31:17 +00002513 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002514 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002515 .Case("3dnowa", AMD3DNowAthlon)
2516 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002517 .Case("mmx", MMX)
2518 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002519 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002520
2521 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2522 .Case("xop", XOP)
2523 .Case("fma4", FMA4)
2524 .Case("sse4a", SSE4A)
2525 .Default(NoXOP);
2526 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002527 }
Eli Friedman33465822011-07-08 23:31:17 +00002528
Craig Topper7481d8a2013-09-10 06:55:47 +00002529 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2530 // Can't do this earlier because we need to be able to explicitly enable
2531 // popcnt and still disable sse4.2.
2532 if (!HasPOPCNT && SSELevel >= SSE42 &&
2533 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2534 HasPOPCNT = true;
2535 Features.push_back("+popcnt");
2536 }
2537
Yunzhong Gao61089362013-10-16 19:07:02 +00002538 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2539 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2540 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2541 HasPRFCHW = true;
2542 Features.push_back("+prfchw");
2543 }
2544
Rafael Espindolaeb265472013-08-21 21:59:03 +00002545 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2546 // matches the selected sse level.
2547 if (FPMath == FP_SSE && SSELevel < SSE1) {
2548 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2549 return false;
2550 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2551 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2552 return false;
2553 }
2554
Eli Friedman33465822011-07-08 23:31:17 +00002555 // Don't tell the backend if we're turning off mmx; it will end up disabling
2556 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002557 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2558 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002559 std::vector<std::string>::iterator it;
2560 it = std::find(Features.begin(), Features.end(), "-mmx");
2561 if (it != Features.end())
2562 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002563 else if (SSELevel > NoSSE)
2564 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002565 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002566}
Chris Lattnerecd49032009-03-02 22:27:17 +00002567
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002568/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2569/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002570void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002571 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002572 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002573 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002574 Builder.defineMacro("__amd64__");
2575 Builder.defineMacro("__amd64");
2576 Builder.defineMacro("__x86_64");
2577 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002578 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002579 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002580 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002581
Chris Lattnerecd49032009-03-02 22:27:17 +00002582 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002583 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2584 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002585 switch (CPU) {
2586 case CK_Generic:
2587 break;
2588 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002589 // The rest are coming from the i386 define above.
2590 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002591 break;
2592 case CK_i486:
2593 case CK_WinChipC6:
2594 case CK_WinChip2:
2595 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002596 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002597 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002598 case CK_PentiumMMX:
2599 Builder.defineMacro("__pentium_mmx__");
2600 Builder.defineMacro("__tune_pentium_mmx__");
2601 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002602 case CK_i586:
2603 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002604 defineCPUMacros(Builder, "i586");
2605 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002606 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002607 case CK_Pentium3:
2608 case CK_Pentium3M:
2609 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002610 Builder.defineMacro("__tune_pentium3__");
2611 // Fallthrough
2612 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002613 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002614 Builder.defineMacro("__tune_pentium2__");
2615 // Fallthrough
2616 case CK_PentiumPro:
2617 Builder.defineMacro("__tune_i686__");
2618 Builder.defineMacro("__tune_pentiumpro__");
2619 // Fallthrough
2620 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002621 Builder.defineMacro("__i686");
2622 Builder.defineMacro("__i686__");
2623 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2624 Builder.defineMacro("__pentiumpro");
2625 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002626 break;
2627 case CK_Pentium4:
2628 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002629 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002630 break;
2631 case CK_Yonah:
2632 case CK_Prescott:
2633 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002634 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002635 break;
2636 case CK_Core2:
2637 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002638 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002639 break;
2640 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002641 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002642 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002643 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002644 defineCPUMacros(Builder, "slm");
2645 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002646 case CK_Corei7:
2647 case CK_Corei7AVX:
2648 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002649 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002650 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002651 break;
Craig Topper449314e2013-08-20 07:09:39 +00002652 case CK_KNL:
2653 defineCPUMacros(Builder, "knl");
2654 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002655 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002656 Builder.defineMacro("__k6_2__");
2657 Builder.defineMacro("__tune_k6_2__");
2658 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002659 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002660 if (CPU != CK_K6_2) { // In case of fallthrough
2661 // FIXME: GCC may be enabling these in cases where some other k6
2662 // architecture is specified but -m3dnow is explicitly provided. The
2663 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002664 Builder.defineMacro("__k6_3__");
2665 Builder.defineMacro("__tune_k6_3__");
2666 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002667 // Fallthrough
2668 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002669 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002670 break;
2671 case CK_Athlon:
2672 case CK_AthlonThunderbird:
2673 case CK_Athlon4:
2674 case CK_AthlonXP:
2675 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002676 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002677 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002678 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002679 Builder.defineMacro("__tune_athlon_sse__");
2680 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002681 break;
2682 case CK_K8:
2683 case CK_K8SSE3:
2684 case CK_x86_64:
2685 case CK_Opteron:
2686 case CK_OpteronSSE3:
2687 case CK_Athlon64:
2688 case CK_Athlon64SSE3:
2689 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002690 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002691 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002692 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002693 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002694 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002695 case CK_BTVER1:
2696 defineCPUMacros(Builder, "btver1");
2697 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002698 case CK_BTVER2:
2699 defineCPUMacros(Builder, "btver2");
2700 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002701 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002702 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002703 break;
2704 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002705 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002706 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002707 case CK_BDVER3:
2708 defineCPUMacros(Builder, "bdver3");
2709 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002710 case CK_BDVER4:
2711 defineCPUMacros(Builder, "bdver4");
2712 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002713 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002714 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002715 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002716 }
Chris Lattner96e43572009-03-02 22:40:39 +00002717
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002718 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002719 Builder.defineMacro("__REGISTER_PREFIX__", "");
2720
Chris Lattner6df41af2009-04-19 17:32:33 +00002721 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2722 // functions in glibc header files that use FP Stack inline asm which the
2723 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002724 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002725
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002726 if (HasAES)
2727 Builder.defineMacro("__AES__");
2728
Craig Topper3f122a72012-05-31 05:18:48 +00002729 if (HasPCLMUL)
2730 Builder.defineMacro("__PCLMUL__");
2731
Craig Topper22967d42011-12-25 05:06:45 +00002732 if (HasLZCNT)
2733 Builder.defineMacro("__LZCNT__");
2734
Benjamin Kramer1e250392012-07-07 09:39:18 +00002735 if (HasRDRND)
2736 Builder.defineMacro("__RDRND__");
2737
Craig Topper22967d42011-12-25 05:06:45 +00002738 if (HasBMI)
2739 Builder.defineMacro("__BMI__");
2740
2741 if (HasBMI2)
2742 Builder.defineMacro("__BMI2__");
2743
Craig Topper1de83482011-12-29 16:10:46 +00002744 if (HasPOPCNT)
2745 Builder.defineMacro("__POPCNT__");
2746
Michael Liao625a8752012-11-10 05:17:46 +00002747 if (HasRTM)
2748 Builder.defineMacro("__RTM__");
2749
Michael Liao74f4eaf2013-03-26 17:52:08 +00002750 if (HasPRFCHW)
2751 Builder.defineMacro("__PRFCHW__");
2752
Michael Liaoffaae352013-03-29 05:17:55 +00002753 if (HasRDSEED)
2754 Builder.defineMacro("__RDSEED__");
2755
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002756 if (HasTBM)
2757 Builder.defineMacro("__TBM__");
2758
Rafael Espindolae62e2792013-08-20 13:44:29 +00002759 switch (XOPLevel) {
2760 case XOP:
2761 Builder.defineMacro("__XOP__");
2762 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002763 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002764 case SSE4A:
2765 Builder.defineMacro("__SSE4A__");
2766 case NoXOP:
2767 break;
2768 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002769
Craig Topperbba778b2012-06-03 21:46:30 +00002770 if (HasFMA)
2771 Builder.defineMacro("__FMA__");
2772
Manman Rena45358c2012-10-11 00:59:55 +00002773 if (HasF16C)
2774 Builder.defineMacro("__F16C__");
2775
Craig Topper679b53a2013-08-21 05:29:10 +00002776 if (HasAVX512CD)
2777 Builder.defineMacro("__AVX512CD__");
2778 if (HasAVX512ER)
2779 Builder.defineMacro("__AVX512ER__");
2780 if (HasAVX512PF)
2781 Builder.defineMacro("__AVX512PF__");
2782
Ben Langmuir58078d02013-09-19 13:22:04 +00002783 if (HasSHA)
2784 Builder.defineMacro("__SHA__");
2785
Nick Lewycky50e8f482013-10-05 20:14:27 +00002786 if (HasCX16)
2787 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2788
Chris Lattner96e43572009-03-02 22:40:39 +00002789 // Each case falls through to the previous one here.
2790 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002791 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002792 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002793 case AVX2:
2794 Builder.defineMacro("__AVX2__");
2795 case AVX:
2796 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002797 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002798 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002799 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002800 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002801 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002802 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002803 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002804 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002805 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002806 Builder.defineMacro("__SSE2__");
2807 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002808 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002809 Builder.defineMacro("__SSE__");
2810 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002811 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002812 break;
2813 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002814
Derek Schuffc7dd7222012-10-11 15:52:22 +00002815 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002816 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002817 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002818 case AVX2:
2819 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002820 case SSE42:
2821 case SSE41:
2822 case SSSE3:
2823 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002824 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002825 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002826 break;
2827 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002828 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002829 break;
2830 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002831 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002832 }
2833 }
2834
Anders Carlssone437c682010-01-27 03:47:49 +00002835 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002836 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002837 case AMD3DNowAthlon:
2838 Builder.defineMacro("__3dNOW_A__");
2839 case AMD3DNow:
2840 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002841 case MMX:
2842 Builder.defineMacro("__MMX__");
2843 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002844 break;
2845 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002846
2847 if (CPU >= CK_i486) {
2848 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2849 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2850 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2851 }
2852 if (CPU >= CK_i586)
2853 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002854}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002855
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002856bool X86TargetInfo::hasFeature(StringRef Feature) const {
2857 return llvm::StringSwitch<bool>(Feature)
2858 .Case("aes", HasAES)
2859 .Case("avx", SSELevel >= AVX)
2860 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002861 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002862 .Case("avx512cd", HasAVX512CD)
2863 .Case("avx512er", HasAVX512ER)
2864 .Case("avx512pf", HasAVX512PF)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002865 .Case("bmi", HasBMI)
2866 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002867 .Case("cx16", HasCX16)
2868 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002869 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002870 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002871 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002872 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002873 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002874 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2875 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2876 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002877 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002878 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002879 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002880 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002881 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002882 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002883 .Case("sse", SSELevel >= SSE1)
2884 .Case("sse2", SSELevel >= SSE2)
2885 .Case("sse3", SSELevel >= SSE3)
2886 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002887 .Case("sse4.1", SSELevel >= SSE41)
2888 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002889 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002890 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002891 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2892 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002893 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002894 .Default(false);
2895}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002896
Eli Friedman3fd920a2008-08-20 02:34:37 +00002897bool
Anders Carlsson58436352009-02-28 17:11:49 +00002898X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002899 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002900 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002901 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002902 case 'Y': // first letter of a pair:
2903 switch (*(Name+1)) {
2904 default: return false;
2905 case '0': // First SSE register.
2906 case 't': // Any SSE register, when SSE2 is enabled.
2907 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2908 case 'm': // any MMX register, when inter-unit moves enabled.
2909 break; // falls through to setAllowsRegister.
2910 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002911 case 'a': // eax.
2912 case 'b': // ebx.
2913 case 'c': // ecx.
2914 case 'd': // edx.
2915 case 'S': // esi.
2916 case 'D': // edi.
2917 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00002918 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002919 case 't': // top of floating point stack.
2920 case 'u': // second from top of floating point stack.
2921 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002922 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002923 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002924 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002925 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2926 case 'l': // "Index" registers: any general register that can be used as an
2927 // index in a base+index memory access.
2928 Info.setAllowsRegister();
2929 return true;
2930 case 'C': // SSE floating point constant.
2931 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002932 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002933 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002934 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002935 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002936 return true;
2937 }
2938}
2939
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002940
Eli Friedman3fd920a2008-08-20 02:34:37 +00002941std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002942X86TargetInfo::convertConstraint(const char *&Constraint) const {
2943 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002944 case 'a': return std::string("{ax}");
2945 case 'b': return std::string("{bx}");
2946 case 'c': return std::string("{cx}");
2947 case 'd': return std::string("{dx}");
2948 case 'S': return std::string("{si}");
2949 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002950 case 'p': // address
2951 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002952 case 't': // top of floating point stack.
2953 return std::string("{st}");
2954 case 'u': // second from top of floating point stack.
2955 return std::string("{st(1)}"); // second from top of floating point stack.
2956 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002957 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002958 }
2959}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002960} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002961
2962namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002963// X86-32 generic target
2964class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002965public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002966 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002967 DoubleAlign = LongLongAlign = 32;
2968 LongDoubleWidth = 96;
2969 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002970 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00002971 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002972 SizeType = UnsignedInt;
2973 PtrDiffType = SignedInt;
2974 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002975 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002976
2977 // Use fpret for all types.
2978 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2979 (1 << TargetInfo::Double) |
2980 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002981
2982 // x86-32 has atomics up to 8 bytes
2983 // FIXME: Check that we actually have cmpxchg8b before setting
2984 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2985 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002986 }
Craig Topper3164f332014-03-11 03:39:26 +00002987 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00002988 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002989 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002990
Craig Topper3164f332014-03-11 03:39:26 +00002991 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00002992 if (RegNo == 0) return 0;
2993 if (RegNo == 1) return 2;
2994 return -1;
2995 }
Craig Topper3164f332014-03-11 03:39:26 +00002996 bool validateInputSize(StringRef Constraint,
2997 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00002998 switch (Constraint[0]) {
2999 default: break;
3000 case 'a':
3001 case 'b':
3002 case 'c':
3003 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003004 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00003005 }
3006
3007 return true;
3008 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003009};
3010} // end anonymous namespace
3011
3012namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003013class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3014public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003015 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3016 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003017
Craig Topper3164f332014-03-11 03:39:26 +00003018 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003019 unsigned Major, Minor, Micro;
3020 getTriple().getOSVersion(Major, Minor, Micro);
3021 // New NetBSD uses the default rounding mode.
3022 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3023 return X86_32TargetInfo::getFloatEvalMethod();
3024 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003025 return 1;
3026 }
3027};
3028} // end anonymous namespace
3029
3030namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003031class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3032public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003033 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3034 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003035 SizeType = UnsignedLong;
3036 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003037 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003038 }
3039};
3040} // end anonymous namespace
3041
3042namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003043class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3044public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003045 BitrigI386TargetInfo(const llvm::Triple &Triple)
3046 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003047 SizeType = UnsignedLong;
3048 IntPtrType = SignedLong;
3049 PtrDiffType = SignedLong;
3050 }
3051};
3052} // end anonymous namespace
3053
3054namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003055class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003056public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003057 DarwinI386TargetInfo(const llvm::Triple &Triple)
3058 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003059 LongDoubleWidth = 128;
3060 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003061 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003062 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003063 SizeType = UnsignedLong;
3064 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003065 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003066 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003067 }
3068
Eli Friedman3fd920a2008-08-20 02:34:37 +00003069};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003070} // end anonymous namespace
3071
3072namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003073// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003074class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003075public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003076 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3077 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003078 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003079 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003080 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003081 }
Craig Topper3164f332014-03-11 03:39:26 +00003082 void getTargetDefines(const LangOptions &Opts,
3083 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003084 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3085 }
3086};
3087} // end anonymous namespace
3088
3089namespace {
3090
3091// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003092class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003093public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003094 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003095 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003096 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003097 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3098 }
Craig Topper3164f332014-03-11 03:39:26 +00003099 void getTargetDefines(const LangOptions &Opts,
3100 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003101 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3102 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3103 // The value of the following reflects processor type.
3104 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3105 // We lost the original triple, so we use the default.
3106 Builder.defineMacro("_M_IX86", "600");
3107 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003108};
3109} // end anonymous namespace
3110
Reid Kleckner47606832014-04-21 20:58:00 +00003111static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3112 Builder.defineMacro("__MSVCRT__");
3113 Builder.defineMacro("__MINGW32__");
3114
3115 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3116 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3117 // macro anyway for pre-processor compatibility.
3118 if (Opts.MicrosoftExt)
3119 Builder.defineMacro("__declspec", "__declspec");
3120 else
3121 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3122
3123 if (!Opts.MicrosoftExt) {
3124 // Provide macros for all the calling convention keywords. Provide both
3125 // single and double underscore prefixed variants. These are available on
3126 // x64 as well as x86, even though they have no effect.
3127 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3128 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003129 std::string GCCSpelling = "__attribute__((__";
3130 GCCSpelling += CC;
3131 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003132 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3133 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3134 }
3135 }
3136}
3137
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003138namespace {
3139// x86-32 MinGW target
3140class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3141public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003142 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3143 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003144 void getTargetDefines(const LangOptions &Opts,
3145 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003146 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003147 DefineStd(Builder, "WIN32", Opts);
3148 DefineStd(Builder, "WINNT", Opts);
3149 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003150 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003151 }
3152};
3153} // end anonymous namespace
3154
3155namespace {
3156// x86-32 Cygwin target
3157class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3158public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003159 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3160 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003161 TLSSupported = false;
3162 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003163 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003164 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003165 }
Craig Topper3164f332014-03-11 03:39:26 +00003166 void getTargetDefines(const LangOptions &Opts,
3167 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003168 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003169 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003170 Builder.defineMacro("__CYGWIN__");
3171 Builder.defineMacro("__CYGWIN32__");
3172 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003173 if (Opts.CPlusPlus)
3174 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003175 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003176};
3177} // end anonymous namespace
3178
3179namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003180// x86-32 Haiku target
3181class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3182public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003183 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003184 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003185 IntPtrType = SignedLong;
3186 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003187 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003188 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003189 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003190 }
Craig Topper3164f332014-03-11 03:39:26 +00003191 void getTargetDefines(const LangOptions &Opts,
3192 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003193 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3194 Builder.defineMacro("__INTEL__");
3195 Builder.defineMacro("__HAIKU__");
3196 }
3197};
3198} // end anonymous namespace
3199
Douglas Gregor9fabd852011-07-01 22:41:14 +00003200// RTEMS Target
3201template<typename Target>
3202class RTEMSTargetInfo : public OSTargetInfo<Target> {
3203protected:
Craig Topper3164f332014-03-11 03:39:26 +00003204 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3205 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003206 // RTEMS defines; list based off of gcc output
3207
Douglas Gregor9fabd852011-07-01 22:41:14 +00003208 Builder.defineMacro("__rtems__");
3209 Builder.defineMacro("__ELF__");
3210 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003211
Douglas Gregor9fabd852011-07-01 22:41:14 +00003212public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003213 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3214 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003215
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003216 switch (Triple.getArch()) {
3217 default:
3218 case llvm::Triple::x86:
3219 // this->MCountName = ".mcount";
3220 break;
3221 case llvm::Triple::mips:
3222 case llvm::Triple::mipsel:
3223 case llvm::Triple::ppc:
3224 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003225 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003226 // this->MCountName = "_mcount";
3227 break;
3228 case llvm::Triple::arm:
3229 // this->MCountName = "__mcount";
3230 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003231 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003232 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003233};
3234
3235namespace {
3236// x86-32 RTEMS target
3237class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3238public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003239 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003240 SizeType = UnsignedLong;
3241 IntPtrType = SignedLong;
3242 PtrDiffType = SignedLong;
3243 this->UserLabelPrefix = "";
3244 }
Craig Topper3164f332014-03-11 03:39:26 +00003245 void getTargetDefines(const LangOptions &Opts,
3246 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003247 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3248 Builder.defineMacro("__INTEL__");
3249 Builder.defineMacro("__rtems__");
3250 }
3251};
3252} // end anonymous namespace
3253
Chris Lattnerb986aba2010-04-11 19:29:39 +00003254namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003255// x86-64 generic target
3256class X86_64TargetInfo : public X86TargetInfo {
3257public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003258 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00003259 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003260 LongDoubleWidth = 128;
3261 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003262 LargeArrayMinWidth = 128;
3263 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003264 SuitableAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003265 IntMaxType = SignedLong;
3266 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003267 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003268 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003269
Rafael Espindolac418ae92014-01-03 19:22:05 +00003270 DescriptionString = "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003271
3272 // Use fpret only for long double.
3273 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003274
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003275 // Use fp2ret for _Complex long double.
3276 ComplexLongDoubleUsesFP2Ret = true;
3277
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003278 // x86-64 has atomics up to 16 bytes.
3279 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3280 // on CPUs with cmpxchg16b
3281 MaxAtomicPromoteWidth = 128;
3282 MaxAtomicInlineWidth = 64;
Chris Lattner10a5b382007-01-29 05:24:35 +00003283 }
Craig Topper3164f332014-03-11 03:39:26 +00003284 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003285 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003286 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003287
Craig Topper3164f332014-03-11 03:39:26 +00003288 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003289 if (RegNo == 0) return 0;
3290 if (RegNo == 1) return 1;
3291 return -1;
3292 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003293
Craig Topper3164f332014-03-11 03:39:26 +00003294 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003295 return (CC == CC_C ||
3296 CC == CC_IntelOclBicc ||
3297 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003298 }
3299
Craig Topper3164f332014-03-11 03:39:26 +00003300 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003301 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003302 }
3303
Eli Friedman3fd920a2008-08-20 02:34:37 +00003304};
3305} // end anonymous namespace
3306
3307namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003308// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003309class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003310public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003311 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3312 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003313 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003314 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003315 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003316 IntMaxType = SignedLongLong;
3317 UIntMaxType = UnsignedLongLong;
3318 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003319 SizeType = UnsignedLongLong;
3320 PtrDiffType = SignedLongLong;
3321 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003322 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003323 }
Craig Topper3164f332014-03-11 03:39:26 +00003324 void getTargetDefines(const LangOptions &Opts,
3325 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003326 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003327 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003328 }
Craig Topper3164f332014-03-11 03:39:26 +00003329 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003330 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003331 }
Craig Topper3164f332014-03-11 03:39:26 +00003332 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003333 return (CC == CC_C ||
3334 CC == CC_IntelOclBicc ||
3335 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3336 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003337};
3338} // end anonymous namespace
3339
3340namespace {
3341// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003342class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003343public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003344 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003345 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003346 LongDoubleWidth = LongDoubleAlign = 64;
3347 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003348 }
Craig Topper3164f332014-03-11 03:39:26 +00003349 void getTargetDefines(const LangOptions &Opts,
3350 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003351 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3352 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003353 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003354 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003355 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003356};
3357} // end anonymous namespace
3358
3359namespace {
3360// x86-64 MinGW target
3361class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3362public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003363 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3364 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003365 void getTargetDefines(const LangOptions &Opts,
3366 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003367 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003368 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003369 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003370 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003371 }
3372};
3373} // end anonymous namespace
3374
3375namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003376class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3377public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003378 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3379 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003380 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003381 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003382 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3383 llvm::Triple T = llvm::Triple(Triple);
3384 if (T.getOS() == llvm::Triple::IOS)
3385 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003386 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003387 }
3388};
3389} // end anonymous namespace
3390
3391namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003392class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3393public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003394 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3395 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003396 IntMaxType = SignedLongLong;
3397 UIntMaxType = UnsignedLongLong;
3398 Int64Type = SignedLongLong;
3399 }
3400};
3401} // end anonymous namespace
3402
3403namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003404class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3405public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003406 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3407 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3408 IntMaxType = SignedLongLong;
3409 UIntMaxType = UnsignedLongLong;
3410 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003411 }
3412};
Tim Northover9bb857a2013-01-31 12:13:10 +00003413}
3414
Eli Friedman9fa28852012-08-08 23:57:20 +00003415
3416namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003417class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003418 // Possible FPU choices.
3419 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003420 VFP2FPU = (1 << 0),
3421 VFP3FPU = (1 << 1),
3422 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003423 NeonFPU = (1 << 3),
3424 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003425 };
3426
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003427 // Possible HWDiv features.
3428 enum HWDivMode {
3429 HWDivThumb = (1 << 0),
3430 HWDivARM = (1 << 1)
3431 };
3432
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003433 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003434 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003435 }
3436
3437 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3438 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003439
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003440 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003441
Rafael Espindolaeb265472013-08-21 21:59:03 +00003442 enum {
3443 FP_Default,
3444 FP_VFP,
3445 FP_Neon
3446 } FPMath;
3447
Bernard Ogdenda13af32013-10-24 18:32:51 +00003448 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003449
Logan Chien57086ce2012-10-10 06:56:20 +00003450 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003451 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003452 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003453
3454 // Initialized via features.
3455 unsigned SoftFloat : 1;
3456 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003457
Bernard Ogden18b57012013-10-29 09:47:51 +00003458 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003459 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003460
Chris Lattner5cc15e02010-03-03 19:03:45 +00003461 static const Builtin::Info BuiltinInfo[];
3462
Rafael Espindola101d5b92013-05-13 20:09:47 +00003463 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003464 if (T.isOSWindows())
3465 return true;
3466
Rafael Espindola101d5b92013-05-13 20:09:47 +00003467 // On linux, binaries targeting old cpus call functions in libgcc to
3468 // perform atomic operations. The implementation in libgcc then calls into
3469 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3470 // is that if we assume the kernel is at least as recent as the hardware,
3471 // it is safe to use atomic instructions on armv6 and newer.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003472 if (!T.isOSLinux() &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003473 T.getOS() != llvm::Triple::FreeBSD &&
Joerg Sonnenbergerfbd51be2013-12-02 16:12:05 +00003474 T.getOS() != llvm::Triple::NetBSD &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003475 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten60afa2d2013-06-15 09:40:14 +00003476 return false;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003477 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003478 if (T.getArch() == llvm::Triple::arm ||
3479 T.getArch() == llvm::Triple::armeb) {
3480 StringRef VersionStr;
3481 if (ArchName.startswith("armv"))
3482 VersionStr = ArchName.substr(4);
3483 else if (ArchName.startswith("armebv"))
3484 VersionStr = ArchName.substr(6);
3485 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003486 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003487 unsigned Version;
3488 if (VersionStr.getAsInteger(10, Version))
3489 return false;
3490 return Version >= 6;
3491 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003492 assert(T.getArch() == llvm::Triple::thumb ||
3493 T.getArch() == llvm::Triple::thumbeb);
3494 StringRef VersionStr;
3495 if (ArchName.startswith("thumbv"))
3496 VersionStr = ArchName.substr(6);
3497 else if (ArchName.startswith("thumbebv"))
3498 VersionStr = ArchName.substr(8);
3499 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003500 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003501 unsigned Version;
3502 if (VersionStr.getAsInteger(10, Version))
3503 return false;
3504 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003505 }
3506
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003507 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003508 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003509
3510 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003511 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003512
Joerg Sonnenbergerf19dc302014-01-26 20:02:03 +00003513 // size_t is unsigned long on Darwin and NetBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003514 if (T.isOSDarwin() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003515 SizeType = UnsignedLong;
3516 else
3517 SizeType = UnsignedInt;
3518
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003519 switch (T.getOS()) {
3520 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003521 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003522 break;
3523 case llvm::Triple::Win32:
3524 WCharType = UnsignedShort;
3525 break;
3526 case llvm::Triple::Linux:
3527 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003528 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3529 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003530 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003531 }
3532
3533 UseBitFieldTypeAlignment = true;
3534
3535 ZeroLengthBitfieldBoundary = 0;
3536
3537 if (IsThumb) {
3538 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3539 // so set preferred for small types to 32.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003540 if (T.isOSBinFormatMachO()) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003541 DescriptionString = BigEndian ?
3542 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3543 "v128:64:128-a:0:32-n32-S64" :
3544 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3545 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003546 } else if (T.isOSWindows()) {
3547 // FIXME: this is invalid for WindowsCE
3548 assert(!BigEndian && "Windows on ARM does not support big endian");
3549 DescriptionString = "e"
3550 "-m:e"
3551 "-p:32:32"
3552 "-i1:8:32-i8:8:32-i16:16:32-i64:64"
3553 "-v128:64:128"
3554 "-a:0:32"
3555 "-n32"
3556 "-S64";
3557 } else {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003558 DescriptionString = BigEndian ?
3559 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3560 "v128:64:128-a:0:32-n32-S64" :
3561 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3562 "v128:64:128-a:0:32-n32-S64";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003563 }
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003564 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003565 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003566 DescriptionString = BigEndian ?
3567 "E-m:o-p:32:32-i64:64-v128:64:128-n32-S64" :
3568 "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003569 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003570 DescriptionString = BigEndian ?
3571 "E-m:e-p:32:32-i64:64-v128:64:128-n32-S64" :
3572 "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003573 }
3574
3575 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003576 }
3577
3578 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003579 const llvm::Triple &T = getTriple();
3580
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003581 IsAAPCS = false;
3582
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003583 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003584
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003585 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003586 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003587 SizeType = UnsignedInt;
3588 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003589 SizeType = UnsignedLong;
3590
3591 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3592 WCharType = SignedInt;
3593
3594 // Do not respect the alignment of bit-field types when laying out
3595 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3596 UseBitFieldTypeAlignment = false;
3597
3598 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3599 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3600 /// gcc.
3601 ZeroLengthBitfieldBoundary = 32;
3602
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003603 if (IsThumb) {
3604 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3605 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003606 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003607 DescriptionString = BigEndian ?
3608 "E-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3609 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3610 "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3611 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolac418ae92014-01-03 19:22:05 +00003612 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003613 DescriptionString = BigEndian ?
3614 "E-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3615 "-v64:32:64-v128:32:128-a:0:32-n32-S32" :
3616 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3617 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003618 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003619 if (T.isOSBinFormatMachO())
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003620 DescriptionString = BigEndian ?
3621 "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" :
Rafael Espindolac418ae92014-01-03 19:22:05 +00003622 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3623 else
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003624 DescriptionString = BigEndian ?
3625 "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32" :
Rafael Espindolac418ae92014-01-03 19:22:05 +00003626 "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003627 }
3628
3629 // FIXME: Override "preferred align" for double and long long.
3630 }
3631
Chris Lattner17df24e2008-04-21 18:56:49 +00003632public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003633 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003634 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3635 IsAAPCS(true) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003636 BigEndian = IsBigEndian;
3637
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003638 switch (getTriple().getOS()) {
3639 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003640 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003641 break;
3642 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003643 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003644 break;
3645 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003646
Chris Lattner1a8f3942010-04-23 16:29:58 +00003647 // {} in inline assembly are neon specifiers, not assembly variant
3648 // specifiers.
3649 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003650
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003651 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003652 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003653
3654 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003655
3656 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003657 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003658
3659 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003660 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003661 if (shouldUseInlineAtomic(getTriple()))
3662 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003663
3664 // Do force alignment of members that follow zero length bitfields. If
3665 // the alignment of the zero-length bitfield is greater than the member
3666 // that follows it, `bar', `bar' will be aligned as the type of the
3667 // zero length bitfield.
3668 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003669 }
Alp Toker4925ba72014-06-07 23:30:42 +00003670 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003671 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003672 ABI = Name;
3673
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003674 // The defaults (above) are for AAPCS, check if we need to change them.
3675 //
3676 // FIXME: We need support for -meabi... we could just mangle it into the
3677 // name.
3678 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003679 setABIAPCS();
3680 return true;
3681 }
3682 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3683 setABIAAPCS();
3684 return true;
3685 }
3686 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003687 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003688
Craig Topper3164f332014-03-11 03:39:26 +00003689 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003690 if (IsAAPCS)
3691 Features["aapcs"] = true;
3692 else
3693 Features["apcs"] = true;
3694
Silviu Barangae5690462013-10-21 10:59:33 +00003695 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003696 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3697 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003698 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3699 CPU == "cortex-a9-mp") {
3700 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003701 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003702 }
3703 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003704 Features["vfp4"] = true;
3705 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003706 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3707 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3708 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003709 Features["vfp4"] = true;
3710 Features["neon"] = true;
3711 Features["hwdiv"] = true;
3712 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003713 } else if (CPU == "cyclone") {
3714 Features["v8fp"] = true;
3715 Features["neon"] = true;
3716 Features["hwdiv"] = true;
3717 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003718 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3719 Features["fp-armv8"] = true;
3720 Features["neon"] = true;
3721 Features["hwdiv"] = true;
3722 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003723 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003724 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003725 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003726 // Enable the hwdiv extension for all v8a AArch32 cores by
3727 // default.
3728 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003729 ArchName == "armebv8a" || ArchName == "armebv8" ||
3730 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3731 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00003732 Features["hwdiv"] = true;
3733 Features["hwdiv-arm"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003734 } else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
3735 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003736 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003737 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003738
Craig Topper3164f332014-03-11 03:39:26 +00003739 bool handleTargetFeatures(std::vector<std::string> &Features,
3740 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003741 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003742 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003743 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003744 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003745 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003746 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3747 if (Features[i] == "+soft-float")
3748 SoftFloat = true;
3749 else if (Features[i] == "+soft-float-abi")
3750 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003751 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003752 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003753 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003754 FPU |= VFP3FPU;
3755 else if (Features[i] == "+vfp4")
3756 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003757 else if (Features[i] == "+fp-armv8")
3758 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003759 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003760 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003761 else if (Features[i] == "+hwdiv")
3762 HWDiv |= HWDivThumb;
3763 else if (Features[i] == "+hwdiv-arm")
3764 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00003765 else if (Features[i] == "+crc")
3766 CRC = 1;
Tim Northover02e38602014-02-03 17:28:04 +00003767 else if (Features[i] == "+crypto")
3768 Crypto = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003769 }
3770
Rafael Espindolaeb265472013-08-21 21:59:03 +00003771 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3772 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3773 return false;
3774 }
3775
3776 if (FPMath == FP_Neon)
3777 Features.push_back("+neonfp");
3778 else if (FPMath == FP_VFP)
3779 Features.push_back("-neonfp");
3780
Daniel Dunbar893d4752009-12-19 04:15:38 +00003781 // Remove front-end specific options which the backend handles differently.
3782 std::vector<std::string>::iterator it;
3783 it = std::find(Features.begin(), Features.end(), "+soft-float");
3784 if (it != Features.end())
3785 Features.erase(it);
3786 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3787 if (it != Features.end())
3788 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00003789 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003790 }
3791
Craig Topper3164f332014-03-11 03:39:26 +00003792 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003793 return llvm::StringSwitch<bool>(Feature)
3794 .Case("arm", true)
3795 .Case("softfloat", SoftFloat)
3796 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003797 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003798 .Case("hwdiv", HWDiv & HWDivThumb)
3799 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003800 .Default(false);
3801 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003802 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003803 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003804 return llvm::StringSwitch<const char*>(Name)
3805 .Cases("arm8", "arm810", "4")
3806 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3807 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3808 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3809 .Case("ep9312", "4T")
3810 .Cases("arm10tdmi", "arm1020t", "5T")
3811 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3812 .Case("arm926ej-s", "5TEJ")
3813 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3814 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003815 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003816 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003817 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003818 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00003819 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003820 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003821 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003822 .Case("swift", "7S")
Tim Northovera2ee4332014-03-29 15:09:45 +00003823 .Case("cyclone", "8A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003824 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003825 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003826 .Cases("cortex-a53", "cortex-a57", "8A")
Craig Topperf1186c52014-05-08 06:41:40 +00003827 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003828 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003829 static const char *getCPUProfile(StringRef Name) {
3830 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003831 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003832 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003833 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003834 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00003835 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00003836 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003837 }
Craig Topper3164f332014-03-11 03:39:26 +00003838 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003839 if (!getCPUDefineSuffix(Name))
3840 return false;
3841
3842 CPU = Name;
3843 return true;
3844 }
Craig Topper3164f332014-03-11 03:39:26 +00003845 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003846 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
3847 unsigned CPUArchVer) const {
3848 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
3849 (CPUArch.find('M') != StringRef::npos);
3850 }
3851 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
3852 unsigned CPUArchVer) const {
3853 // We check both CPUArchVer and ArchName because when only triple is
3854 // specified, the default CPU is arm1136j-s.
3855 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
3856 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
3857 }
Craig Topper3164f332014-03-11 03:39:26 +00003858 void getTargetDefines(const LangOptions &Opts,
3859 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00003860 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003861 Builder.defineMacro("__arm");
3862 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003863
Chris Lattnerecd49032009-03-02 22:27:17 +00003864 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003865 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003866
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003867 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003868 unsigned int CPUArchVer;
3869 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
3870 llvm_unreachable("Invalid char for architecture version number");
3871 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003872 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003873
3874 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003875 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003876 StringRef ArchName = getTriple().getArchName();
3877
3878 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
3879 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
3880
3881 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
3882 // is not defined for the M-profile.
3883 // NOTE that the deffault profile is assumed to be 'A'
3884 if (CPUProfile.empty() || CPUProfile != "M")
3885 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
3886
3887 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
3888 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
3889 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
3890 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
3891 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
3892 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
3893 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
3894
3895 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
3896 // instruction set such as ARM or Thumb.
3897 Builder.defineMacro("__ARM_32BIT_STATE", "1");
3898
3899 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
3900
3901 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003902 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003903 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00003904
Mike Stump9d54bd72009-04-08 02:07:04 +00003905 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003906
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003907 // FIXME: It's more complicated than this and we don't really support
3908 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003909 // Windows on ARM does not "support" interworking
3910 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003911 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003912
David Tweed8f676532012-10-25 13:33:01 +00003913 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00003914 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003915 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
3916 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00003917 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003918 Builder.defineMacro("__ARM_PCS", "1");
3919
David Tweed8f676532012-10-25 13:33:01 +00003920 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003921 Builder.defineMacro("__ARM_PCS_VFP", "1");
3922 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003923
Daniel Dunbar893d4752009-12-19 04:15:38 +00003924 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003925 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003926
3927 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003928 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003929
3930 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003931 Builder.defineMacro("__THUMBEL__");
3932 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00003933 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003934 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003935 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003936 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
3937 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003938
3939 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003940 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003941
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003942 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003943 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003944 if (FPU & VFP2FPU)
3945 Builder.defineMacro("__ARM_VFPV2__");
3946 if (FPU & VFP3FPU)
3947 Builder.defineMacro("__ARM_VFPV3__");
3948 if (FPU & VFP4FPU)
3949 Builder.defineMacro("__ARM_VFPV4__");
3950 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00003951
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003952 // This only gets set when Neon instructions are actually available, unlike
3953 // the VFP define, hence the soft float and arch check. This is subtly
3954 // different from gcc, we follow the intent which was that it should be set
3955 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00003956 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
3957 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003958 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00003959 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00003960
Bradley Smith0f28f0c2014-01-20 10:52:00 +00003961 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
3962 Opts.ShortWChar ? "2" : "4");
3963
3964 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
3965 Opts.ShortEnums ? "1" : "4");
3966
Bernard Ogden18b57012013-10-29 09:47:51 +00003967 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00003968 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00003969
Tim Northover02e38602014-02-03 17:28:04 +00003970 if (Crypto)
3971 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
3972
Bernard Ogden58a05cf2013-10-24 18:32:44 +00003973 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00003974 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3975 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3976 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3977 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
3978 }
Chris Lattner17df24e2008-04-21 18:56:49 +00003979 }
Craig Topper3164f332014-03-11 03:39:26 +00003980 void getTargetBuiltins(const Builtin::Info *&Records,
3981 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00003982 Records = BuiltinInfo;
3983 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00003984 }
Craig Topper3164f332014-03-11 03:39:26 +00003985 bool isCLZForZeroUndef() const override { return false; }
3986 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00003987 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00003988 }
Craig Topper3164f332014-03-11 03:39:26 +00003989 void getGCCRegNames(const char * const *&Names,
3990 unsigned &NumNames) const override;
3991 void getGCCRegAliases(const GCCRegAlias *&Aliases,
3992 unsigned &NumAliases) const override;
3993 bool validateAsmConstraint(const char *&Name,
3994 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00003995 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00003996 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00003997 case 'l': // r0-r7
3998 case 'h': // r8-r15
3999 case 'w': // VFP Floating point register single precision
4000 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004001 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004002 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004003 case 'Q': // A memory address that is a single base register.
4004 Info.setAllowsMemory();
4005 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004006 case 'U': // a memory reference...
4007 switch (Name[1]) {
4008 case 'q': // ...ARMV4 ldrsb
4009 case 'v': // ...VFP load/store (reg+constant offset)
4010 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004011 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004012 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004013 case 'n': // valid address for Neon doubleword vector load/store
4014 case 'm': // valid address for Neon element and structure load/store
4015 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004016 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004017 Info.setAllowsMemory();
4018 Name++;
4019 return true;
4020 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004021 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004022 return false;
4023 }
Craig Topper3164f332014-03-11 03:39:26 +00004024 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004025 std::string R;
4026 switch (*Constraint) {
4027 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004028 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004029 Constraint++;
4030 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004031 case 'p': // 'p' should be translated to 'r' by default.
4032 R = std::string("r");
4033 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004034 default:
4035 return std::string(1, *Constraint);
4036 }
4037 return R;
4038 }
Craig Topper3164f332014-03-11 03:39:26 +00004039 bool validateConstraintModifier(StringRef Constraint, const char Modifier,
4040 unsigned Size) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004041 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004042 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004043
Bill Wendling9d1ee112012-10-25 23:28:48 +00004044 // Strip off constraint modifiers.
4045 while (Constraint[0] == '=' ||
4046 Constraint[0] == '+' ||
4047 Constraint[0] == '&')
4048 Constraint = Constraint.substr(1);
4049
4050 switch (Constraint[0]) {
4051 default: break;
4052 case 'r': {
4053 switch (Modifier) {
4054 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004055 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004056 case 'q':
4057 // A register of size 32 cannot fit a vector type.
4058 return false;
4059 }
4060 }
4061 }
4062
4063 return true;
4064 }
Craig Topper3164f332014-03-11 03:39:26 +00004065 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004066 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004067 return "";
4068 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004069
Craig Topper3164f332014-03-11 03:39:26 +00004070 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004071 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4072 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004073
Craig Topper3164f332014-03-11 03:39:26 +00004074 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004075 if (RegNo == 0) return 0;
4076 if (RegNo == 1) return 1;
4077 return -1;
4078 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004079};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004080
Rafael Espindolaeb265472013-08-21 21:59:03 +00004081bool ARMTargetInfo::setFPMath(StringRef Name) {
4082 if (Name == "neon") {
4083 FPMath = FP_Neon;
4084 return true;
4085 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4086 Name == "vfp4") {
4087 FPMath = FP_VFP;
4088 return true;
4089 }
4090 return false;
4091}
4092
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004093const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004094 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004095 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004096 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4097
4098 // Float registers
4099 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4100 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4101 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004102 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004103
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004104 // Double registers
4105 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4106 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004107 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4108 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004109
4110 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004111 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4112 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004113};
4114
4115void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004116 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004117 Names = GCCRegNames;
4118 NumNames = llvm::array_lengthof(GCCRegNames);
4119}
4120
4121const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004122 { { "a1" }, "r0" },
4123 { { "a2" }, "r1" },
4124 { { "a3" }, "r2" },
4125 { { "a4" }, "r3" },
4126 { { "v1" }, "r4" },
4127 { { "v2" }, "r5" },
4128 { { "v3" }, "r6" },
4129 { { "v4" }, "r7" },
4130 { { "v5" }, "r8" },
4131 { { "v6", "rfp" }, "r9" },
4132 { { "sl" }, "r10" },
4133 { { "fp" }, "r11" },
4134 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004135 { { "r13" }, "sp" },
4136 { { "r14" }, "lr" },
4137 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004138 // The S, D and Q registers overlap, but aren't really aliases; we
4139 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004140};
4141
4142void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4143 unsigned &NumAliases) const {
4144 Aliases = GCCRegAliases;
4145 NumAliases = llvm::array_lengthof(GCCRegAliases);
4146}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004147
4148const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004149#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004150#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004151 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004152#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004153
4154#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4155#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4156 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004157#include "clang/Basic/BuiltinsARM.def"
4158};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004159
4160class ARMleTargetInfo : public ARMTargetInfo {
4161public:
4162 ARMleTargetInfo(const llvm::Triple &Triple)
4163 : ARMTargetInfo(Triple, false) { }
4164 virtual void getTargetDefines(const LangOptions &Opts,
4165 MacroBuilder &Builder) const {
4166 Builder.defineMacro("__ARMEL__");
4167 ARMTargetInfo::getTargetDefines(Opts, Builder);
4168 }
4169};
4170
4171class ARMbeTargetInfo : public ARMTargetInfo {
4172public:
4173 ARMbeTargetInfo(const llvm::Triple &Triple)
4174 : ARMTargetInfo(Triple, true) { }
4175 virtual void getTargetDefines(const LangOptions &Opts,
4176 MacroBuilder &Builder) const {
4177 Builder.defineMacro("__ARMEB__");
4178 Builder.defineMacro("__ARM_BIG_ENDIAN");
4179 ARMTargetInfo::getTargetDefines(Opts, Builder);
4180 }
4181};
Chris Lattner17df24e2008-04-21 18:56:49 +00004182} // end anonymous namespace.
4183
Eli Friedmanf05b7722008-08-20 07:44:10 +00004184namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004185class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4186 const llvm::Triple Triple;
4187public:
4188 WindowsARMTargetInfo(const llvm::Triple &Triple)
4189 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4190 TLSSupported = false;
4191 WCharType = UnsignedShort;
4192 SizeType = UnsignedInt;
4193 UserLabelPrefix = "";
4194 }
4195 void getVisualStudioDefines(const LangOptions &Opts,
4196 MacroBuilder &Builder) const {
4197 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4198
4199 // FIXME: this is invalid for WindowsCE
4200 Builder.defineMacro("_M_ARM_NT", "1");
4201 Builder.defineMacro("_M_ARMT", "_M_ARM");
4202 Builder.defineMacro("_M_THUMB", "_M_ARM");
4203
4204 assert((Triple.getArch() == llvm::Triple::arm ||
4205 Triple.getArch() == llvm::Triple::thumb) &&
4206 "invalid architecture for Windows ARM target info");
4207 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4208 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4209
4210 // TODO map the complete set of values
4211 // 31: VFPv3 40: VFPv4
4212 Builder.defineMacro("_M_ARM_FP", "31");
4213 }
4214};
4215
4216// Windows ARM + Itanium C++ ABI Target
4217class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4218public:
4219 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4220 : WindowsARMTargetInfo(Triple) {
4221 TheCXXABI.set(TargetCXXABI::GenericARM);
4222 }
4223
4224 void getTargetDefines(const LangOptions &Opts,
4225 MacroBuilder &Builder) const override {
4226 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4227
4228 if (Opts.MSVCCompat)
4229 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4230 }
4231};
4232
4233// Windows ARM, MS (C++) ABI
4234class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4235public:
4236 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4237 : WindowsARMTargetInfo(Triple) {
4238 TheCXXABI.set(TargetCXXABI::Microsoft);
4239 }
4240
4241 void getTargetDefines(const LangOptions &Opts,
4242 MacroBuilder &Builder) const override {
4243 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4244 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4245 }
4246};
4247}
4248
4249
4250namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004251class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004252 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004253protected:
Craig Topper3164f332014-03-11 03:39:26 +00004254 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4255 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004256 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004257 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004258
Torok Edwinb2b37c62009-06-30 17:10:35 +00004259public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004260 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004261 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004262 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004263 // iOS always has 64-bit atomic instructions.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004264 // FIXME: This should be based off of the target features in ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004265 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004266
4267 // Darwin on iOS uses a variant of the ARM C++ ABI.
4268 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004269 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004270};
4271} // end anonymous namespace.
4272
Tony Linthicum76329bf2011-12-12 21:14:55 +00004273
4274namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004275class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004276 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004277 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4278 static const char *const GCCRegNames[];
4279
James Molloy75f5f9e2014-04-16 15:33:48 +00004280 enum FPUModeEnum {
4281 FPUMode,
4282 NeonMode
4283 };
4284
Kevin Qinafd88472014-06-11 01:42:16 +00004285 std::string CPU;
James Molloy75f5f9e2014-04-16 15:33:48 +00004286 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004287 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004288 unsigned Crypto;
4289
Tim Northovera2ee4332014-03-29 15:09:45 +00004290 static const Builtin::Info BuiltinInfo[];
4291
4292 std::string ABI;
4293
4294public:
Tim Northover573cbee2014-05-24 12:52:07 +00004295 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004296 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004297
4298 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4299 WCharType = SignedInt;
4300
4301 // NetBSD apparently prefers consistency across ARM targets to consistency
4302 // across 64-bit targets.
4303 Int64Type = SignedLongLong;
4304 IntMaxType = SignedLongLong;
4305 UIntMaxType = UnsignedLongLong;
4306 } else {
4307 WCharType = UnsignedInt;
4308 Int64Type = SignedLong;
4309 IntMaxType = SignedLong;
4310 UIntMaxType = UnsignedLong;
4311 }
4312
Tim Northovera2ee4332014-03-29 15:09:45 +00004313 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004314 MaxVectorAlign = 128;
4315 RegParmMax = 8;
4316 MaxAtomicInlineWidth = 128;
4317 MaxAtomicPromoteWidth = 128;
4318
4319 LongDoubleWidth = LongDoubleAlign = 128;
4320 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4321
Tim Northovera2ee4332014-03-29 15:09:45 +00004322 // {} in inline assembly are neon specifiers, not assembly variant
4323 // specifiers.
4324 NoAsmVariants = true;
4325
Tim Northover573cbee2014-05-24 12:52:07 +00004326 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004327 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4328 }
4329
Alp Toker4925ba72014-06-07 23:30:42 +00004330 StringRef getABI() const override { return ABI; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004331 virtual bool setABI(const std::string &Name) {
4332 if (Name != "aapcs" && Name != "darwinpcs")
4333 return false;
4334
4335 ABI = Name;
4336 return true;
4337 }
4338
4339 virtual bool setCPU(const std::string &Name) {
4340 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004341 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004342 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004343 .Case("cyclone", true)
4344 .Default(false);
Kevin Qinafd88472014-06-11 01:42:16 +00004345 if (CPUKnown)
4346 CPU = Name;
Tim Northovera2ee4332014-03-29 15:09:45 +00004347 return CPUKnown;
4348 }
4349
4350 virtual void getTargetDefines(const LangOptions &Opts,
4351 MacroBuilder &Builder) const {
4352 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004353 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004354
4355 // Target properties.
4356 Builder.defineMacro("_LP64");
4357 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004358
4359 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4360 Builder.defineMacro("__ARM_ACLE", "200");
4361 Builder.defineMacro("__ARM_ARCH", "8");
4362 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4363
4364 Builder.defineMacro("__ARM_64BIT_STATE");
4365 Builder.defineMacro("__ARM_PCS_AAPCS64");
4366 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4367
4368 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4369 Builder.defineMacro("__ARM_FEATURE_CLZ");
4370 Builder.defineMacro("__ARM_FEATURE_FMA");
4371 Builder.defineMacro("__ARM_FEATURE_DIV");
4372
4373 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4374
4375 // 0xe implies support for half, single and double precision operations.
4376 Builder.defineMacro("__ARM_FP", "0xe");
4377
4378 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4379 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4380 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4381
4382 if (Opts.FastMath || Opts.FiniteMathOnly)
4383 Builder.defineMacro("__ARM_FP_FAST");
4384
4385 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
4386 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4387
4388 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4389
4390 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4391 Opts.ShortEnums ? "1" : "4");
4392
James Molloy75f5f9e2014-04-16 15:33:48 +00004393 if (FPU == NeonMode) {
4394 Builder.defineMacro("__ARM_NEON");
4395 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004396 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004397 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004398
Bradley Smith418c5932014-05-02 15:17:51 +00004399 if (CRC)
4400 Builder.defineMacro("__ARM_FEATURE_CRC32");
4401
James Molloy75f5f9e2014-04-16 15:33:48 +00004402 if (Crypto)
4403 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004404 }
4405
4406 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4407 unsigned &NumRecords) const {
4408 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004409 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004410 }
4411
4412 virtual bool hasFeature(StringRef Feature) const {
James Molloy75f5f9e2014-04-16 15:33:48 +00004413 return Feature == "aarch64" ||
4414 Feature == "arm64" ||
4415 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004416 }
4417
Kevin Qinafd88472014-06-11 01:42:16 +00004418 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
4419
4420 if (CPU == "cyclone") {
4421 Features["fp-armv8"] = true;
4422 Features["neon"] = true;
4423 Features["crypto"] = true;
4424 Features["crc"] = true;
4425 Features["zcm"] = true;
4426 Features["zcz"] = true;
4427 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
4428 Features["fp-armv8"] = true;
4429 Features["neon"] = true;
4430 Features["crypto"] = true;
4431 Features["crc"] = true;
4432 }
4433}
4434
James Molloy5e73df52014-04-16 15:06:20 +00004435 bool handleTargetFeatures(std::vector<std::string> &Features,
4436 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004437 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004438 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004439 Crypto = 0;
4440 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4441 if (Features[i] == "+neon")
4442 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004443 if (Features[i] == "+crc")
4444 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004445 if (Features[i] == "+crypto")
4446 Crypto = 1;
4447 }
4448
James Molloy5e73df52014-04-16 15:06:20 +00004449 setDescriptionString();
4450
4451 return true;
4452 }
4453
Tim Northovera2ee4332014-03-29 15:09:45 +00004454 virtual bool isCLZForZeroUndef() const { return false; }
4455
4456 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4457 return TargetInfo::AArch64ABIBuiltinVaList;
4458 }
4459
4460 virtual void getGCCRegNames(const char *const *&Names,
4461 unsigned &NumNames) const;
4462 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4463 unsigned &NumAliases) const;
4464
4465 virtual bool validateAsmConstraint(const char *&Name,
4466 TargetInfo::ConstraintInfo &Info) const {
4467 switch (*Name) {
4468 default:
4469 return false;
4470 case 'w': // Floating point and SIMD registers (V0-V31)
4471 Info.setAllowsRegister();
4472 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004473 case 'I': // Constant that can be used with an ADD instruction
4474 case 'J': // Constant that can be used with a SUB instruction
4475 case 'K': // Constant that can be used with a 32-bit logical instruction
4476 case 'L': // Constant that can be used with a 64-bit logical instruction
4477 case 'M': // Constant that can be used as a 32-bit MOV immediate
4478 case 'N': // Constant that can be used as a 64-bit MOV immediate
4479 case 'Y': // Floating point constant zero
4480 case 'Z': // Integer constant zero
4481 return true;
4482 case 'Q': // A memory reference with base register and no offset
4483 Info.setAllowsMemory();
4484 return true;
4485 case 'S': // A symbolic address
4486 Info.setAllowsRegister();
4487 return true;
4488 case 'U':
4489 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
4490 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
4491 // Usa: An absolute symbolic address
4492 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
4493 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
Tim Northovera2ee4332014-03-29 15:09:45 +00004494 case 'z': // Zero register, wzr or xzr
4495 Info.setAllowsRegister();
4496 return true;
4497 case 'x': // Floating point and SIMD registers (V0-V15)
4498 Info.setAllowsRegister();
4499 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004500 }
4501 return false;
4502 }
4503
Tim Northovera2ee4332014-03-29 15:09:45 +00004504 virtual const char *getClobbers() const { return ""; }
4505
4506 int getEHDataRegisterNumber(unsigned RegNo) const {
4507 if (RegNo == 0)
4508 return 0;
4509 if (RegNo == 1)
4510 return 1;
4511 return -1;
4512 }
4513};
4514
Tim Northover573cbee2014-05-24 12:52:07 +00004515const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004516 // 32-bit Integer registers
4517 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4518 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4519 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4520
4521 // 64-bit Integer registers
4522 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4523 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4524 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4525
4526 // 32-bit floating point regsisters
4527 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4528 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4529 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4530
4531 // 64-bit floating point regsisters
4532 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4533 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4534 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4535
4536 // Vector registers
4537 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4538 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4539 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4540};
4541
Tim Northover573cbee2014-05-24 12:52:07 +00004542void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004543 unsigned &NumNames) const {
4544 Names = GCCRegNames;
4545 NumNames = llvm::array_lengthof(GCCRegNames);
4546}
4547
Tim Northover573cbee2014-05-24 12:52:07 +00004548const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004549 { { "w31" }, "wsp" },
4550 { { "x29" }, "fp" },
4551 { { "x30" }, "lr" },
4552 { { "x31" }, "sp" },
4553 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4554 // don't want to substitute one of these for a different-sized one.
4555};
4556
Tim Northover573cbee2014-05-24 12:52:07 +00004557void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004558 unsigned &NumAliases) const {
4559 Aliases = GCCRegAliases;
4560 NumAliases = llvm::array_lengthof(GCCRegAliases);
4561}
4562
Tim Northover573cbee2014-05-24 12:52:07 +00004563const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004564#define BUILTIN(ID, TYPE, ATTRS) \
4565 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4566#include "clang/Basic/BuiltinsNEON.def"
4567
4568#define BUILTIN(ID, TYPE, ATTRS) \
4569 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004570#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004571};
James Molloy5e73df52014-04-16 15:06:20 +00004572
Tim Northover573cbee2014-05-24 12:52:07 +00004573class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004574 void setDescriptionString() override {
4575 if (getTriple().isOSBinFormatMachO())
4576 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4577 else
4578 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4579 }
4580
4581public:
Tim Northover573cbee2014-05-24 12:52:07 +00004582 AArch64leTargetInfo(const llvm::Triple &Triple)
4583 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004584 BigEndian = false;
4585 }
4586 void getTargetDefines(const LangOptions &Opts,
4587 MacroBuilder &Builder) const override {
4588 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004589 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004590 }
4591};
4592
Tim Northover573cbee2014-05-24 12:52:07 +00004593class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004594 void setDescriptionString() override {
4595 assert(!getTriple().isOSBinFormatMachO());
4596 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4597 }
4598
4599public:
Tim Northover573cbee2014-05-24 12:52:07 +00004600 AArch64beTargetInfo(const llvm::Triple &Triple)
4601 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004602 void getTargetDefines(const LangOptions &Opts,
4603 MacroBuilder &Builder) const override {
4604 Builder.defineMacro("__AARCH64EB__");
4605 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4606 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004607 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004608 }
4609};
Tim Northovera2ee4332014-03-29 15:09:45 +00004610} // end anonymous namespace.
4611
4612namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004613class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004614protected:
4615 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4616 MacroBuilder &Builder) const override {
4617 Builder.defineMacro("__AARCH64_SIMD__");
4618 Builder.defineMacro("__ARM64_ARCH_8__");
4619 Builder.defineMacro("__ARM_NEON__");
4620 Builder.defineMacro("__LITTLE_ENDIAN__");
4621 Builder.defineMacro("__REGISTER_PREFIX__", "");
4622 Builder.defineMacro("__arm64", "1");
4623 Builder.defineMacro("__arm64__", "1");
4624
4625 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4626 }
4627
Tim Northovera2ee4332014-03-29 15:09:45 +00004628public:
Tim Northover573cbee2014-05-24 12:52:07 +00004629 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4630 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004631 Int64Type = SignedLongLong;
4632 WCharType = SignedInt;
4633 UseSignedCharForObjCBool = false;
4634
4635 LongDoubleWidth = LongDoubleAlign = 64;
4636 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4637
4638 TheCXXABI.set(TargetCXXABI::iOS64);
4639 }
4640
4641 virtual BuiltinVaListKind getBuiltinVaListKind() const {
4642 return TargetInfo::CharPtrBuiltinVaList;
4643 }
4644};
4645} // end anonymous namespace
4646
4647namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004648// Hexagon abstract base class
4649class HexagonTargetInfo : public TargetInfo {
4650 static const Builtin::Info BuiltinInfo[];
4651 static const char * const GCCRegNames[];
4652 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4653 std::string CPU;
4654public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004655 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004656 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004657 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004658
4659 // {} in inline assembly are packet specifiers, not assembly variant
4660 // specifiers.
4661 NoAsmVariants = true;
4662 }
4663
Craig Topper3164f332014-03-11 03:39:26 +00004664 void getTargetBuiltins(const Builtin::Info *&Records,
4665 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004666 Records = BuiltinInfo;
4667 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4668 }
4669
Craig Topper3164f332014-03-11 03:39:26 +00004670 bool validateAsmConstraint(const char *&Name,
4671 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004672 return true;
4673 }
4674
Craig Topper3164f332014-03-11 03:39:26 +00004675 void getTargetDefines(const LangOptions &Opts,
4676 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004677
Craig Topper3164f332014-03-11 03:39:26 +00004678 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004679 return Feature == "hexagon";
4680 }
Craig Topper3164f332014-03-11 03:39:26 +00004681
4682 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004683 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004684 }
Craig Topper3164f332014-03-11 03:39:26 +00004685 void getGCCRegNames(const char * const *&Names,
4686 unsigned &NumNames) const override;
4687 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4688 unsigned &NumAliases) const override;
4689 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004690 return "";
4691 }
Sebastian Pop86500282012-01-13 20:37:10 +00004692
4693 static const char *getHexagonCPUSuffix(StringRef Name) {
4694 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004695 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004696 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00004697 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00004698 }
4699
Craig Topper3164f332014-03-11 03:39:26 +00004700 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004701 if (!getHexagonCPUSuffix(Name))
4702 return false;
4703
Tony Linthicum76329bf2011-12-12 21:14:55 +00004704 CPU = Name;
4705 return true;
4706 }
4707};
4708
4709void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4710 MacroBuilder &Builder) const {
4711 Builder.defineMacro("qdsp6");
4712 Builder.defineMacro("__qdsp6", "1");
4713 Builder.defineMacro("__qdsp6__", "1");
4714
4715 Builder.defineMacro("hexagon");
4716 Builder.defineMacro("__hexagon", "1");
4717 Builder.defineMacro("__hexagon__", "1");
4718
4719 if(CPU == "hexagonv1") {
4720 Builder.defineMacro("__HEXAGON_V1__");
4721 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4722 if(Opts.HexagonQdsp6Compat) {
4723 Builder.defineMacro("__QDSP6_V1__");
4724 Builder.defineMacro("__QDSP6_ARCH__", "1");
4725 }
4726 }
4727 else if(CPU == "hexagonv2") {
4728 Builder.defineMacro("__HEXAGON_V2__");
4729 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4730 if(Opts.HexagonQdsp6Compat) {
4731 Builder.defineMacro("__QDSP6_V2__");
4732 Builder.defineMacro("__QDSP6_ARCH__", "2");
4733 }
4734 }
4735 else if(CPU == "hexagonv3") {
4736 Builder.defineMacro("__HEXAGON_V3__");
4737 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4738 if(Opts.HexagonQdsp6Compat) {
4739 Builder.defineMacro("__QDSP6_V3__");
4740 Builder.defineMacro("__QDSP6_ARCH__", "3");
4741 }
4742 }
4743 else if(CPU == "hexagonv4") {
4744 Builder.defineMacro("__HEXAGON_V4__");
4745 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4746 if(Opts.HexagonQdsp6Compat) {
4747 Builder.defineMacro("__QDSP6_V4__");
4748 Builder.defineMacro("__QDSP6_ARCH__", "4");
4749 }
4750 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004751 else if(CPU == "hexagonv5") {
4752 Builder.defineMacro("__HEXAGON_V5__");
4753 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4754 if(Opts.HexagonQdsp6Compat) {
4755 Builder.defineMacro("__QDSP6_V5__");
4756 Builder.defineMacro("__QDSP6_ARCH__", "5");
4757 }
4758 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004759}
4760
4761const char * const HexagonTargetInfo::GCCRegNames[] = {
4762 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4763 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4764 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4765 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4766 "p0", "p1", "p2", "p3",
4767 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4768};
4769
4770void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4771 unsigned &NumNames) const {
4772 Names = GCCRegNames;
4773 NumNames = llvm::array_lengthof(GCCRegNames);
4774}
4775
4776
4777const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4778 { { "sp" }, "r29" },
4779 { { "fp" }, "r30" },
4780 { { "lr" }, "r31" },
4781 };
4782
4783void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4784 unsigned &NumAliases) const {
4785 Aliases = GCCRegAliases;
4786 NumAliases = llvm::array_lengthof(GCCRegAliases);
4787}
4788
4789
4790const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4791#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4792#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4793 ALL_LANGUAGES },
4794#include "clang/Basic/BuiltinsHexagon.def"
4795};
4796}
4797
4798
Chris Lattner5ba61f02006-10-14 07:39:34 +00004799namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004800// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4801class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004802 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4803 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004804 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004805public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004806 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004807
Craig Topper3164f332014-03-11 03:39:26 +00004808 bool handleTargetFeatures(std::vector<std::string> &Features,
4809 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004810 SoftFloat = false;
4811 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4812 if (Features[i] == "+soft-float")
4813 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004814 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004815 }
Craig Topper3164f332014-03-11 03:39:26 +00004816 void getTargetDefines(const LangOptions &Opts,
4817 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004818 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004819 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004820
4821 if (SoftFloat)
4822 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004823 }
Craig Topper3164f332014-03-11 03:39:26 +00004824
4825 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004826 return llvm::StringSwitch<bool>(Feature)
4827 .Case("softfloat", SoftFloat)
4828 .Case("sparc", true)
4829 .Default(false);
4830 }
Craig Topper3164f332014-03-11 03:39:26 +00004831
4832 void getTargetBuiltins(const Builtin::Info *&Records,
4833 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004834 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00004835 }
Craig Topper3164f332014-03-11 03:39:26 +00004836 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004837 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00004838 }
Craig Topper3164f332014-03-11 03:39:26 +00004839 void getGCCRegNames(const char * const *&Names,
4840 unsigned &NumNames) const override;
4841 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4842 unsigned &NumAliases) const override;
4843 bool validateAsmConstraint(const char *&Name,
4844 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004845 // FIXME: Implement!
4846 return false;
Gabor Greif49991682008-02-21 16:29:08 +00004847 }
Craig Topper3164f332014-03-11 03:39:26 +00004848 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004849 // FIXME: Implement!
4850 return "";
Gabor Greif49991682008-02-21 16:29:08 +00004851 }
4852};
4853
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004854const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00004855 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4856 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4857 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4858 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4859};
4860
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004861void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4862 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004863 Names = GCCRegNames;
4864 NumNames = llvm::array_lengthof(GCCRegNames);
4865}
4866
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004867const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004868 { { "g0" }, "r0" },
4869 { { "g1" }, "r1" },
4870 { { "g2" }, "r2" },
4871 { { "g3" }, "r3" },
4872 { { "g4" }, "r4" },
4873 { { "g5" }, "r5" },
4874 { { "g6" }, "r6" },
4875 { { "g7" }, "r7" },
4876 { { "o0" }, "r8" },
4877 { { "o1" }, "r9" },
4878 { { "o2" }, "r10" },
4879 { { "o3" }, "r11" },
4880 { { "o4" }, "r12" },
4881 { { "o5" }, "r13" },
4882 { { "o6", "sp" }, "r14" },
4883 { { "o7" }, "r15" },
4884 { { "l0" }, "r16" },
4885 { { "l1" }, "r17" },
4886 { { "l2" }, "r18" },
4887 { { "l3" }, "r19" },
4888 { { "l4" }, "r20" },
4889 { { "l5" }, "r21" },
4890 { { "l6" }, "r22" },
4891 { { "l7" }, "r23" },
4892 { { "i0" }, "r24" },
4893 { { "i1" }, "r25" },
4894 { { "i2" }, "r26" },
4895 { { "i3" }, "r27" },
4896 { { "i4" }, "r28" },
4897 { { "i5" }, "r29" },
4898 { { "i6", "fp" }, "r30" },
4899 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00004900};
4901
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004902void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4903 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004904 Aliases = GCCRegAliases;
4905 NumAliases = llvm::array_lengthof(GCCRegAliases);
4906}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004907
4908// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4909class SparcV8TargetInfo : public SparcTargetInfo {
4910public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004911 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004912 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004913 }
4914
Craig Topper3164f332014-03-11 03:39:26 +00004915 void getTargetDefines(const LangOptions &Opts,
4916 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004917 SparcTargetInfo::getTargetDefines(Opts, Builder);
4918 Builder.defineMacro("__sparcv8");
4919 }
4920};
4921
4922// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4923class SparcV9TargetInfo : public SparcTargetInfo {
4924public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004925 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004926 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00004927 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00004928 // This is an LP64 platform.
4929 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004930
4931 // OpenBSD uses long long for int64_t and intmax_t.
4932 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
4933 IntMaxType = SignedLongLong;
4934 UIntMaxType = UnsignedLongLong;
4935 } else {
4936 IntMaxType = SignedLong;
4937 UIntMaxType = UnsignedLong;
4938 }
4939 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00004940
4941 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
4942 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
4943 LongDoubleWidth = 128;
4944 LongDoubleAlign = 128;
4945 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00004946 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004947 }
4948
Craig Topper3164f332014-03-11 03:39:26 +00004949 void getTargetDefines(const LangOptions &Opts,
4950 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004951 SparcTargetInfo::getTargetDefines(Opts, Builder);
4952 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00004953 Builder.defineMacro("__arch64__");
4954 // Solaris and its derivative AuroraUX don't need these variants, but the
4955 // BSDs do.
4956 if (getTriple().getOS() != llvm::Triple::Solaris &&
4957 getTriple().getOS() != llvm::Triple::AuroraUX) {
4958 Builder.defineMacro("__sparc64__");
4959 Builder.defineMacro("__sparc_v9__");
4960 Builder.defineMacro("__sparcv9__");
4961 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004962 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00004963
Craig Topper3164f332014-03-11 03:39:26 +00004964 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00004965 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4966 .Case("v9", true)
4967 .Case("ultrasparc", true)
4968 .Case("ultrasparc3", true)
4969 .Case("niagara", true)
4970 .Case("niagara2", true)
4971 .Case("niagara3", true)
4972 .Case("niagara4", true)
4973 .Default(false);
4974
4975 // No need to store the CPU yet. There aren't any CPU-specific
4976 // macros to define.
4977 return CPUKnown;
4978 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004979};
4980
Gabor Greif49991682008-02-21 16:29:08 +00004981} // end anonymous namespace.
4982
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004983namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004984class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4985public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004986 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
4987 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004988 SizeType = UnsignedInt;
4989 PtrDiffType = SignedInt;
4990 }
4991};
Torok Edwinb2b37c62009-06-30 17:10:35 +00004992class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004993public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004994 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
4995 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00004996 SizeType = UnsignedInt;
4997 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004998 }
4999};
5000} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005001
Chris Lattnerb781dc792008-05-08 05:58:21 +00005002namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005003class SystemZTargetInfo : public TargetInfo {
5004 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005005
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005006public:
5007 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5008 TLSSupported = true;
5009 IntWidth = IntAlign = 32;
5010 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5011 PointerWidth = PointerAlign = 64;
5012 LongDoubleWidth = 128;
5013 LongDoubleAlign = 64;
5014 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5015 MinGlobalAlign = 16;
5016 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5017 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5018 }
5019 void getTargetDefines(const LangOptions &Opts,
5020 MacroBuilder &Builder) const override {
5021 Builder.defineMacro("__s390__");
5022 Builder.defineMacro("__s390x__");
5023 Builder.defineMacro("__zarch__");
5024 Builder.defineMacro("__LONG_DOUBLE_128__");
5025 }
5026 void getTargetBuiltins(const Builtin::Info *&Records,
5027 unsigned &NumRecords) const override {
5028 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005029 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005030 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005031 }
5032
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005033 void getGCCRegNames(const char *const *&Names,
5034 unsigned &NumNames) const override;
5035 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5036 unsigned &NumAliases) const override {
5037 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005038 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005039 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005040 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005041 bool validateAsmConstraint(const char *&Name,
5042 TargetInfo::ConstraintInfo &info) const override;
5043 const char *getClobbers() const override {
5044 // FIXME: Is this really right?
5045 return "";
5046 }
5047 BuiltinVaListKind getBuiltinVaListKind() const override {
5048 return TargetInfo::SystemZBuiltinVaList;
5049 }
5050 bool setCPU(const std::string &Name) override {
5051 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5052 .Case("z10", true)
5053 .Case("z196", true)
5054 .Case("zEC12", true)
5055 .Default(false);
5056
5057 // No need to store the CPU yet. There aren't any CPU-specific
5058 // macros to define.
5059 return CPUKnown;
5060 }
5061};
5062
5063const char *const SystemZTargetInfo::GCCRegNames[] = {
5064 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5065 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5066 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5067 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5068};
5069
5070void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5071 unsigned &NumNames) const {
5072 Names = GCCRegNames;
5073 NumNames = llvm::array_lengthof(GCCRegNames);
5074}
5075
5076bool SystemZTargetInfo::
5077validateAsmConstraint(const char *&Name,
5078 TargetInfo::ConstraintInfo &Info) const {
5079 switch (*Name) {
5080 default:
5081 return false;
5082
5083 case 'a': // Address register
5084 case 'd': // Data register (equivalent to 'r')
5085 case 'f': // Floating-point register
5086 Info.setAllowsRegister();
5087 return true;
5088
5089 case 'I': // Unsigned 8-bit constant
5090 case 'J': // Unsigned 12-bit constant
5091 case 'K': // Signed 16-bit constant
5092 case 'L': // Signed 20-bit displacement (on all targets we support)
5093 case 'M': // 0x7fffffff
5094 return true;
5095
5096 case 'Q': // Memory with base and unsigned 12-bit displacement
5097 case 'R': // Likewise, plus an index
5098 case 'S': // Memory with base and signed 20-bit displacement
5099 case 'T': // Likewise, plus an index
5100 Info.setAllowsMemory();
5101 return true;
5102 }
5103}
Ulrich Weigand47445072013-05-06 16:26:41 +00005104}
5105
5106namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005107 class MSP430TargetInfo : public TargetInfo {
5108 static const char * const GCCRegNames[];
5109 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005110 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005111 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005112 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005113 IntWidth = 16; IntAlign = 16;
5114 LongWidth = 32; LongLongWidth = 64;
5115 LongAlign = LongLongAlign = 16;
5116 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005117 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005118 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005119 IntMaxType = SignedLongLong;
5120 UIntMaxType = UnsignedLongLong;
5121 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005122 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005123 SigAtomicType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005124 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005125 }
5126 void getTargetDefines(const LangOptions &Opts,
5127 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005128 Builder.defineMacro("MSP430");
5129 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005130 // FIXME: defines for different 'flavours' of MCU
5131 }
Craig Topper3164f332014-03-11 03:39:26 +00005132 void getTargetBuiltins(const Builtin::Info *&Records,
5133 unsigned &NumRecords) const override {
5134 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005135 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005136 NumRecords = 0;
5137 }
Craig Topper3164f332014-03-11 03:39:26 +00005138 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005139 return Feature == "msp430";
5140 }
Craig Topper3164f332014-03-11 03:39:26 +00005141 void getGCCRegNames(const char * const *&Names,
5142 unsigned &NumNames) const override;
5143 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5144 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005145 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005146 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005147 NumAliases = 0;
5148 }
Craig Topper3164f332014-03-11 03:39:26 +00005149 bool validateAsmConstraint(const char *&Name,
5150 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005151 // No target constraints for now.
5152 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005153 }
Craig Topper3164f332014-03-11 03:39:26 +00005154 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005155 // FIXME: Is this really right?
5156 return "";
5157 }
Craig Topper3164f332014-03-11 03:39:26 +00005158 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005159 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005160 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005161 }
5162 };
5163
5164 const char * const MSP430TargetInfo::GCCRegNames[] = {
5165 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5166 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5167 };
5168
5169 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5170 unsigned &NumNames) const {
5171 Names = GCCRegNames;
5172 NumNames = llvm::array_lengthof(GCCRegNames);
5173 }
5174}
5175
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005176namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005177
Mike Stump11289f42009-09-09 15:08:12 +00005178 // LLVM and Clang cannot be used directly to output native binaries for
5179 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005180 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005181 //
5182 // TCE uses the llvm bitcode as input and uses it for generating customized
5183 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005184 // publicly available in http://tce.cs.tut.fi
5185
Eli Friedman1f191002011-10-07 19:51:42 +00005186 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5187 3, // opencl_global
5188 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005189 5, // opencl_constant
5190 0, // cuda_device
5191 0, // cuda_constant
5192 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005193 };
5194
Eli Friedmana9c3d712009-08-19 20:47:07 +00005195 class TCETargetInfo : public TargetInfo{
5196 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005197 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005198 TLSSupported = false;
5199 IntWidth = 32;
5200 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005201 PointerWidth = 32;
5202 IntAlign = 32;
5203 LongAlign = LongLongAlign = 32;
5204 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005205 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005206 SizeType = UnsignedInt;
5207 IntMaxType = SignedLong;
5208 UIntMaxType = UnsignedLong;
5209 IntPtrType = SignedInt;
5210 PtrDiffType = SignedInt;
5211 FloatWidth = 32;
5212 FloatAlign = 32;
5213 DoubleWidth = 32;
5214 DoubleAlign = 32;
5215 LongDoubleWidth = 32;
5216 LongDoubleAlign = 32;
5217 FloatFormat = &llvm::APFloat::IEEEsingle;
5218 DoubleFormat = &llvm::APFloat::IEEEsingle;
5219 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005220 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5221 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005222 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005223 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005224 }
5225
Craig Topper3164f332014-03-11 03:39:26 +00005226 void getTargetDefines(const LangOptions &Opts,
5227 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005228 DefineStd(Builder, "tce", Opts);
5229 Builder.defineMacro("__TCE__");
5230 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005231 }
Craig Topper3164f332014-03-11 03:39:26 +00005232 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005233 return Feature == "tce";
5234 }
Craig Topper3164f332014-03-11 03:39:26 +00005235
5236 void getTargetBuiltins(const Builtin::Info *&Records,
5237 unsigned &NumRecords) const override {}
5238 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005239 return "";
5240 }
Craig Topper3164f332014-03-11 03:39:26 +00005241 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005242 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005243 }
Craig Topper3164f332014-03-11 03:39:26 +00005244 void getGCCRegNames(const char * const *&Names,
5245 unsigned &NumNames) const override {}
5246 bool validateAsmConstraint(const char *&Name,
5247 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005248 return true;
5249 }
Craig Topper3164f332014-03-11 03:39:26 +00005250 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5251 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005252 };
5253}
5254
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005255namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005256class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005257 virtual void setDescriptionString() = 0;
5258
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005259 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005260 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005261 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005262 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005263 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005264 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005265 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005266 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005267 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005268 enum DspRevEnum {
5269 NoDSP, DSP1, DSP2
5270 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005271 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005272
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005273protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005274 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005275 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005276
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005277public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005278 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5279 const std::string &CPUStr)
5280 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005281 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005282 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005283
Alp Toker4925ba72014-06-07 23:30:42 +00005284 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005285 bool setABI(const std::string &Name) override = 0;
5286 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00005287 CPU = Name;
5288 return true;
5289 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005290 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005291 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005292 // The backend enables certain ABI's by default according to the
5293 // architecture.
5294 // Disable both possible defaults so that we don't end up with multiple
5295 // ABI's selected and trigger an assertion.
5296 Features["o32"] = false;
5297 Features["n64"] = false;
5298
Eric Christopher0b26a612010-03-02 02:41:08 +00005299 Features[ABI] = true;
5300 Features[CPU] = true;
5301 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005302
Craig Topper3164f332014-03-11 03:39:26 +00005303 void getTargetDefines(const LangOptions &Opts,
5304 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005305 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005306 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005307 if (Opts.GNUMode)
5308 Builder.defineMacro("mips");
5309
Simon Atanasyan683535b2012-08-29 19:14:58 +00005310 Builder.defineMacro("__REGISTER_PREFIX__", "");
5311
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005312 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005313 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005314 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005315 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005316 case SoftFloat:
5317 Builder.defineMacro("__mips_soft_float", Twine(1));
5318 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005319 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005320
Simon Atanasyan16071912013-04-14 14:07:30 +00005321 if (IsSingleFloat)
5322 Builder.defineMacro("__mips_single_float", Twine(1));
5323
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005324 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5325 Builder.defineMacro("_MIPS_FPSET",
5326 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5327
Simon Atanasyan72244b62012-07-05 16:06:06 +00005328 if (IsMips16)
5329 Builder.defineMacro("__mips16", Twine(1));
5330
Simon Atanasyan60777612013-04-14 14:07:51 +00005331 if (IsMicromips)
5332 Builder.defineMacro("__mips_micromips", Twine(1));
5333
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005334 if (IsNan2008)
5335 Builder.defineMacro("__mips_nan2008", Twine(1));
5336
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005337 switch (DspRev) {
5338 default:
5339 break;
5340 case DSP1:
5341 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5342 Builder.defineMacro("__mips_dsp", Twine(1));
5343 break;
5344 case DSP2:
5345 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5346 Builder.defineMacro("__mips_dspr2", Twine(1));
5347 Builder.defineMacro("__mips_dsp", Twine(1));
5348 break;
5349 }
5350
Jack Carter44ff1e52013-08-12 17:20:29 +00005351 if (HasMSA)
5352 Builder.defineMacro("__mips_msa", Twine(1));
5353
Simon Atanasyan26f19672012-04-05 19:28:31 +00005354 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5355 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5356 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005357
5358 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5359 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005360 }
5361
Craig Topper3164f332014-03-11 03:39:26 +00005362 void getTargetBuiltins(const Builtin::Info *&Records,
5363 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005364 Records = BuiltinInfo;
5365 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005366 }
Craig Topper3164f332014-03-11 03:39:26 +00005367 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005368 return llvm::StringSwitch<bool>(Feature)
5369 .Case("mips", true)
5370 .Case("fp64", HasFP64)
5371 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005372 }
Craig Topper3164f332014-03-11 03:39:26 +00005373 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005374 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005375 }
Craig Topper3164f332014-03-11 03:39:26 +00005376 void getGCCRegNames(const char * const *&Names,
5377 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005378 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005379 // CPU register names
5380 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005381 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5382 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5383 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005384 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5385 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005386 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5387 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5388 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5389 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005390 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005391 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005392 "$fcc5","$fcc6","$fcc7",
5393 // MSA register names
5394 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5395 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5396 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5397 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5398 // MSA control register names
5399 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5400 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005401 };
5402 Names = GCCRegNames;
5403 NumNames = llvm::array_lengthof(GCCRegNames);
5404 }
Craig Topper3164f332014-03-11 03:39:26 +00005405 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5406 unsigned &NumAliases) const override = 0;
5407 bool validateAsmConstraint(const char *&Name,
5408 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005409 switch (*Name) {
5410 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005411 return false;
5412
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005413 case 'r': // CPU registers.
5414 case 'd': // Equivalent to "r" unless generating MIPS16 code.
5415 case 'y': // Equivalent to "r", backwards compatibility only.
5416 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005417 case 'c': // $25 for indirect jumps
5418 case 'l': // lo register
5419 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005420 Info.setAllowsRegister();
5421 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005422 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005423 Info.setAllowsMemory();
5424 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005425 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005426 }
5427
Craig Topper3164f332014-03-11 03:39:26 +00005428 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005429 // FIXME: Implement!
5430 return "";
5431 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005432
Craig Topper3164f332014-03-11 03:39:26 +00005433 bool handleTargetFeatures(std::vector<std::string> &Features,
5434 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005435 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005436 IsMicromips = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005437 IsNan2008 = false;
Simon Atanasyan16071912013-04-14 14:07:30 +00005438 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005439 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005440 DspRev = NoDSP;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005441 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005442
5443 for (std::vector<std::string>::iterator it = Features.begin(),
5444 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005445 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005446 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005447 else if (*it == "+soft-float")
5448 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005449 else if (*it == "+mips16")
5450 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005451 else if (*it == "+micromips")
5452 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005453 else if (*it == "+dsp")
5454 DspRev = std::max(DspRev, DSP1);
5455 else if (*it == "+dspr2")
5456 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005457 else if (*it == "+msa")
5458 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005459 else if (*it == "+fp64")
5460 HasFP64 = true;
5461 else if (*it == "-fp64")
5462 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005463 else if (*it == "+nan2008")
5464 IsNan2008 = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005465 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005466
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005467 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005468 std::vector<std::string>::iterator it =
5469 std::find(Features.begin(), Features.end(), "+soft-float");
5470 if (it != Features.end())
5471 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005472
Akira Hatanaka9064e362013-10-29 18:30:33 +00005473 setDescriptionString();
5474
Rafael Espindolaeb265472013-08-21 21:59:03 +00005475 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005476 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005477
Craig Topper3164f332014-03-11 03:39:26 +00005478 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005479 if (RegNo == 0) return 4;
5480 if (RegNo == 1) return 5;
5481 return -1;
5482 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005483};
5484
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005485const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5486#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5487#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5488 ALL_LANGUAGES },
5489#include "clang/Basic/BuiltinsMips.def"
5490};
5491
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005492class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005493public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005494 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005495 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005496 SizeType = UnsignedInt;
5497 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005498 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005499 }
Craig Topper3164f332014-03-11 03:39:26 +00005500 bool setABI(const std::string &Name) override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005501 if ((Name == "o32") || (Name == "eabi")) {
5502 ABI = Name;
5503 return true;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005504 } else if (Name == "32") {
5505 ABI = "o32";
5506 return true;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005507 } else
5508 return false;
5509 }
Craig Topper3164f332014-03-11 03:39:26 +00005510 void getTargetDefines(const LangOptions &Opts,
5511 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005512 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005513
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005514 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005515 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5516
5517 const std::string& CPUStr = getCPU();
5518 if (CPUStr == "mips32")
5519 Builder.defineMacro("__mips_isa_rev", "1");
5520 else if (CPUStr == "mips32r2")
5521 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005522
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005523 if (ABI == "o32") {
5524 Builder.defineMacro("__mips_o32");
5525 Builder.defineMacro("_ABIO32", "1");
5526 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5527 }
5528 else if (ABI == "eabi")
5529 Builder.defineMacro("__mips_eabi");
5530 else
David Blaikie83d382b2011-09-23 05:06:16 +00005531 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005532 }
Craig Topper3164f332014-03-11 03:39:26 +00005533 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5534 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005535 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5536 { { "at" }, "$1" },
5537 { { "v0" }, "$2" },
5538 { { "v1" }, "$3" },
5539 { { "a0" }, "$4" },
5540 { { "a1" }, "$5" },
5541 { { "a2" }, "$6" },
5542 { { "a3" }, "$7" },
5543 { { "t0" }, "$8" },
5544 { { "t1" }, "$9" },
5545 { { "t2" }, "$10" },
5546 { { "t3" }, "$11" },
5547 { { "t4" }, "$12" },
5548 { { "t5" }, "$13" },
5549 { { "t6" }, "$14" },
5550 { { "t7" }, "$15" },
5551 { { "s0" }, "$16" },
5552 { { "s1" }, "$17" },
5553 { { "s2" }, "$18" },
5554 { { "s3" }, "$19" },
5555 { { "s4" }, "$20" },
5556 { { "s5" }, "$21" },
5557 { { "s6" }, "$22" },
5558 { { "s7" }, "$23" },
5559 { { "t8" }, "$24" },
5560 { { "t9" }, "$25" },
5561 { { "k0" }, "$26" },
5562 { { "k1" }, "$27" },
5563 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005564 { { "sp","$sp" }, "$29" },
5565 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005566 { { "ra" }, "$31" }
5567 };
5568 Aliases = GCCRegAliases;
5569 NumAliases = llvm::array_lengthof(GCCRegAliases);
5570 }
5571};
5572
5573class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005574 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005575 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005576 }
5577
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005578public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005579 Mips32EBTargetInfo(const llvm::Triple &Triple)
5580 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005581 }
Craig Topper3164f332014-03-11 03:39:26 +00005582 void getTargetDefines(const LangOptions &Opts,
5583 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005584 DefineStd(Builder, "MIPSEB", Opts);
5585 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005586 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005587 }
5588};
5589
5590class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005591 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005592 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005593 }
5594
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005595public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005596 Mips32ELTargetInfo(const llvm::Triple &Triple)
5597 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005598 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005599 }
Craig Topper3164f332014-03-11 03:39:26 +00005600 void getTargetDefines(const LangOptions &Opts,
5601 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005602 DefineStd(Builder, "MIPSEL", Opts);
5603 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005604 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005605 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005606};
Akira Hatanakabef17452011-09-20 19:21:49 +00005607
5608class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005609public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005610 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005611 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005612 LongDoubleWidth = LongDoubleAlign = 128;
5613 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005614 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5615 LongDoubleWidth = LongDoubleAlign = 64;
5616 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5617 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005618 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005619 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005620 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005621 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005622
5623 void setN64ABITypes() {
5624 LongWidth = LongAlign = 64;
5625 PointerWidth = PointerAlign = 64;
5626 SizeType = UnsignedLong;
5627 PtrDiffType = SignedLong;
5628 }
5629
5630 void setN32ABITypes() {
5631 LongWidth = LongAlign = 32;
5632 PointerWidth = PointerAlign = 32;
5633 SizeType = UnsignedInt;
5634 PtrDiffType = SignedInt;
5635 }
5636
Craig Topper3164f332014-03-11 03:39:26 +00005637 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005638 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005639 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005640 ABI = Name;
5641 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005642 } else if (Name == "n64" || Name == "64") {
5643 setN64ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005644 ABI = "n64";
5645 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005646 }
5647 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005648 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005649
Craig Topper3164f332014-03-11 03:39:26 +00005650 void getTargetDefines(const LangOptions &Opts,
5651 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005652 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005653
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005654 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005655 Builder.defineMacro("__mips64");
5656 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005657 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
5658
5659 const std::string& CPUStr = getCPU();
5660 if (CPUStr == "mips64")
5661 Builder.defineMacro("__mips_isa_rev", "1");
5662 else if (CPUStr == "mips64r2")
5663 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005664
Akira Hatanakabef17452011-09-20 19:21:49 +00005665 if (ABI == "n32") {
5666 Builder.defineMacro("__mips_n32");
5667 Builder.defineMacro("_ABIN32", "2");
5668 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5669 }
5670 else if (ABI == "n64") {
5671 Builder.defineMacro("__mips_n64");
5672 Builder.defineMacro("_ABI64", "3");
5673 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5674 }
5675 else
David Blaikie83d382b2011-09-23 05:06:16 +00005676 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005677 }
Craig Topper3164f332014-03-11 03:39:26 +00005678 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5679 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005680 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5681 { { "at" }, "$1" },
5682 { { "v0" }, "$2" },
5683 { { "v1" }, "$3" },
5684 { { "a0" }, "$4" },
5685 { { "a1" }, "$5" },
5686 { { "a2" }, "$6" },
5687 { { "a3" }, "$7" },
5688 { { "a4" }, "$8" },
5689 { { "a5" }, "$9" },
5690 { { "a6" }, "$10" },
5691 { { "a7" }, "$11" },
5692 { { "t0" }, "$12" },
5693 { { "t1" }, "$13" },
5694 { { "t2" }, "$14" },
5695 { { "t3" }, "$15" },
5696 { { "s0" }, "$16" },
5697 { { "s1" }, "$17" },
5698 { { "s2" }, "$18" },
5699 { { "s3" }, "$19" },
5700 { { "s4" }, "$20" },
5701 { { "s5" }, "$21" },
5702 { { "s6" }, "$22" },
5703 { { "s7" }, "$23" },
5704 { { "t8" }, "$24" },
5705 { { "t9" }, "$25" },
5706 { { "k0" }, "$26" },
5707 { { "k1" }, "$27" },
5708 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005709 { { "sp","$sp" }, "$29" },
5710 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005711 { { "ra" }, "$31" }
5712 };
5713 Aliases = GCCRegAliases;
5714 NumAliases = llvm::array_lengthof(GCCRegAliases);
5715 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00005716
5717 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00005718};
5719
5720class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005721 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005722 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005723 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005724 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005725 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005726
Akira Hatanakabef17452011-09-20 19:21:49 +00005727 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005728
Akira Hatanakabef17452011-09-20 19:21:49 +00005729public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005730 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005731 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005732 void getTargetDefines(const LangOptions &Opts,
5733 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005734 DefineStd(Builder, "MIPSEB", Opts);
5735 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005736 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005737 }
5738};
5739
5740class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005741 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005742 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005743 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005744 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005745 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005746 }
5747public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005748 Mips64ELTargetInfo(const llvm::Triple &Triple)
5749 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005750 // Default ABI is n64.
5751 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005752 }
Craig Topper3164f332014-03-11 03:39:26 +00005753 void getTargetDefines(const LangOptions &Opts,
5754 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005755 DefineStd(Builder, "MIPSEL", Opts);
5756 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005757 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005758 }
5759};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005760} // end anonymous namespace.
5761
Ivan Krasindd7403e2011-08-24 20:22:22 +00005762namespace {
5763class PNaClTargetInfo : public TargetInfo {
5764public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005765 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005766 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005767 this->UserLabelPrefix = "";
5768 this->LongAlign = 32;
5769 this->LongWidth = 32;
5770 this->PointerAlign = 32;
5771 this->PointerWidth = 32;
5772 this->IntMaxType = TargetInfo::SignedLongLong;
5773 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5774 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005775 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005776 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005777 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005778 this->SizeType = TargetInfo::UnsignedInt;
5779 this->PtrDiffType = TargetInfo::SignedInt;
5780 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005781 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005782 }
5783
Craig Topper3164f332014-03-11 03:39:26 +00005784 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005785 }
Craig Toppere6f17d02014-03-11 04:07:52 +00005786 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005787 Builder.defineMacro("__le32__");
5788 Builder.defineMacro("__pnacl__");
5789 }
Craig Topper3164f332014-03-11 03:39:26 +00005790 void getTargetDefines(const LangOptions &Opts,
5791 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005792 getArchDefines(Opts, Builder);
5793 }
Craig Topper3164f332014-03-11 03:39:26 +00005794 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005795 return Feature == "pnacl";
5796 }
Craig Topper3164f332014-03-11 03:39:26 +00005797 void getTargetBuiltins(const Builtin::Info *&Records,
5798 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005799 }
Craig Topper3164f332014-03-11 03:39:26 +00005800 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005801 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005802 }
Craig Topper3164f332014-03-11 03:39:26 +00005803 void getGCCRegNames(const char * const *&Names,
5804 unsigned &NumNames) const override;
5805 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5806 unsigned &NumAliases) const override;
5807 bool validateAsmConstraint(const char *&Name,
5808 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005809 return false;
5810 }
5811
Craig Topper3164f332014-03-11 03:39:26 +00005812 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005813 return "";
5814 }
5815};
5816
5817void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5818 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00005819 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005820 NumNames = 0;
5821}
5822
5823void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5824 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00005825 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005826 NumAliases = 0;
5827}
5828} // end anonymous namespace.
5829
Guy Benyeib798fc92012-12-11 21:38:14 +00005830namespace {
5831 static const unsigned SPIRAddrSpaceMap[] = {
5832 1, // opencl_global
5833 3, // opencl_local
5834 2, // opencl_constant
5835 0, // cuda_device
5836 0, // cuda_constant
5837 0 // cuda_shared
5838 };
5839 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00005840 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005841 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005842 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5843 "SPIR target must use unknown OS");
5844 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5845 "SPIR target must use unknown environment type");
5846 BigEndian = false;
5847 TLSSupported = false;
5848 LongWidth = LongAlign = 64;
5849 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005850 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00005851 // Define available target features
5852 // These must be defined in sorted order!
5853 NoAsmVariants = true;
5854 }
Craig Topper3164f332014-03-11 03:39:26 +00005855 void getTargetDefines(const LangOptions &Opts,
5856 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005857 DefineStd(Builder, "SPIR", Opts);
5858 }
Craig Topper3164f332014-03-11 03:39:26 +00005859 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005860 return Feature == "spir";
5861 }
Craig Topper3164f332014-03-11 03:39:26 +00005862
5863 void getTargetBuiltins(const Builtin::Info *&Records,
5864 unsigned &NumRecords) const override {}
5865 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005866 return "";
5867 }
Craig Topper3164f332014-03-11 03:39:26 +00005868 void getGCCRegNames(const char * const *&Names,
5869 unsigned &NumNames) const override {}
5870 bool validateAsmConstraint(const char *&Name,
5871 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005872 return true;
5873 }
Craig Topper3164f332014-03-11 03:39:26 +00005874 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5875 unsigned &NumAliases) const override {}
5876 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005877 return TargetInfo::VoidPtrBuiltinVaList;
5878 }
5879 };
5880
5881
5882 class SPIR32TargetInfo : public SPIRTargetInfo {
5883 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005884 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005885 PointerWidth = PointerAlign = 32;
5886 SizeType = TargetInfo::UnsignedInt;
5887 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5888 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00005889 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
5890 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005891 }
Craig Topper3164f332014-03-11 03:39:26 +00005892 void getTargetDefines(const LangOptions &Opts,
5893 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00005894 DefineStd(Builder, "SPIR32", Opts);
5895 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005896 };
5897
5898 class SPIR64TargetInfo : public SPIRTargetInfo {
5899 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005900 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005901 PointerWidth = PointerAlign = 64;
5902 SizeType = TargetInfo::UnsignedLong;
5903 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005904 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
5905 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005906 }
Craig Topper3164f332014-03-11 03:39:26 +00005907 void getTargetDefines(const LangOptions &Opts,
5908 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00005909 DefineStd(Builder, "SPIR64", Opts);
5910 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005911 };
5912}
5913
Robert Lytton0e076492013-08-13 09:43:10 +00005914namespace {
5915class XCoreTargetInfo : public TargetInfo {
5916 static const Builtin::Info BuiltinInfo[];
5917public:
5918 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5919 BigEndian = false;
5920 NoAsmVariants = true;
5921 LongLongAlign = 32;
5922 SuitableAlign = 32;
5923 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00005924 SizeType = UnsignedInt;
5925 PtrDiffType = SignedInt;
5926 IntPtrType = SignedInt;
5927 WCharType = UnsignedChar;
5928 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00005929 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005930 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
Rafael Espindola26c67b72013-12-17 14:34:42 +00005931 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00005932 }
Craig Topper3164f332014-03-11 03:39:26 +00005933 void getTargetDefines(const LangOptions &Opts,
5934 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005935 Builder.defineMacro("__XS1B__");
5936 }
Craig Topper3164f332014-03-11 03:39:26 +00005937 void getTargetBuiltins(const Builtin::Info *&Records,
5938 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005939 Records = BuiltinInfo;
5940 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5941 }
Craig Topper3164f332014-03-11 03:39:26 +00005942 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005943 return TargetInfo::VoidPtrBuiltinVaList;
5944 }
Craig Topper3164f332014-03-11 03:39:26 +00005945 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005946 return "";
5947 }
Craig Topper3164f332014-03-11 03:39:26 +00005948 void getGCCRegNames(const char * const *&Names,
5949 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005950 static const char * const GCCRegNames[] = {
5951 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5952 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
5953 };
5954 Names = GCCRegNames;
5955 NumNames = llvm::array_lengthof(GCCRegNames);
5956 }
Craig Topper3164f332014-03-11 03:39:26 +00005957 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5958 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00005959 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00005960 NumAliases = 0;
5961 }
Craig Topper3164f332014-03-11 03:39:26 +00005962 bool validateAsmConstraint(const char *&Name,
5963 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005964 return false;
5965 }
Craig Topper3164f332014-03-11 03:39:26 +00005966 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00005967 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
5968 return (RegNo < 2)? RegNo : -1;
5969 }
Robert Lytton0e076492013-08-13 09:43:10 +00005970};
5971
5972const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
5973#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5974#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5975 ALL_LANGUAGES },
5976#include "clang/Basic/BuiltinsXCore.def"
5977};
5978} // end anonymous namespace.
5979
Ivan Krasindd7403e2011-08-24 20:22:22 +00005980
Chris Lattner5ba61f02006-10-14 07:39:34 +00005981//===----------------------------------------------------------------------===//
5982// Driver code
5983//===----------------------------------------------------------------------===//
5984
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005985static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00005986 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00005987
Daniel Dunbar52322032009-08-18 05:47:58 +00005988 switch (Triple.getArch()) {
5989 default:
Craig Topperf1186c52014-05-08 06:41:40 +00005990 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00005991
Tim Northover2a0783d2014-05-30 14:14:07 +00005992 case llvm::Triple::xcore:
5993 return new XCoreTargetInfo(Triple);
5994
5995 case llvm::Triple::hexagon:
5996 return new HexagonTargetInfo(Triple);
5997
5998 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00005999 case llvm::Triple::arm64:
6000 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006001 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006002
6003 switch (os) {
6004 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006005 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006006 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006007 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006008 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006009 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006010 }
6011
Christian Pirker9b019ae2014-02-25 13:51:00 +00006012 case llvm::Triple::aarch64_be:
Tim Northover2a0783d2014-05-30 14:14:07 +00006013 case llvm::Triple::arm64_be:
Christian Pirker9b019ae2014-02-25 13:51:00 +00006014 switch (os) {
6015 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006016 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006017 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006018 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006019 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006020 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006021 }
6022
Daniel Dunbar52322032009-08-18 05:47:58 +00006023 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006024 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006025 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006026 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006027
Daniel Dunbar52322032009-08-18 05:47:58 +00006028 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006029 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006030 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006031 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006032 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006033 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006034 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006035 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006036 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006037 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006038 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006039 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006040 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006041 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006042 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006043 case llvm::Triple::Win32:
6044 switch (Triple.getEnvironment()) {
6045 default:
6046 return new ARMleTargetInfo(Triple);
6047 case llvm::Triple::Itanium:
6048 return new ItaniumWindowsARMleTargetInfo(Triple);
6049 case llvm::Triple::MSVC:
6050 return new MicrosoftARMleTargetInfo(Triple);
6051 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006052 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006053 return new ARMleTargetInfo(Triple);
6054 }
6055
6056 case llvm::Triple::armeb:
6057 case llvm::Triple::thumbeb:
6058 if (Triple.isOSDarwin())
6059 return new DarwinARMTargetInfo(Triple);
6060
6061 switch (os) {
6062 case llvm::Triple::Linux:
6063 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6064 case llvm::Triple::FreeBSD:
6065 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6066 case llvm::Triple::NetBSD:
6067 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6068 case llvm::Triple::OpenBSD:
6069 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6070 case llvm::Triple::Bitrig:
6071 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6072 case llvm::Triple::RTEMS:
6073 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6074 case llvm::Triple::NaCl:
6075 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6076 default:
6077 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006078 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006079
Daniel Dunbar52322032009-08-18 05:47:58 +00006080 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006081 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006082
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006083 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006084 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006085 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006086 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006087 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006088 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006089 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006090 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006091 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006092 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006093 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006094 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006095 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006096
6097 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006098 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006099 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006100 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006101 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006102 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006103 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006104 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006105 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006106 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006107 case llvm::Triple::NaCl:
6108 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006109 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006110 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006111 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006112
Akira Hatanakabef17452011-09-20 19:21:49 +00006113 case llvm::Triple::mips64:
6114 switch (os) {
6115 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006116 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006117 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006118 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006119 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006120 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006121 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006122 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006123 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006124 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006125 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006126 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006127 }
6128
6129 case llvm::Triple::mips64el:
6130 switch (os) {
6131 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006132 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006133 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006134 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006135 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006136 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006137 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006138 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006139 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006140 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006141 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006142 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006143 }
6144
Ivan Krasindd7403e2011-08-24 20:22:22 +00006145 case llvm::Triple::le32:
6146 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006147 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006148 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006149 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006150 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006151 }
6152
Daniel Dunbar52322032009-08-18 05:47:58 +00006153 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006154 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006155 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006156 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006157 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006158 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006159 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006160 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006161 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006162 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006163 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006164 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006165 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006166 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006167 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006168 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006169 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006170
6171 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006172 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006173 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006174 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006175 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006176 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006177 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006178 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006179 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006180 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006181 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006182 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006183 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006184 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006185 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006186
Bill Schmidt778d3872013-07-26 01:36:11 +00006187 case llvm::Triple::ppc64le:
6188 switch (os) {
6189 case llvm::Triple::Linux:
6190 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6191 default:
6192 return new PPC64TargetInfo(Triple);
6193 }
6194
Peter Collingbournec947aae2012-05-20 23:28:41 +00006195 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006196 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006197 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006198 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006199
Eli Friedmand13b41e2012-10-12 23:32:00 +00006200 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006201 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006202
Daniel Dunbar52322032009-08-18 05:47:58 +00006203 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006204 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006205 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006206 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006207 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006208 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006209 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006210 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006211 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006212 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006213 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006214 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006215 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006216 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006217 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006218 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006219 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006220
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006221 case llvm::Triple::sparcv9:
6222 switch (os) {
6223 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006224 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006225 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006226 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006227 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006228 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006229 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006230 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006231 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006232 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006233 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006234 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006235 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006236 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006237 }
6238
Ulrich Weigand47445072013-05-06 16:26:41 +00006239 case llvm::Triple::systemz:
6240 switch (os) {
6241 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006242 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006243 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006244 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006245 }
6246
Eli Friedmana9c3d712009-08-19 20:47:07 +00006247 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006248 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006249
Daniel Dunbar52322032009-08-18 05:47:58 +00006250 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006251 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006252 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006253
Daniel Dunbar52322032009-08-18 05:47:58 +00006254 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00006255 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006256 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006257 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006258 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006259 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006260 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006261 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006262 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006263 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006264 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006265 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006266 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006267 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006268 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006269 case llvm::Triple::KFreeBSD:
6270 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006271 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006272 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006273 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006274 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006275 case llvm::Triple::Win32: {
6276 switch (Triple.getEnvironment()) {
6277 default:
6278 return new X86_32TargetInfo(Triple);
6279 case llvm::Triple::Cygnus:
6280 return new CygwinX86_32TargetInfo(Triple);
6281 case llvm::Triple::GNU:
6282 return new MinGWX86_32TargetInfo(Triple);
6283 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006284 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006285 }
6286 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006287 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006288 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006289 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006290 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006291 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006292 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006293 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006294 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006295 }
6296
6297 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006298 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006299 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006300
Daniel Dunbar52322032009-08-18 05:47:58 +00006301 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00006302 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006303 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006304 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006305 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006306 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006307 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006308 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006309 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006310 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006311 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006312 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006313 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006314 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006315 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006316 case llvm::Triple::KFreeBSD:
6317 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006318 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006319 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006320 case llvm::Triple::Win32: {
6321 switch (Triple.getEnvironment()) {
6322 default:
6323 return new X86_64TargetInfo(Triple);
6324 case llvm::Triple::GNU:
6325 return new MinGWX86_64TargetInfo(Triple);
6326 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006327 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006328 }
6329 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006330 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006331 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006332 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006333 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006334 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006335
6336 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006337 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006338 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006339 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006340 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006341 }
6342 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006343 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006344 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006345 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006346 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006347 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006348 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006349}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006350
6351/// CreateTargetInfo - Return the target info object for the specified target
6352/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00006353TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregorf8715de2012-11-16 04:24:59 +00006354 TargetOptions *Opts) {
6355 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006356
6357 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006358 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006359 if (!Target) {
6360 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006361 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006362 }
Douglas Gregorbc10b9f2012-10-15 16:45:32 +00006363 Target->setTargetOpts(Opts);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006364
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006365 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006366 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6367 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006368 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006369 }
6370
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006371 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006372 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6373 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006374 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006375 }
6376
Rafael Espindolaeb265472013-08-21 21:59:03 +00006377 // Set the fp math unit.
6378 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6379 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006380 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006381 }
6382
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006383 // Compute the default target features, we need the target to handle this
6384 // because features may have dependencies on one another.
6385 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006386 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006387
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006388 // Apply the user specified deltas.
6389 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6390 I < N; ++I) {
6391 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006392 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006393 bool Enabled = Name[0] == '+';
6394 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006395 }
6396
6397 // Add the features to the compile options.
6398 //
6399 // FIXME: If we are completely confident that we have the right set, we only
6400 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006401 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006402 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6403 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006404 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006405 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006406 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006407
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006408 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006409}