blob: 259d6ba6962547b9a932bd293413832275a59066 [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;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000358 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000359
Craig Topper3164f332014-03-11 03:39:26 +0000360 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000361 return ".text.startup";
362 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000363};
364
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000365// NetBSD Target
366template<typename Target>
367class NetBSDTargetInfo : public OSTargetInfo<Target> {
368protected:
Craig Topper3164f332014-03-11 03:39:26 +0000369 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
370 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000371 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000372 Builder.defineMacro("__NetBSD__");
373 Builder.defineMacro("__unix__");
374 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000375 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000376 Builder.defineMacro("_POSIX_THREADS");
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000377 }
378public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000379 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
380 this->UserLabelPrefix = "";
381 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000382};
383
Torok Edwinb2b37c62009-06-30 17:10:35 +0000384// OpenBSD Target
385template<typename Target>
386class OpenBSDTargetInfo : public OSTargetInfo<Target> {
387protected:
Craig Topper3164f332014-03-11 03:39:26 +0000388 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
389 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000390 // OpenBSD defines; list based off of gcc output
391
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000392 Builder.defineMacro("__OpenBSD__");
393 DefineStd(Builder, "unix", Opts);
394 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000395 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000396 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000397 }
398public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000399 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
400 this->UserLabelPrefix = "";
401 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000402
Eli Friedman3715d1f2011-12-15 02:15:56 +0000403 switch (Triple.getArch()) {
404 default:
405 case llvm::Triple::x86:
406 case llvm::Triple::x86_64:
407 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000408 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000409 this->MCountName = "__mcount";
410 break;
411 case llvm::Triple::mips64:
412 case llvm::Triple::mips64el:
413 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000414 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000415 this->MCountName = "_mcount";
416 break;
417 }
418 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000419};
420
Eli Friedman9fa28852012-08-08 23:57:20 +0000421// Bitrig Target
422template<typename Target>
423class BitrigTargetInfo : public OSTargetInfo<Target> {
424protected:
Craig Topper3164f332014-03-11 03:39:26 +0000425 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
426 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000427 // Bitrig defines; list based off of gcc output
428
429 Builder.defineMacro("__Bitrig__");
430 DefineStd(Builder, "unix", Opts);
431 Builder.defineMacro("__ELF__");
432 if (Opts.POSIXThreads)
433 Builder.defineMacro("_REENTRANT");
434 }
435public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000436 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
437 this->UserLabelPrefix = "";
438 this->TLSSupported = false;
439 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000440 }
441};
442
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000443// PSP Target
444template<typename Target>
445class PSPTargetInfo : public OSTargetInfo<Target> {
446protected:
Craig Topper3164f332014-03-11 03:39:26 +0000447 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
448 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000449 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000450 Builder.defineMacro("PSP");
451 Builder.defineMacro("_PSP");
452 Builder.defineMacro("__psp__");
453 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000454 }
455public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000456 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000457 this->UserLabelPrefix = "";
458 }
459};
460
John Thompsone467e192009-11-19 17:18:50 +0000461// PS3 PPU Target
462template<typename Target>
463class PS3PPUTargetInfo : public OSTargetInfo<Target> {
464protected:
Craig Topper3164f332014-03-11 03:39:26 +0000465 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
466 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000467 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000468 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000469 Builder.defineMacro("__PPU__");
470 Builder.defineMacro("__CELLOS_LV2__");
471 Builder.defineMacro("__ELF__");
472 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000473 Builder.defineMacro("_ARCH_PPC64");
474 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000475 }
476public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000477 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000478 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000479 this->LongWidth = this->LongAlign = 32;
480 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000481 this->IntMaxType = TargetInfo::SignedLongLong;
482 this->UIntMaxType = TargetInfo::UnsignedLongLong;
483 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000484 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000485 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000486 }
487};
488
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000489// AuroraUX target
490template<typename Target>
491class AuroraUXTargetInfo : public OSTargetInfo<Target> {
492protected:
Craig Topper3164f332014-03-11 03:39:26 +0000493 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
494 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000495 DefineStd(Builder, "sun", Opts);
496 DefineStd(Builder, "unix", Opts);
497 Builder.defineMacro("__ELF__");
498 Builder.defineMacro("__svr4__");
499 Builder.defineMacro("__SVR4");
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000500 }
501public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000502 AuroraUXTargetInfo(const llvm::Triple &Triple)
503 : OSTargetInfo<Target>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +0000504 this->UserLabelPrefix = "";
505 this->WCharType = this->SignedLong;
506 // FIXME: WIntType should be SignedLong
507 }
508};
509
Torok Edwinb2b37c62009-06-30 17:10:35 +0000510// Solaris target
511template<typename Target>
512class SolarisTargetInfo : public OSTargetInfo<Target> {
513protected:
Craig Topper3164f332014-03-11 03:39:26 +0000514 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
515 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000516 DefineStd(Builder, "sun", Opts);
517 DefineStd(Builder, "unix", Opts);
518 Builder.defineMacro("__ELF__");
519 Builder.defineMacro("__svr4__");
520 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000521 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
522 // newer, but to 500 for everything else. feature_test.h has a check to
523 // ensure that you are not using C99 with an old version of X/Open or C89
524 // with a new version.
525 if (Opts.C99 || Opts.C11)
526 Builder.defineMacro("_XOPEN_SOURCE", "600");
527 else
528 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000529 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000530 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000531 Builder.defineMacro("_LARGEFILE_SOURCE");
532 Builder.defineMacro("_LARGEFILE64_SOURCE");
533 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000534 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000535 }
536public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000537 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000538 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000539 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000540 // FIXME: WIntType should be SignedLong
541 }
542};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000543
544// Windows target
545template<typename Target>
546class WindowsTargetInfo : public OSTargetInfo<Target> {
547protected:
Craig Topper3164f332014-03-11 03:39:26 +0000548 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
549 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000550 Builder.defineMacro("_WIN32");
551 }
552 void getVisualStudioDefines(const LangOptions &Opts,
553 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000554 if (Opts.CPlusPlus) {
555 if (Opts.RTTI)
556 Builder.defineMacro("_CPPRTTI");
557
558 if (Opts.Exceptions)
559 Builder.defineMacro("_CPPUNWIND");
560 }
561
562 if (!Opts.CharIsSigned)
563 Builder.defineMacro("_CHAR_UNSIGNED");
564
565 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
566 // but it works for now.
567 if (Opts.POSIXThreads)
568 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000569
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000570 if (Opts.MSCVersion != 0)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000571 Builder.defineMacro("_MSC_VER", Twine(Opts.MSCVersion));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000572
Francois Pichet0706d202011-09-17 17:15:52 +0000573 if (Opts.MicrosoftExt) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000574 Builder.defineMacro("_MSC_EXTENSIONS");
575
Richard Smith2bf7fdb2013-01-02 11:42:31 +0000576 if (Opts.CPlusPlus11) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000577 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
578 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
579 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
580 }
581 }
582
583 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000584 }
585
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000586public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000587 WindowsTargetInfo(const llvm::Triple &Triple)
588 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000589};
590
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000591template <typename Target>
592class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000593protected:
Craig Topper3164f332014-03-11 03:39:26 +0000594 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
595 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000596 if (Opts.POSIXThreads)
597 Builder.defineMacro("_REENTRANT");
598 if (Opts.CPlusPlus)
599 Builder.defineMacro("_GNU_SOURCE");
600
601 DefineStd(Builder, "unix", Opts);
602 Builder.defineMacro("__ELF__");
603 Builder.defineMacro("__native_client__");
604 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000605
606public:
607 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000608 this->UserLabelPrefix = "";
609 this->LongAlign = 32;
610 this->LongWidth = 32;
611 this->PointerAlign = 32;
612 this->PointerWidth = 32;
613 this->IntMaxType = TargetInfo::SignedLongLong;
614 this->UIntMaxType = TargetInfo::UnsignedLongLong;
615 this->Int64Type = TargetInfo::SignedLongLong;
616 this->DoubleAlign = 64;
617 this->LongDoubleWidth = 64;
618 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000619 this->LongLongWidth = 64;
620 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000621 this->SizeType = TargetInfo::UnsignedInt;
622 this->PtrDiffType = TargetInfo::SignedInt;
623 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000624 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000625 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000626 if (Triple.getArch() == llvm::Triple::arm) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000627 this->DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000628 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000629 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000630 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000631 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000632 } else if (Triple.getArch() == llvm::Triple::mipsel) {
633 // Handled on mips' setDescriptionString.
634 } else {
635 assert(Triple.getArch() == llvm::Triple::le32);
636 this->DescriptionString = "e-p:32:32-i64:64";
637 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000638 }
Craig Topper3164f332014-03-11 03:39:26 +0000639 typename Target::CallingConvCheckResult checkCallingConvention(
640 CallingConv CC) const override {
Derek Schuffa2020962012-10-16 22:30:41 +0000641 return CC == CC_PnaclCall ? Target::CCCR_OK :
642 Target::checkCallingConvention(CC);
643 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000644};
Mike Stump11289f42009-09-09 15:08:12 +0000645} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000646
Chris Lattner09d98f52008-10-05 21:50:58 +0000647//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000648// Specific target implementations.
649//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000650
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000651namespace {
652// PPC abstract base class
653class PPCTargetInfo : public TargetInfo {
654 static const Builtin::Info BuiltinInfo[];
655 static const char * const GCCRegNames[];
656 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000657 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000658
659 // Target cpu features.
660 bool HasVSX;
661
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000662public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000663 PPCTargetInfo(const llvm::Triple &Triple)
664 : TargetInfo(Triple), HasVSX(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000665 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000666 LongDoubleWidth = LongDoubleAlign = 128;
667 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
668 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000669
Hal Finkel6b984f02012-07-03 16:51:04 +0000670 /// \brief Flags for architecture specific defines.
671 typedef enum {
672 ArchDefineNone = 0,
673 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
674 ArchDefinePpcgr = 1 << 1,
675 ArchDefinePpcsq = 1 << 2,
676 ArchDefine440 = 1 << 3,
677 ArchDefine603 = 1 << 4,
678 ArchDefine604 = 1 << 5,
679 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000680 ArchDefinePwr5 = 1 << 7,
681 ArchDefinePwr5x = 1 << 8,
682 ArchDefinePwr6 = 1 << 9,
683 ArchDefinePwr6x = 1 << 10,
684 ArchDefinePwr7 = 1 << 11,
685 ArchDefineA2 = 1 << 12,
686 ArchDefineA2q = 1 << 13
Hal Finkel6b984f02012-07-03 16:51:04 +0000687 } ArchDefineTypes;
688
Bill Schmidt38378a02013-02-01 20:23:10 +0000689 // Note: GCC recognizes the following additional cpus:
690 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
691 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
692 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000693 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000694 bool CPUKnown = llvm::StringSwitch<bool>(Name)
695 .Case("generic", true)
696 .Case("440", true)
697 .Case("450", true)
698 .Case("601", true)
699 .Case("602", true)
700 .Case("603", true)
701 .Case("603e", true)
702 .Case("603ev", true)
703 .Case("604", true)
704 .Case("604e", true)
705 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000706 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000707 .Case("g3", true)
708 .Case("7400", true)
709 .Case("g4", true)
710 .Case("7450", true)
711 .Case("g4+", true)
712 .Case("750", true)
713 .Case("970", true)
714 .Case("g5", true)
715 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000716 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000717 .Case("e500mc", true)
718 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000719 .Case("power3", true)
720 .Case("pwr3", true)
721 .Case("power4", true)
722 .Case("pwr4", true)
723 .Case("power5", true)
724 .Case("pwr5", true)
725 .Case("power5x", true)
726 .Case("pwr5x", true)
727 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000728 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000729 .Case("power6x", true)
730 .Case("pwr6x", true)
731 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000732 .Case("pwr7", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000733 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000734 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000735 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000736 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000737 .Case("powerpc64le", true)
738 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000739 .Default(false);
740
741 if (CPUKnown)
742 CPU = Name;
743
744 return CPUKnown;
745 }
746
Craig Topper3164f332014-03-11 03:39:26 +0000747 void getTargetBuiltins(const Builtin::Info *&Records,
748 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000749 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000750 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000751 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000752
Craig Topper3164f332014-03-11 03:39:26 +0000753 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000754
Craig Topper3164f332014-03-11 03:39:26 +0000755 void getTargetDefines(const LangOptions &Opts,
756 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000757
Craig Topper3164f332014-03-11 03:39:26 +0000758 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000759
Craig Topper3164f332014-03-11 03:39:26 +0000760 bool handleTargetFeatures(std::vector<std::string> &Features,
761 DiagnosticsEngine &Diags) override;
762 bool hasFeature(StringRef Feature) const override;
763
764 void getGCCRegNames(const char * const *&Names,
765 unsigned &NumNames) const override;
766 void getGCCRegAliases(const GCCRegAlias *&Aliases,
767 unsigned &NumAliases) const override;
768 bool validateAsmConstraint(const char *&Name,
769 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000770 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000771 default: return false;
772 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000773 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000774 case 'b': // Base register
775 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000776 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000777 break;
778 // FIXME: The following are added to allow parsing.
779 // I just took a guess at what the actions should be.
780 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000781 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000782 case 'v': // Altivec vector register
783 Info.setAllowsRegister();
784 break;
785 case 'w':
786 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000787 case 'd':// VSX vector register to hold vector double data
788 case 'f':// VSX vector register to hold vector float data
789 case 's':// VSX vector register to hold scalar float data
790 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000791 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000792 break;
793 default:
794 return false;
795 }
796 Info.setAllowsRegister();
797 Name++; // Skip over 'w'.
798 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000799 case 'h': // `MQ', `CTR', or `LINK' register
800 case 'q': // `MQ' register
801 case 'c': // `CTR' register
802 case 'l': // `LINK' register
803 case 'x': // `CR' register (condition register) number 0
804 case 'y': // `CR' register (condition register)
805 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000806 Info.setAllowsRegister();
807 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000808 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000809 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000810 // (use `L' instead for SImode constants)
811 case 'K': // Unsigned 16-bit constant
812 case 'L': // Signed 16-bit constant shifted left 16 bits
813 case 'M': // Constant larger than 31
814 case 'N': // Exact power of 2
815 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000816 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000817 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000818 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000819 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000820 break;
821 case 'm': // Memory operand. Note that on PowerPC targets, m can
822 // include addresses that update the base register. It
823 // is therefore only safe to use `m' in an asm statement
824 // if that asm statement accesses the operand exactly once.
825 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000826 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000827 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000828 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000829 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000830 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
831 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000832 // register to be updated.
833 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000834 if (Name[1] != 's')
835 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000836 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000837 // include any automodification of the base register. Unlike
838 // `m', this constraint can be used in asm statements that
839 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000840 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000841 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000842 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000843 break;
844 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000845 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000846 case 'Z': // Memory operand that is an indexed or indirect from a
847 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000848 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000849 Info.setAllowsMemory();
850 Info.setAllowsRegister();
851 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000852 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000853 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000854 // register (`p' is preferable for asm statements)
855 case 'S': // Constant suitable as a 64-bit mask operand
856 case 'T': // Constant suitable as a 32-bit mask operand
857 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000858 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000859 // instructions
860 case 'W': // Vector constant that does not require memory
861 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000862 break;
863 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000864 }
John Thompson07a61a42010-06-24 22:44:13 +0000865 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000866 }
Craig Topper3164f332014-03-11 03:39:26 +0000867 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000868 std::string R;
869 switch (*Constraint) {
870 case 'e':
871 case 'w':
872 // Two-character constraint; add "^" hint for later parsing.
873 R = std::string("^") + std::string(Constraint, 2);
874 Constraint++;
875 break;
876 default:
877 return TargetInfo::convertConstraint(Constraint);
878 }
879 return R;
880 }
Craig Topper3164f332014-03-11 03:39:26 +0000881 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000882 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000883 }
Craig Topper3164f332014-03-11 03:39:26 +0000884 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000885 if (RegNo == 0) return 3;
886 if (RegNo == 1) return 4;
887 return -1;
888 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000889};
Anders Carlssonf511f642007-11-27 04:11:28 +0000890
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000891const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000892#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000893#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000894 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000895#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000896};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000897
Eric Christopher3ff21b32013-10-16 21:26:26 +0000898 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000899/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000900bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000901 DiagnosticsEngine &Diags) {
902 // Remember the maximum enabled sselevel.
903 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
904 // Ignore disabled features.
905 if (Features[i][0] == '-')
906 continue;
907
908 StringRef Feature = StringRef(Features[i]).substr(1);
909
910 if (Feature == "vsx") {
911 HasVSX = true;
912 continue;
913 }
914
915 // TODO: Finish this list and add an assert that we've handled them
916 // all.
917 }
918
919 return true;
920}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000921
Chris Lattnerecd49032009-03-02 22:27:17 +0000922/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
923/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000924void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000925 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000926 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000927 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000928 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000929 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000930 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000931 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000932 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000933 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000934 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000935 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000936 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000937 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000938
Chris Lattnerecd49032009-03-02 22:27:17 +0000939 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000940 if (getTriple().getArch() == llvm::Triple::ppc64le) {
941 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000942 } else {
943 if (getTriple().getOS() != llvm::Triple::NetBSD &&
944 getTriple().getOS() != llvm::Triple::OpenBSD)
945 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000946 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000947
Chris Lattnerecd49032009-03-02 22:27:17 +0000948 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000949 Builder.defineMacro("__NATURAL_ALIGNMENT__");
950 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000951
Chris Lattnerecd49032009-03-02 22:27:17 +0000952 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000953 if (LongDoubleWidth == 128)
954 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000955
John Thompsone467e192009-11-19 17:18:50 +0000956 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000957 Builder.defineMacro("__VEC__", "10206");
958 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000959 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000960
961 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000962 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
963 .Case("440", ArchDefineName)
964 .Case("450", ArchDefineName | ArchDefine440)
965 .Case("601", ArchDefineName)
966 .Case("602", ArchDefineName | ArchDefinePpcgr)
967 .Case("603", ArchDefineName | ArchDefinePpcgr)
968 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
969 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
970 .Case("604", ArchDefineName | ArchDefinePpcgr)
971 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
972 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +0000973 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +0000974 .Case("7400", ArchDefineName | ArchDefinePpcgr)
975 .Case("7450", ArchDefineName | ArchDefinePpcgr)
976 .Case("750", ArchDefineName | ArchDefinePpcgr)
977 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
978 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000979 .Case("a2", ArchDefineA2)
980 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +0000981 .Case("pwr3", ArchDefinePpcgr)
982 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
983 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
984 | ArchDefinePpcsq)
985 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
986 | ArchDefinePpcgr | ArchDefinePpcsq)
987 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
988 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
989 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
990 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
991 | ArchDefinePpcsq)
992 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
993 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
994 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
995 .Case("power3", ArchDefinePpcgr)
996 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
997 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
998 | ArchDefinePpcsq)
999 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1000 | ArchDefinePpcgr | ArchDefinePpcsq)
1001 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1002 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1003 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1004 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1005 | ArchDefinePpcsq)
1006 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1007 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1008 | ArchDefinePwr6 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001009 .Default(ArchDefineNone);
1010
1011 if (defs & ArchDefineName)
1012 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1013 if (defs & ArchDefinePpcgr)
1014 Builder.defineMacro("_ARCH_PPCGR");
1015 if (defs & ArchDefinePpcsq)
1016 Builder.defineMacro("_ARCH_PPCSQ");
1017 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001018 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001019 if (defs & ArchDefine603)
1020 Builder.defineMacro("_ARCH_603");
1021 if (defs & ArchDefine604)
1022 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001023 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001024 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001025 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001026 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001027 if (defs & ArchDefinePwr5x)
1028 Builder.defineMacro("_ARCH_PWR5X");
1029 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001030 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001031 if (defs & ArchDefinePwr6x)
1032 Builder.defineMacro("_ARCH_PWR6X");
1033 if (defs & ArchDefinePwr7)
1034 Builder.defineMacro("_ARCH_PWR7");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001035 if (defs & ArchDefineA2)
1036 Builder.defineMacro("_ARCH_A2");
1037 if (defs & ArchDefineA2q) {
1038 Builder.defineMacro("_ARCH_A2Q");
1039 Builder.defineMacro("_ARCH_QP");
1040 }
1041
1042 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1043 Builder.defineMacro("__bg__");
1044 Builder.defineMacro("__THW_BLUEGENE__");
1045 Builder.defineMacro("__bgq__");
1046 Builder.defineMacro("__TOS_BGQ__");
1047 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001048
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001049 if (HasVSX)
1050 Builder.defineMacro("__VSX__");
1051
Bill Schmidt38378a02013-02-01 20:23:10 +00001052 // FIXME: The following are not yet generated here by Clang, but are
1053 // generated by GCC:
1054 //
1055 // _SOFT_FLOAT_
1056 // __RECIP_PRECISION__
1057 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001058 // __RECIP__
1059 // __RECIPF__
1060 // __RSQRTE__
1061 // __RSQRTEF__
1062 // _SOFT_DOUBLE_
1063 // __NO_LWSYNC__
1064 // __HAVE_BSWAP__
1065 // __LONGDOUBLE128
1066 // __CMODEL_MEDIUM__
1067 // __CMODEL_LARGE__
1068 // _CALL_SYSV
1069 // _CALL_DARWIN
1070 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001071}
1072
1073void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1074 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1075 .Case("7400", true)
1076 .Case("g4", true)
1077 .Case("7450", true)
1078 .Case("g4+", true)
1079 .Case("970", true)
1080 .Case("g5", true)
1081 .Case("pwr6", true)
1082 .Case("pwr7", true)
1083 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001084 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001085 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001086
1087 Features["qpx"] = (CPU == "a2q");
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001088}
1089
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001090bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1091 return Feature == "powerpc";
1092}
Chris Lattner17df24e2008-04-21 18:56:49 +00001093
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001094
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001095const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001096 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1097 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1098 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1099 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1100 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1101 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1102 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1103 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001104 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001105 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001106 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001107 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1108 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1109 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1110 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001111 "vrsave", "vscr",
1112 "spe_acc", "spefscr",
1113 "sfp"
1114};
Chris Lattner10a5b382007-01-29 05:24:35 +00001115
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001116void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001117 unsigned &NumNames) const {
1118 Names = GCCRegNames;
1119 NumNames = llvm::array_lengthof(GCCRegNames);
1120}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001121
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001122const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1123 // While some of these aliases do map to different registers
1124 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001125 { { "0" }, "r0" },
1126 { { "1"}, "r1" },
1127 { { "2" }, "r2" },
1128 { { "3" }, "r3" },
1129 { { "4" }, "r4" },
1130 { { "5" }, "r5" },
1131 { { "6" }, "r6" },
1132 { { "7" }, "r7" },
1133 { { "8" }, "r8" },
1134 { { "9" }, "r9" },
1135 { { "10" }, "r10" },
1136 { { "11" }, "r11" },
1137 { { "12" }, "r12" },
1138 { { "13" }, "r13" },
1139 { { "14" }, "r14" },
1140 { { "15" }, "r15" },
1141 { { "16" }, "r16" },
1142 { { "17" }, "r17" },
1143 { { "18" }, "r18" },
1144 { { "19" }, "r19" },
1145 { { "20" }, "r20" },
1146 { { "21" }, "r21" },
1147 { { "22" }, "r22" },
1148 { { "23" }, "r23" },
1149 { { "24" }, "r24" },
1150 { { "25" }, "r25" },
1151 { { "26" }, "r26" },
1152 { { "27" }, "r27" },
1153 { { "28" }, "r28" },
1154 { { "29" }, "r29" },
1155 { { "30" }, "r30" },
1156 { { "31" }, "r31" },
1157 { { "fr0" }, "f0" },
1158 { { "fr1" }, "f1" },
1159 { { "fr2" }, "f2" },
1160 { { "fr3" }, "f3" },
1161 { { "fr4" }, "f4" },
1162 { { "fr5" }, "f5" },
1163 { { "fr6" }, "f6" },
1164 { { "fr7" }, "f7" },
1165 { { "fr8" }, "f8" },
1166 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001167 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001168 { { "fr11" }, "f11" },
1169 { { "fr12" }, "f12" },
1170 { { "fr13" }, "f13" },
1171 { { "fr14" }, "f14" },
1172 { { "fr15" }, "f15" },
1173 { { "fr16" }, "f16" },
1174 { { "fr17" }, "f17" },
1175 { { "fr18" }, "f18" },
1176 { { "fr19" }, "f19" },
1177 { { "fr20" }, "f20" },
1178 { { "fr21" }, "f21" },
1179 { { "fr22" }, "f22" },
1180 { { "fr23" }, "f23" },
1181 { { "fr24" }, "f24" },
1182 { { "fr25" }, "f25" },
1183 { { "fr26" }, "f26" },
1184 { { "fr27" }, "f27" },
1185 { { "fr28" }, "f28" },
1186 { { "fr29" }, "f29" },
1187 { { "fr30" }, "f30" },
1188 { { "fr31" }, "f31" },
1189 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001190};
1191
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001192void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001193 unsigned &NumAliases) const {
1194 Aliases = GCCRegAliases;
1195 NumAliases = llvm::array_lengthof(GCCRegAliases);
1196}
1197} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001198
Chris Lattner5ba61f02006-10-14 07:39:34 +00001199namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001200class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001201public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001202 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001203 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001204
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001205 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001206 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001207 case llvm::Triple::FreeBSD:
1208 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001209 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001210 PtrDiffType = SignedInt;
1211 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001212 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001213 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001214 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001215 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001216
Roman Divacky3ffe7462012-03-13 19:20:17 +00001217 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1218 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001219 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001220 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001221
1222 // PPC32 supports atomics up to 4 bytes.
1223 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001224 }
1225
Craig Topper3164f332014-03-11 03:39:26 +00001226 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001227 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001228 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001229 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001230};
1231} // end anonymous namespace.
1232
Bill Schmidt778d3872013-07-26 01:36:11 +00001233// Note: ABI differences may eventually require us to have a separate
1234// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001235namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001236class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001237public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001238 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001239 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001240 IntMaxType = SignedLong;
1241 UIntMaxType = UnsignedLong;
1242 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001243
Roman Divacky3ffe7462012-03-13 19:20:17 +00001244 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1245 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001246 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001247 DescriptionString = "E-m:e-i64:64-n32:64";
Bill Schmidtcec4cb12012-10-29 14:59:24 +00001248 } else
Rafael Espindolac418ae92014-01-03 19:22:05 +00001249 DescriptionString = "E-m:e-i64:64-n32:64";
Benjamin Kramer37196de2012-11-17 17:30:55 +00001250
1251 // PPC64 supports atomics up to 8 bytes.
1252 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001253 }
Craig Topper3164f332014-03-11 03:39:26 +00001254 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001255 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001256 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001257};
1258} // end anonymous namespace.
1259
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001260
1261namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001262class DarwinPPC32TargetInfo :
1263 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001264public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001265 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1266 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001267 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001268 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherc04fe092013-10-16 21:19:19 +00001269 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001270 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001271 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001272 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001273 }
Craig Topper3164f332014-03-11 03:39:26 +00001274 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001275 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001276 }
1277};
1278
1279class DarwinPPC64TargetInfo :
1280 public DarwinTargetInfo<PPC64TargetInfo> {
1281public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001282 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1283 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001284 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001285 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001286 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001287 }
1288};
1289} // end anonymous namespace.
1290
Chris Lattner5ba61f02006-10-14 07:39:34 +00001291namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001292 static const unsigned NVPTXAddrSpaceMap[] = {
1293 1, // opencl_global
1294 3, // opencl_local
1295 4, // opencl_constant
1296 1, // cuda_device
1297 4, // cuda_constant
1298 3, // cuda_shared
1299 };
1300 class NVPTXTargetInfo : public TargetInfo {
1301 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001302 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001303 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001304 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001305 BigEndian = false;
1306 TLSSupported = false;
1307 LongWidth = LongAlign = 64;
1308 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001309 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001310 // Define available target features
1311 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001312 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001313 }
Craig Topper3164f332014-03-11 03:39:26 +00001314 void getTargetDefines(const LangOptions &Opts,
1315 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001316 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001317 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001318 }
Craig Topper3164f332014-03-11 03:39:26 +00001319 void getTargetBuiltins(const Builtin::Info *&Records,
1320 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001321 Records = BuiltinInfo;
1322 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001323 }
Craig Topper3164f332014-03-11 03:39:26 +00001324 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001325 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001326 }
Craig Topper3164f332014-03-11 03:39:26 +00001327
1328 void getGCCRegNames(const char * const *&Names,
1329 unsigned &NumNames) const override;
1330 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1331 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001332 // No aliases.
1333 Aliases = 0;
1334 NumAliases = 0;
1335 }
Craig Topper3164f332014-03-11 03:39:26 +00001336 bool validateAsmConstraint(const char *&Name,
1337 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001338 switch (*Name) {
1339 default: return false;
1340 case 'c':
1341 case 'h':
1342 case 'r':
1343 case 'l':
1344 case 'f':
1345 case 'd':
1346 Info.setAllowsRegister();
1347 return true;
1348 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001349 }
Craig Topper3164f332014-03-11 03:39:26 +00001350 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001351 // FIXME: Is this really right?
1352 return "";
1353 }
Craig Topper3164f332014-03-11 03:39:26 +00001354 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001355 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001356 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001357 }
Craig Topper3164f332014-03-11 03:39:26 +00001358 bool setCPU(const std::string &Name) override {
Justin Holewinski91203e82013-03-30 14:38:26 +00001359 bool Valid = llvm::StringSwitch<bool>(Name)
1360 .Case("sm_20", true)
1361 .Case("sm_21", true)
1362 .Case("sm_30", true)
1363 .Case("sm_35", true)
1364 .Default(false);
1365
1366 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001367 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001368 };
1369
1370 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1371#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1372#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1373 ALL_LANGUAGES },
1374#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001375 };
1376
1377 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1378 "r0"
1379 };
1380
1381 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1382 unsigned &NumNames) const {
1383 Names = GCCRegNames;
1384 NumNames = llvm::array_lengthof(GCCRegNames);
1385 }
1386
1387 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1388 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001389 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001390 PointerWidth = PointerAlign = 32;
Justin Holewinski83e96682012-05-24 17:43:12 +00001391 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001392 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001393 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001394 };
1395
1396 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1397 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001398 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001399 PointerWidth = PointerAlign = 64;
Justin Holewinski83e96682012-05-24 17:43:12 +00001400 SizeType = PtrDiffType = IntPtrType = TargetInfo::UnsignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001401 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001402 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001403 };
1404}
1405
1406namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001407
1408static const unsigned R600AddrSpaceMap[] = {
1409 1, // opencl_global
1410 3, // opencl_local
1411 2, // opencl_constant
1412 1, // cuda_device
1413 2, // cuda_constant
1414 3 // cuda_shared
1415};
1416
Tom Stellardc74b1e02013-03-04 17:40:53 +00001417static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001418 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1419 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001420
1421static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001422 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1423 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001424
1425static const char *DescriptionStringSI =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001426 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:32:32-p5:64:64"
1427 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1428 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001429
Eli Friedmand13b41e2012-10-12 23:32:00 +00001430class R600TargetInfo : public TargetInfo {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001431 /// \brief The GPU profiles supported by the R600 target.
1432 enum GPUKind {
1433 GK_NONE,
1434 GK_R600,
1435 GK_R600_DOUBLE_OPS,
1436 GK_R700,
1437 GK_R700_DOUBLE_OPS,
1438 GK_EVERGREEN,
1439 GK_EVERGREEN_DOUBLE_OPS,
1440 GK_NORTHERN_ISLANDS,
1441 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001442 GK_SOUTHERN_ISLANDS,
1443 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001444 } GPU;
1445
Eli Friedmand13b41e2012-10-12 23:32:00 +00001446public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001447 R600TargetInfo(const llvm::Triple &Triple)
1448 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001449 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001450 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001451 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001452 }
1453
Craig Topper3164f332014-03-11 03:39:26 +00001454 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001455 return "";
1456 }
1457
Craig Topper3164f332014-03-11 03:39:26 +00001458 void getGCCRegNames(const char * const *&Names,
1459 unsigned &numNames) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001460 Names = NULL;
1461 numNames = 0;
1462 }
1463
Craig Topper3164f332014-03-11 03:39:26 +00001464 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1465 unsigned &NumAliases) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001466 Aliases = NULL;
1467 NumAliases = 0;
1468 }
1469
Craig Topper3164f332014-03-11 03:39:26 +00001470 bool validateAsmConstraint(const char *&Name,
1471 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001472 return true;
1473 }
1474
Craig Topper3164f332014-03-11 03:39:26 +00001475 void getTargetBuiltins(const Builtin::Info *&Records,
1476 unsigned &NumRecords) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001477 Records = NULL;
1478 NumRecords = 0;
1479 }
1480
1481
Craig Topper3164f332014-03-11 03:39:26 +00001482 void getTargetDefines(const LangOptions &Opts,
1483 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001484 Builder.defineMacro("__R600__");
1485 }
1486
Craig Topper3164f332014-03-11 03:39:26 +00001487 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001488 return TargetInfo::CharPtrBuiltinVaList;
1489 }
1490
Craig Topper3164f332014-03-11 03:39:26 +00001491 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001492 GPU = llvm::StringSwitch<GPUKind>(Name)
1493 .Case("r600" , GK_R600)
1494 .Case("rv610", GK_R600)
1495 .Case("rv620", GK_R600)
1496 .Case("rv630", GK_R600)
1497 .Case("rv635", GK_R600)
1498 .Case("rs780", GK_R600)
1499 .Case("rs880", GK_R600)
1500 .Case("rv670", GK_R600_DOUBLE_OPS)
1501 .Case("rv710", GK_R700)
1502 .Case("rv730", GK_R700)
1503 .Case("rv740", GK_R700_DOUBLE_OPS)
1504 .Case("rv770", GK_R700_DOUBLE_OPS)
1505 .Case("palm", GK_EVERGREEN)
1506 .Case("cedar", GK_EVERGREEN)
1507 .Case("sumo", GK_EVERGREEN)
1508 .Case("sumo2", GK_EVERGREEN)
1509 .Case("redwood", GK_EVERGREEN)
1510 .Case("juniper", GK_EVERGREEN)
1511 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1512 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1513 .Case("barts", GK_NORTHERN_ISLANDS)
1514 .Case("turks", GK_NORTHERN_ISLANDS)
1515 .Case("caicos", GK_NORTHERN_ISLANDS)
1516 .Case("cayman", GK_CAYMAN)
1517 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001518 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001519 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1520 .Case("verde", GK_SOUTHERN_ISLANDS)
1521 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001522 .Case("bonaire", GK_SEA_ISLANDS)
1523 .Case("kabini", GK_SEA_ISLANDS)
1524 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001525 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001526 .Default(GK_NONE);
1527
1528 if (GPU == GK_NONE) {
1529 return false;
1530 }
1531
1532 // Set the correct data layout
1533 switch (GPU) {
1534 case GK_NONE:
1535 case GK_R600:
1536 case GK_R700:
1537 case GK_EVERGREEN:
1538 case GK_NORTHERN_ISLANDS:
1539 DescriptionString = DescriptionStringR600;
1540 break;
1541 case GK_R600_DOUBLE_OPS:
1542 case GK_R700_DOUBLE_OPS:
1543 case GK_EVERGREEN_DOUBLE_OPS:
1544 case GK_CAYMAN:
1545 DescriptionString = DescriptionStringR600DoubleOps;
1546 break;
1547 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001548 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001549 DescriptionString = DescriptionStringSI;
1550 break;
1551 }
1552
1553 return true;
1554 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001555};
1556
1557} // end anonymous namespace
1558
1559namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001560// Namespace for x86 abstract base class
1561const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001562#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001563#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001564 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001565#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001566};
Eli Friedmanb5366062008-05-20 14:21:01 +00001567
Nuno Lopescfca1f02009-12-23 17:49:57 +00001568static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001569 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1570 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001571 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001572 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1573 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1574 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001575 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001576 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1577 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001578};
1579
Eric Christophercdd36352011-06-21 00:05:20 +00001580const TargetInfo::AddlRegName AddlRegNames[] = {
1581 { { "al", "ah", "eax", "rax" }, 0 },
1582 { { "bl", "bh", "ebx", "rbx" }, 3 },
1583 { { "cl", "ch", "ecx", "rcx" }, 2 },
1584 { { "dl", "dh", "edx", "rdx" }, 1 },
1585 { { "esi", "rsi" }, 4 },
1586 { { "edi", "rdi" }, 5 },
1587 { { "esp", "rsp" }, 7 },
1588 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001589};
1590
1591// X86 target abstract base class; x86-32 and x86-64 are very close, so
1592// most of the implementation can be shared.
1593class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001594 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001595 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001596 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001597 enum MMX3DNowEnum {
1598 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1599 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001600 enum XOPEnum {
1601 NoXOP,
1602 SSE4A,
1603 FMA4,
1604 XOP
1605 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001606
Eric Christophere1ddaf92010-04-02 23:50:19 +00001607 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001608 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001609 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001610 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001611 bool HasBMI;
1612 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001613 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001614 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001615 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001616 bool HasRDSEED;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001617 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001618 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001619 bool HasF16C;
Craig Topper679b53a2013-08-21 05:29:10 +00001620 bool HasAVX512CD, HasAVX512ER, HasAVX512PF;
Ben Langmuir58078d02013-09-19 13:22:04 +00001621 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001622 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001623
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001624 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1625 ///
1626 /// Each enumeration represents a particular CPU supported by Clang. These
1627 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1628 enum CPUKind {
1629 CK_Generic,
1630
1631 /// \name i386
1632 /// i386-generation processors.
1633 //@{
1634 CK_i386,
1635 //@}
1636
1637 /// \name i486
1638 /// i486-generation processors.
1639 //@{
1640 CK_i486,
1641 CK_WinChipC6,
1642 CK_WinChip2,
1643 CK_C3,
1644 //@}
1645
1646 /// \name i586
1647 /// i586-generation processors, P5 microarchitecture based.
1648 //@{
1649 CK_i586,
1650 CK_Pentium,
1651 CK_PentiumMMX,
1652 //@}
1653
1654 /// \name i686
1655 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1656 //@{
1657 CK_i686,
1658 CK_PentiumPro,
1659 CK_Pentium2,
1660 CK_Pentium3,
1661 CK_Pentium3M,
1662 CK_PentiumM,
1663 CK_C3_2,
1664
1665 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1666 /// Clang however has some logic to suport this.
1667 // FIXME: Warn, deprecate, and potentially remove this.
1668 CK_Yonah,
1669 //@}
1670
1671 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001672 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001673 //@{
1674 CK_Pentium4,
1675 CK_Pentium4M,
1676 CK_Prescott,
1677 CK_Nocona,
1678 //@}
1679
1680 /// \name Core
1681 /// Core microarchitecture based processors.
1682 //@{
1683 CK_Core2,
1684
1685 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1686 /// codename which GCC no longer accepts as an option to -march, but Clang
1687 /// has some logic for recognizing it.
1688 // FIXME: Warn, deprecate, and potentially remove this.
1689 CK_Penryn,
1690 //@}
1691
1692 /// \name Atom
1693 /// Atom processors
1694 //@{
1695 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001696 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001697 //@}
1698
1699 /// \name Nehalem
1700 /// Nehalem microarchitecture based processors.
1701 //@{
1702 CK_Corei7,
1703 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001704 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001705 CK_CoreAVX2,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001706 //@}
1707
Craig Topper449314e2013-08-20 07:09:39 +00001708 /// \name Knights Landing
1709 /// Knights Landing processor.
1710 CK_KNL,
1711
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001712 /// \name K6
1713 /// K6 architecture processors.
1714 //@{
1715 CK_K6,
1716 CK_K6_2,
1717 CK_K6_3,
1718 //@}
1719
1720 /// \name K7
1721 /// K7 architecture processors.
1722 //@{
1723 CK_Athlon,
1724 CK_AthlonThunderbird,
1725 CK_Athlon4,
1726 CK_AthlonXP,
1727 CK_AthlonMP,
1728 //@}
1729
1730 /// \name K8
1731 /// K8 architecture processors.
1732 //@{
1733 CK_Athlon64,
1734 CK_Athlon64SSE3,
1735 CK_AthlonFX,
1736 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001737 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001738 CK_Opteron,
1739 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001740 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001741 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001742
Benjamin Kramer569f2152012-01-10 11:50:18 +00001743 /// \name Bobcat
1744 /// Bobcat architecture processors.
1745 //@{
1746 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001747 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001748 //@}
1749
1750 /// \name Bulldozer
1751 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001752 //@{
1753 CK_BDVER1,
1754 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001755 CK_BDVER3,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001756 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001757
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001758 /// This specification is deprecated and will be removed in the future.
1759 /// Users should prefer \see CK_K8.
1760 // FIXME: Warn on this when the CPU is set to it.
1761 CK_x86_64,
1762 //@}
1763
1764 /// \name Geode
1765 /// Geode processors.
1766 //@{
1767 CK_Geode
1768 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001769 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001770
Rafael Espindolaeb265472013-08-21 21:59:03 +00001771 enum FPMathKind {
1772 FP_Default,
1773 FP_SSE,
1774 FP_387
1775 } FPMath;
1776
Eli Friedman3fd920a2008-08-20 02:34:37 +00001777public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001778 X86TargetInfo(const llvm::Triple &Triple)
1779 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001780 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1781 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001782 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasTBM(false),
1783 HasFMA(false), HasF16C(false), HasAVX512CD(false), HasAVX512ER(false),
Nick Lewycky50e8f482013-10-05 20:14:27 +00001784 HasAVX512PF(false), HasSHA(false), HasCX16(false), CPU(CK_Generic),
1785 FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001786 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001787 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001788 }
Craig Topper3164f332014-03-11 03:39:26 +00001789 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001790 // X87 evaluates with 80 bits "long double" precision.
1791 return SSELevel == NoSSE ? 2 : 0;
1792 }
Craig Topper3164f332014-03-11 03:39:26 +00001793 void getTargetBuiltins(const Builtin::Info *&Records,
1794 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001795 Records = BuiltinInfo;
1796 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001797 }
Craig Topper3164f332014-03-11 03:39:26 +00001798 void getGCCRegNames(const char * const *&Names,
1799 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001800 Names = GCCRegNames;
1801 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001802 }
Craig Topper3164f332014-03-11 03:39:26 +00001803 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1804 unsigned &NumAliases) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001805 Aliases = 0;
1806 NumAliases = 0;
1807 }
Craig Topper3164f332014-03-11 03:39:26 +00001808 void getGCCAddlRegNames(const AddlRegName *&Names,
1809 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001810 Names = AddlRegNames;
1811 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001812 }
Craig Topper3164f332014-03-11 03:39:26 +00001813 bool validateAsmConstraint(const char *&Name,
1814 TargetInfo::ConstraintInfo &info) const override;
1815 std::string convertConstraint(const char *&Constraint) const override;
1816 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001817 return "~{dirflag},~{fpsr},~{flags}";
1818 }
Craig Topper3164f332014-03-11 03:39:26 +00001819 void getTargetDefines(const LangOptions &Opts,
1820 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001821 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1822 bool Enabled);
1823 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1824 bool Enabled);
1825 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1826 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001827 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1828 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00001829 setFeatureEnabledImpl(Features, Name, Enabled);
1830 }
1831 // This exists purely to cut down on the number of virtual calls in
1832 // getDefaultFeatures which calls this repeatedly.
1833 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1834 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001835 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1836 bool hasFeature(StringRef Feature) const override;
1837 bool handleTargetFeatures(std::vector<std::string> &Features,
1838 DiagnosticsEngine &Diags) override;
1839 const char* getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001840 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001841 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001842 else if (getTriple().getArch() == llvm::Triple::x86 &&
1843 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001844 return "no-mmx";
1845 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001846 }
Craig Topper3164f332014-03-11 03:39:26 +00001847 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00001848 CPU = llvm::StringSwitch<CPUKind>(Name)
1849 .Case("i386", CK_i386)
1850 .Case("i486", CK_i486)
1851 .Case("winchip-c6", CK_WinChipC6)
1852 .Case("winchip2", CK_WinChip2)
1853 .Case("c3", CK_C3)
1854 .Case("i586", CK_i586)
1855 .Case("pentium", CK_Pentium)
1856 .Case("pentium-mmx", CK_PentiumMMX)
1857 .Case("i686", CK_i686)
1858 .Case("pentiumpro", CK_PentiumPro)
1859 .Case("pentium2", CK_Pentium2)
1860 .Case("pentium3", CK_Pentium3)
1861 .Case("pentium3m", CK_Pentium3M)
1862 .Case("pentium-m", CK_PentiumM)
1863 .Case("c3-2", CK_C3_2)
1864 .Case("yonah", CK_Yonah)
1865 .Case("pentium4", CK_Pentium4)
1866 .Case("pentium4m", CK_Pentium4M)
1867 .Case("prescott", CK_Prescott)
1868 .Case("nocona", CK_Nocona)
1869 .Case("core2", CK_Core2)
1870 .Case("penryn", CK_Penryn)
1871 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001872 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001873 .Case("corei7", CK_Corei7)
1874 .Case("corei7-avx", CK_Corei7AVX)
1875 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001876 .Case("core-avx2", CK_CoreAVX2)
Craig Topper449314e2013-08-20 07:09:39 +00001877 .Case("knl", CK_KNL)
Chandler Carruth212334f2011-09-28 08:55:37 +00001878 .Case("k6", CK_K6)
1879 .Case("k6-2", CK_K6_2)
1880 .Case("k6-3", CK_K6_3)
1881 .Case("athlon", CK_Athlon)
1882 .Case("athlon-tbird", CK_AthlonThunderbird)
1883 .Case("athlon-4", CK_Athlon4)
1884 .Case("athlon-xp", CK_AthlonXP)
1885 .Case("athlon-mp", CK_AthlonMP)
1886 .Case("athlon64", CK_Athlon64)
1887 .Case("athlon64-sse3", CK_Athlon64SSE3)
1888 .Case("athlon-fx", CK_AthlonFX)
1889 .Case("k8", CK_K8)
1890 .Case("k8-sse3", CK_K8SSE3)
1891 .Case("opteron", CK_Opteron)
1892 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00001893 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00001894 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001895 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001896 .Case("bdver1", CK_BDVER1)
1897 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001898 .Case("bdver3", CK_BDVER3)
Chandler Carruth212334f2011-09-28 08:55:37 +00001899 .Case("x86-64", CK_x86_64)
1900 .Case("geode", CK_Geode)
1901 .Default(CK_Generic);
1902
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001903 // Perform any per-CPU checks necessary to determine if this CPU is
1904 // acceptable.
1905 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
1906 // invalid without explaining *why*.
1907 switch (CPU) {
1908 case CK_Generic:
1909 // No processor selected!
1910 return false;
1911
1912 case CK_i386:
1913 case CK_i486:
1914 case CK_WinChipC6:
1915 case CK_WinChip2:
1916 case CK_C3:
1917 case CK_i586:
1918 case CK_Pentium:
1919 case CK_PentiumMMX:
1920 case CK_i686:
1921 case CK_PentiumPro:
1922 case CK_Pentium2:
1923 case CK_Pentium3:
1924 case CK_Pentium3M:
1925 case CK_PentiumM:
1926 case CK_Yonah:
1927 case CK_C3_2:
1928 case CK_Pentium4:
1929 case CK_Pentium4M:
1930 case CK_Prescott:
1931 case CK_K6:
1932 case CK_K6_2:
1933 case CK_K6_3:
1934 case CK_Athlon:
1935 case CK_AthlonThunderbird:
1936 case CK_Athlon4:
1937 case CK_AthlonXP:
1938 case CK_AthlonMP:
1939 case CK_Geode:
1940 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00001941 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001942 return false;
1943
1944 // Fallthrough
1945 case CK_Nocona:
1946 case CK_Core2:
1947 case CK_Penryn:
1948 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00001949 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001950 case CK_Corei7:
1951 case CK_Corei7AVX:
1952 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00001953 case CK_CoreAVX2:
Craig Topper449314e2013-08-20 07:09:39 +00001954 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001955 case CK_Athlon64:
1956 case CK_Athlon64SSE3:
1957 case CK_AthlonFX:
1958 case CK_K8:
1959 case CK_K8SSE3:
1960 case CK_Opteron:
1961 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00001962 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00001963 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001964 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001965 case CK_BDVER1:
1966 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001967 case CK_BDVER3:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00001968 case CK_x86_64:
1969 return true;
1970 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00001971 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00001972 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001973
Craig Topper3164f332014-03-11 03:39:26 +00001974 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00001975
Craig Topper3164f332014-03-11 03:39:26 +00001976 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001977 // We accept all non-ARM calling conventions
1978 return (CC == CC_X86ThisCall ||
1979 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00001980 CC == CC_X86StdCall ||
1981 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00001982 CC == CC_X86Pascal ||
1983 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001984 }
1985
Craig Topper3164f332014-03-11 03:39:26 +00001986 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00001987 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00001988 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001989};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00001990
Rafael Espindolaeb265472013-08-21 21:59:03 +00001991bool X86TargetInfo::setFPMath(StringRef Name) {
1992 if (Name == "387") {
1993 FPMath = FP_387;
1994 return true;
1995 }
1996 if (Name == "sse") {
1997 FPMath = FP_SSE;
1998 return true;
1999 }
2000 return false;
2001}
2002
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002003void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002004 // FIXME: This *really* should not be here.
2005
2006 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002007 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002008 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002009
Chandler Carruth212334f2011-09-28 08:55:37 +00002010 switch (CPU) {
2011 case CK_Generic:
2012 case CK_i386:
2013 case CK_i486:
2014 case CK_i586:
2015 case CK_Pentium:
2016 case CK_i686:
2017 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002018 break;
2019 case CK_PentiumMMX:
2020 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002021 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002022 break;
2023 case CK_Pentium3:
2024 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002025 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002026 break;
2027 case CK_PentiumM:
2028 case CK_Pentium4:
2029 case CK_Pentium4M:
2030 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002031 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002032 break;
2033 case CK_Yonah:
2034 case CK_Prescott:
2035 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002036 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002037 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002038 break;
2039 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002040 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002041 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002042 break;
2043 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002044 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002045 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002046 break;
2047 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002048 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002049 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002050 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002051 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002052 setFeatureEnabledImpl(Features, "sse4.2", true);
2053 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002054 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002055 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002056 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002057 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002058 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002059 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002060 break;
2061 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002062 setFeatureEnabledImpl(Features, "avx", true);
2063 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002064 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002065 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002066 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002067 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002068 setFeatureEnabledImpl(Features, "avx", true);
2069 setFeatureEnabledImpl(Features, "aes", true);
2070 setFeatureEnabledImpl(Features, "pclmul", true);
2071 setFeatureEnabledImpl(Features, "rdrnd", true);
2072 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002073 break;
Craig Topper865fff52011-12-17 19:55:21 +00002074 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002075 setFeatureEnabledImpl(Features, "avx2", true);
2076 setFeatureEnabledImpl(Features, "aes", true);
2077 setFeatureEnabledImpl(Features, "pclmul", true);
2078 setFeatureEnabledImpl(Features, "lzcnt", true);
2079 setFeatureEnabledImpl(Features, "rdrnd", true);
2080 setFeatureEnabledImpl(Features, "f16c", true);
2081 setFeatureEnabledImpl(Features, "bmi", true);
2082 setFeatureEnabledImpl(Features, "bmi2", true);
2083 setFeatureEnabledImpl(Features, "rtm", true);
2084 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002085 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002086 break;
Craig Topper449314e2013-08-20 07:09:39 +00002087 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002088 setFeatureEnabledImpl(Features, "avx512f", true);
2089 setFeatureEnabledImpl(Features, "avx512cd", true);
2090 setFeatureEnabledImpl(Features, "avx512er", true);
2091 setFeatureEnabledImpl(Features, "avx512pf", true);
2092 setFeatureEnabledImpl(Features, "aes", true);
2093 setFeatureEnabledImpl(Features, "pclmul", true);
2094 setFeatureEnabledImpl(Features, "lzcnt", true);
2095 setFeatureEnabledImpl(Features, "rdrnd", true);
2096 setFeatureEnabledImpl(Features, "f16c", true);
2097 setFeatureEnabledImpl(Features, "bmi", true);
2098 setFeatureEnabledImpl(Features, "bmi2", true);
2099 setFeatureEnabledImpl(Features, "rtm", true);
2100 setFeatureEnabledImpl(Features, "fma", true);
Craig Topper449314e2013-08-20 07:09:39 +00002101 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002102 case CK_K6:
2103 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002104 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002105 break;
2106 case CK_K6_2:
2107 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002108 case CK_WinChip2:
2109 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002110 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002111 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002112 case CK_Athlon:
2113 case CK_AthlonThunderbird:
2114 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002115 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002116 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002117 case CK_Athlon4:
2118 case CK_AthlonXP:
2119 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002120 setFeatureEnabledImpl(Features, "sse", true);
2121 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002122 break;
2123 case CK_K8:
2124 case CK_Opteron:
2125 case CK_Athlon64:
2126 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002127 setFeatureEnabledImpl(Features, "sse2", true);
2128 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002129 break;
2130 case CK_K8SSE3:
2131 case CK_OpteronSSE3:
2132 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002133 setFeatureEnabledImpl(Features, "sse3", true);
2134 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002135 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002136 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002137 setFeatureEnabledImpl(Features, "sse3", true);
2138 setFeatureEnabledImpl(Features, "sse4a", true);
2139 setFeatureEnabledImpl(Features, "3dnowa", true);
2140 setFeatureEnabledImpl(Features, "lzcnt", true);
2141 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002142 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002143 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002144 setFeatureEnabledImpl(Features, "ssse3", true);
2145 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002146 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002147 setFeatureEnabledImpl(Features, "lzcnt", true);
2148 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002149 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002150 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002151 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002152 setFeatureEnabledImpl(Features, "avx", true);
2153 setFeatureEnabledImpl(Features, "sse4a", true);
2154 setFeatureEnabledImpl(Features, "lzcnt", true);
2155 setFeatureEnabledImpl(Features, "aes", true);
2156 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002157 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002158 setFeatureEnabledImpl(Features, "bmi", true);
2159 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002160 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002161 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002162 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002163 setFeatureEnabledImpl(Features, "xop", true);
2164 setFeatureEnabledImpl(Features, "lzcnt", true);
2165 setFeatureEnabledImpl(Features, "aes", true);
2166 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002167 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002168 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002169 break;
Eli Friedman3e94f572012-11-17 01:43:10 +00002170 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002171 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002172 setFeatureEnabledImpl(Features, "xop", true);
2173 setFeatureEnabledImpl(Features, "lzcnt", true);
2174 setFeatureEnabledImpl(Features, "aes", true);
2175 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002176 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002177 setFeatureEnabledImpl(Features, "bmi", true);
2178 setFeatureEnabledImpl(Features, "fma", true);
2179 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002180 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002181 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002182 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002183 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002184 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002185 break;
Eli Friedman33465822011-07-08 23:31:17 +00002186 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002187}
2188
Rafael Espindolae62e2792013-08-20 13:44:29 +00002189void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002190 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002191 if (Enabled) {
2192 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002193 case AVX512F:
2194 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002195 case AVX2:
2196 Features["avx2"] = true;
2197 case AVX:
2198 Features["avx"] = true;
2199 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002200 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002201 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002202 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002203 case SSSE3:
2204 Features["ssse3"] = true;
2205 case SSE3:
2206 Features["sse3"] = true;
2207 case SSE2:
2208 Features["sse2"] = true;
2209 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002210 Features["sse"] = true;
2211 case NoSSE:
2212 break;
2213 }
2214 return;
2215 }
2216
2217 switch (Level) {
2218 case NoSSE:
2219 case SSE1:
2220 Features["sse"] = false;
2221 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002222 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2223 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002224 case SSE3:
2225 Features["sse3"] = false;
2226 setXOPLevel(Features, NoXOP, false);
2227 case SSSE3:
2228 Features["ssse3"] = false;
2229 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002230 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002231 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002232 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002233 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002234 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002235 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002236 case AVX2:
2237 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002238 case AVX512F:
Craig Topper679b53a2013-08-21 05:29:10 +00002239 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2240 Features["avx512pf"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002241 }
2242}
2243
2244void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002245 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002246 if (Enabled) {
2247 switch (Level) {
2248 case AMD3DNowAthlon:
2249 Features["3dnowa"] = true;
2250 case AMD3DNow:
2251 Features["3dnow"] = true;
2252 case MMX:
2253 Features["mmx"] = true;
2254 case NoMMX3DNow:
2255 break;
2256 }
2257 return;
2258 }
2259
2260 switch (Level) {
2261 case NoMMX3DNow:
2262 case MMX:
2263 Features["mmx"] = false;
2264 case AMD3DNow:
2265 Features["3dnow"] = false;
2266 case AMD3DNowAthlon:
2267 Features["3dnowa"] = false;
2268 }
2269}
2270
2271void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002272 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002273 if (Enabled) {
2274 switch (Level) {
2275 case XOP:
2276 Features["xop"] = true;
2277 case FMA4:
2278 Features["fma4"] = true;
2279 setSSELevel(Features, AVX, true);
2280 case SSE4A:
2281 Features["sse4a"] = true;
2282 setSSELevel(Features, SSE3, true);
2283 case NoXOP:
2284 break;
2285 }
2286 return;
2287 }
2288
2289 switch (Level) {
2290 case NoXOP:
2291 case SSE4A:
2292 Features["sse4a"] = false;
2293 case FMA4:
2294 Features["fma4"] = false;
2295 case XOP:
2296 Features["xop"] = false;
2297 }
2298}
2299
Craig Topper86d79ef2013-09-17 04:51:29 +00002300void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2301 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002302 // FIXME: This *really* should not be here. We need some way of translating
2303 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002304 if (Name == "sse4")
2305 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002306
Rafael Espindolae62e2792013-08-20 13:44:29 +00002307 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002308
Craig Topper29561122013-09-19 01:13:07 +00002309 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002310 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002311 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002312 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002313 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002314 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002315 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002316 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002317 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002318 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002319 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002320 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002321 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002322 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002323 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002324 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002325 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002326 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002327 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002328 if (Enabled)
2329 setSSELevel(Features, SSE2, Enabled);
2330 } else if (Name == "pclmul") {
2331 if (Enabled)
2332 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002333 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002334 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002335 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002336 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002337 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002338 setSSELevel(Features, AVX512F, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002339 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00002340 if (Enabled)
2341 setSSELevel(Features, AVX512F, Enabled);
2342 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002343 if (Enabled)
2344 setSSELevel(Features, AVX, Enabled);
2345 } else if (Name == "fma4") {
2346 setXOPLevel(Features, FMA4, Enabled);
2347 } else if (Name == "xop") {
2348 setXOPLevel(Features, XOP, Enabled);
2349 } else if (Name == "sse4a") {
2350 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002351 } else if (Name == "f16c") {
2352 if (Enabled)
2353 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002354 } else if (Name == "sha") {
2355 if (Enabled)
2356 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002357 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002358}
2359
Eric Christopher3ff21b32013-10-16 21:26:26 +00002360/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002361/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002362bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002363 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002364 // Remember the maximum enabled sselevel.
2365 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2366 // Ignore disabled features.
2367 if (Features[i][0] == '-')
2368 continue;
2369
Benjamin Kramer27402c62012-03-05 15:10:44 +00002370 StringRef Feature = StringRef(Features[i]).substr(1);
2371
2372 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002373 HasAES = true;
2374 continue;
2375 }
2376
Craig Topper3f122a72012-05-31 05:18:48 +00002377 if (Feature == "pclmul") {
2378 HasPCLMUL = true;
2379 continue;
2380 }
2381
Benjamin Kramer27402c62012-03-05 15:10:44 +00002382 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002383 HasLZCNT = true;
2384 continue;
2385 }
2386
Rafael Espindola89049822013-08-23 20:21:37 +00002387 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002388 HasRDRND = true;
2389 continue;
2390 }
2391
Benjamin Kramer27402c62012-03-05 15:10:44 +00002392 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002393 HasBMI = true;
2394 continue;
2395 }
2396
Benjamin Kramer27402c62012-03-05 15:10:44 +00002397 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002398 HasBMI2 = true;
2399 continue;
2400 }
2401
Benjamin Kramer27402c62012-03-05 15:10:44 +00002402 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002403 HasPOPCNT = true;
2404 continue;
2405 }
2406
Michael Liao625a8752012-11-10 05:17:46 +00002407 if (Feature == "rtm") {
2408 HasRTM = true;
2409 continue;
2410 }
2411
Michael Liao74f4eaf2013-03-26 17:52:08 +00002412 if (Feature == "prfchw") {
2413 HasPRFCHW = true;
2414 continue;
2415 }
2416
Michael Liaoffaae352013-03-29 05:17:55 +00002417 if (Feature == "rdseed") {
2418 HasRDSEED = true;
2419 continue;
2420 }
2421
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002422 if (Feature == "tbm") {
2423 HasTBM = true;
2424 continue;
2425 }
2426
Craig Topperbba778b2012-06-03 21:46:30 +00002427 if (Feature == "fma") {
2428 HasFMA = true;
2429 continue;
2430 }
2431
Manman Rena45358c2012-10-11 00:59:55 +00002432 if (Feature == "f16c") {
2433 HasF16C = true;
2434 continue;
2435 }
2436
Craig Topper679b53a2013-08-21 05:29:10 +00002437 if (Feature == "avx512cd") {
2438 HasAVX512CD = true;
2439 continue;
2440 }
2441
2442 if (Feature == "avx512er") {
2443 HasAVX512ER = true;
2444 continue;
2445 }
2446
2447 if (Feature == "avx512pf") {
2448 HasAVX512PF = true;
2449 continue;
2450 }
2451
Ben Langmuir58078d02013-09-19 13:22:04 +00002452 if (Feature == "sha") {
2453 HasSHA = true;
2454 continue;
2455 }
2456
Nick Lewycky50e8f482013-10-05 20:14:27 +00002457 if (Feature == "cx16") {
2458 HasCX16 = true;
2459 continue;
2460 }
2461
Daniel Dunbar979586e2009-11-11 09:38:56 +00002462 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002463 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002464 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002465 .Case("avx2", AVX2)
2466 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002467 .Case("sse4.2", SSE42)
2468 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002469 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002470 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002471 .Case("sse2", SSE2)
2472 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002473 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002474 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002475
Eli Friedman33465822011-07-08 23:31:17 +00002476 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002477 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002478 .Case("3dnowa", AMD3DNowAthlon)
2479 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002480 .Case("mmx", MMX)
2481 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002482 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002483
2484 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2485 .Case("xop", XOP)
2486 .Case("fma4", FMA4)
2487 .Case("sse4a", SSE4A)
2488 .Default(NoXOP);
2489 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002490 }
Eli Friedman33465822011-07-08 23:31:17 +00002491
Craig Topper7481d8a2013-09-10 06:55:47 +00002492 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2493 // Can't do this earlier because we need to be able to explicitly enable
2494 // popcnt and still disable sse4.2.
2495 if (!HasPOPCNT && SSELevel >= SSE42 &&
2496 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2497 HasPOPCNT = true;
2498 Features.push_back("+popcnt");
2499 }
2500
Yunzhong Gao61089362013-10-16 19:07:02 +00002501 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2502 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2503 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2504 HasPRFCHW = true;
2505 Features.push_back("+prfchw");
2506 }
2507
Rafael Espindolaeb265472013-08-21 21:59:03 +00002508 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2509 // matches the selected sse level.
2510 if (FPMath == FP_SSE && SSELevel < SSE1) {
2511 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2512 return false;
2513 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2514 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2515 return false;
2516 }
2517
Eli Friedman33465822011-07-08 23:31:17 +00002518 // Don't tell the backend if we're turning off mmx; it will end up disabling
2519 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002520 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2521 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002522 std::vector<std::string>::iterator it;
2523 it = std::find(Features.begin(), Features.end(), "-mmx");
2524 if (it != Features.end())
2525 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002526 else if (SSELevel > NoSSE)
2527 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002528 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002529}
Chris Lattnerecd49032009-03-02 22:27:17 +00002530
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002531/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2532/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002533void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002534 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002535 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002536 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002537 Builder.defineMacro("__amd64__");
2538 Builder.defineMacro("__amd64");
2539 Builder.defineMacro("__x86_64");
2540 Builder.defineMacro("__x86_64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00002541 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002542 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002543 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002544
Chris Lattnerecd49032009-03-02 22:27:17 +00002545 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002546 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2547 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002548 switch (CPU) {
2549 case CK_Generic:
2550 break;
2551 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002552 // The rest are coming from the i386 define above.
2553 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002554 break;
2555 case CK_i486:
2556 case CK_WinChipC6:
2557 case CK_WinChip2:
2558 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002559 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002560 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002561 case CK_PentiumMMX:
2562 Builder.defineMacro("__pentium_mmx__");
2563 Builder.defineMacro("__tune_pentium_mmx__");
2564 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002565 case CK_i586:
2566 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002567 defineCPUMacros(Builder, "i586");
2568 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002569 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002570 case CK_Pentium3:
2571 case CK_Pentium3M:
2572 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002573 Builder.defineMacro("__tune_pentium3__");
2574 // Fallthrough
2575 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002576 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002577 Builder.defineMacro("__tune_pentium2__");
2578 // Fallthrough
2579 case CK_PentiumPro:
2580 Builder.defineMacro("__tune_i686__");
2581 Builder.defineMacro("__tune_pentiumpro__");
2582 // Fallthrough
2583 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002584 Builder.defineMacro("__i686");
2585 Builder.defineMacro("__i686__");
2586 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2587 Builder.defineMacro("__pentiumpro");
2588 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002589 break;
2590 case CK_Pentium4:
2591 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002592 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002593 break;
2594 case CK_Yonah:
2595 case CK_Prescott:
2596 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002597 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002598 break;
2599 case CK_Core2:
2600 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002601 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002602 break;
2603 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002604 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002605 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002606 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002607 defineCPUMacros(Builder, "slm");
2608 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002609 case CK_Corei7:
2610 case CK_Corei7AVX:
2611 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002612 case CK_CoreAVX2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002613 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002614 break;
Craig Topper449314e2013-08-20 07:09:39 +00002615 case CK_KNL:
2616 defineCPUMacros(Builder, "knl");
2617 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002618 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002619 Builder.defineMacro("__k6_2__");
2620 Builder.defineMacro("__tune_k6_2__");
2621 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002622 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002623 if (CPU != CK_K6_2) { // In case of fallthrough
2624 // FIXME: GCC may be enabling these in cases where some other k6
2625 // architecture is specified but -m3dnow is explicitly provided. The
2626 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002627 Builder.defineMacro("__k6_3__");
2628 Builder.defineMacro("__tune_k6_3__");
2629 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002630 // Fallthrough
2631 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002632 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002633 break;
2634 case CK_Athlon:
2635 case CK_AthlonThunderbird:
2636 case CK_Athlon4:
2637 case CK_AthlonXP:
2638 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002639 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002640 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002641 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002642 Builder.defineMacro("__tune_athlon_sse__");
2643 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002644 break;
2645 case CK_K8:
2646 case CK_K8SSE3:
2647 case CK_x86_64:
2648 case CK_Opteron:
2649 case CK_OpteronSSE3:
2650 case CK_Athlon64:
2651 case CK_Athlon64SSE3:
2652 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002653 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002654 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002655 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002656 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002657 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002658 case CK_BTVER1:
2659 defineCPUMacros(Builder, "btver1");
2660 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002661 case CK_BTVER2:
2662 defineCPUMacros(Builder, "btver2");
2663 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002664 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002665 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002666 break;
2667 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002668 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002669 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002670 case CK_BDVER3:
2671 defineCPUMacros(Builder, "bdver3");
2672 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002673 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002674 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002675 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002676 }
Chris Lattner96e43572009-03-02 22:40:39 +00002677
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002678 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002679 Builder.defineMacro("__REGISTER_PREFIX__", "");
2680
Chris Lattner6df41af2009-04-19 17:32:33 +00002681 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2682 // functions in glibc header files that use FP Stack inline asm which the
2683 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002684 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002685
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002686 if (HasAES)
2687 Builder.defineMacro("__AES__");
2688
Craig Topper3f122a72012-05-31 05:18:48 +00002689 if (HasPCLMUL)
2690 Builder.defineMacro("__PCLMUL__");
2691
Craig Topper22967d42011-12-25 05:06:45 +00002692 if (HasLZCNT)
2693 Builder.defineMacro("__LZCNT__");
2694
Benjamin Kramer1e250392012-07-07 09:39:18 +00002695 if (HasRDRND)
2696 Builder.defineMacro("__RDRND__");
2697
Craig Topper22967d42011-12-25 05:06:45 +00002698 if (HasBMI)
2699 Builder.defineMacro("__BMI__");
2700
2701 if (HasBMI2)
2702 Builder.defineMacro("__BMI2__");
2703
Craig Topper1de83482011-12-29 16:10:46 +00002704 if (HasPOPCNT)
2705 Builder.defineMacro("__POPCNT__");
2706
Michael Liao625a8752012-11-10 05:17:46 +00002707 if (HasRTM)
2708 Builder.defineMacro("__RTM__");
2709
Michael Liao74f4eaf2013-03-26 17:52:08 +00002710 if (HasPRFCHW)
2711 Builder.defineMacro("__PRFCHW__");
2712
Michael Liaoffaae352013-03-29 05:17:55 +00002713 if (HasRDSEED)
2714 Builder.defineMacro("__RDSEED__");
2715
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002716 if (HasTBM)
2717 Builder.defineMacro("__TBM__");
2718
Rafael Espindolae62e2792013-08-20 13:44:29 +00002719 switch (XOPLevel) {
2720 case XOP:
2721 Builder.defineMacro("__XOP__");
2722 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002723 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002724 case SSE4A:
2725 Builder.defineMacro("__SSE4A__");
2726 case NoXOP:
2727 break;
2728 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002729
Craig Topperbba778b2012-06-03 21:46:30 +00002730 if (HasFMA)
2731 Builder.defineMacro("__FMA__");
2732
Manman Rena45358c2012-10-11 00:59:55 +00002733 if (HasF16C)
2734 Builder.defineMacro("__F16C__");
2735
Craig Topper679b53a2013-08-21 05:29:10 +00002736 if (HasAVX512CD)
2737 Builder.defineMacro("__AVX512CD__");
2738 if (HasAVX512ER)
2739 Builder.defineMacro("__AVX512ER__");
2740 if (HasAVX512PF)
2741 Builder.defineMacro("__AVX512PF__");
2742
Ben Langmuir58078d02013-09-19 13:22:04 +00002743 if (HasSHA)
2744 Builder.defineMacro("__SHA__");
2745
Nick Lewycky50e8f482013-10-05 20:14:27 +00002746 if (HasCX16)
2747 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2748
Chris Lattner96e43572009-03-02 22:40:39 +00002749 // Each case falls through to the previous one here.
2750 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002751 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002752 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002753 case AVX2:
2754 Builder.defineMacro("__AVX2__");
2755 case AVX:
2756 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002757 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002758 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002759 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002760 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002761 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002762 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002763 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002764 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002765 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002766 Builder.defineMacro("__SSE2__");
2767 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002768 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002769 Builder.defineMacro("__SSE__");
2770 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002771 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002772 break;
2773 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002774
Derek Schuffc7dd7222012-10-11 15:52:22 +00002775 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002776 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002777 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002778 case AVX2:
2779 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002780 case SSE42:
2781 case SSE41:
2782 case SSSE3:
2783 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002784 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002785 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002786 break;
2787 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002788 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002789 break;
2790 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002791 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002792 }
2793 }
2794
Anders Carlssone437c682010-01-27 03:47:49 +00002795 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002796 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002797 case AMD3DNowAthlon:
2798 Builder.defineMacro("__3dNOW_A__");
2799 case AMD3DNow:
2800 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002801 case MMX:
2802 Builder.defineMacro("__MMX__");
2803 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00002804 break;
2805 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00002806
2807 if (CPU >= CK_i486) {
2808 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
2809 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
2810 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
2811 }
2812 if (CPU >= CK_i586)
2813 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00002814}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002815
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002816bool X86TargetInfo::hasFeature(StringRef Feature) const {
2817 return llvm::StringSwitch<bool>(Feature)
2818 .Case("aes", HasAES)
2819 .Case("avx", SSELevel >= AVX)
2820 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00002821 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00002822 .Case("avx512cd", HasAVX512CD)
2823 .Case("avx512er", HasAVX512ER)
2824 .Case("avx512pf", HasAVX512PF)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002825 .Case("bmi", HasBMI)
2826 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00002827 .Case("cx16", HasCX16)
2828 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00002829 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002830 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002831 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002832 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00002833 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002834 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
2835 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
2836 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00002837 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002838 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00002839 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00002840 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00002841 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00002842 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002843 .Case("sse", SSELevel >= SSE1)
2844 .Case("sse2", SSELevel >= SSE2)
2845 .Case("sse3", SSELevel >= SSE3)
2846 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00002847 .Case("sse4.1", SSELevel >= SSE41)
2848 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002849 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002850 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00002851 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
2852 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00002853 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00002854 .Default(false);
2855}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002856
Eli Friedman3fd920a2008-08-20 02:34:37 +00002857bool
Anders Carlsson58436352009-02-28 17:11:49 +00002858X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00002859 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00002860 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002861 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00002862 case 'Y': // first letter of a pair:
2863 switch (*(Name+1)) {
2864 default: return false;
2865 case '0': // First SSE register.
2866 case 't': // Any SSE register, when SSE2 is enabled.
2867 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
2868 case 'm': // any MMX register, when inter-unit moves enabled.
2869 break; // falls through to setAllowsRegister.
2870 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002871 case 'a': // eax.
2872 case 'b': // ebx.
2873 case 'c': // ecx.
2874 case 'd': // edx.
2875 case 'S': // esi.
2876 case 'D': // edi.
2877 case 'A': // edx:eax.
Dale Johannesen46742a42010-08-24 22:33:12 +00002878 case 'f': // any x87 floating point stack register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002879 case 't': // top of floating point stack.
2880 case 'u': // second from top of floating point stack.
2881 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00002882 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00002883 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002884 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00002885 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
2886 case 'l': // "Index" registers: any general register that can be used as an
2887 // index in a base+index memory access.
2888 Info.setAllowsRegister();
2889 return true;
2890 case 'C': // SSE floating point constant.
2891 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002892 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002893 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002894 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00002895 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00002896 return true;
2897 }
2898}
2899
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00002900
Eli Friedman3fd920a2008-08-20 02:34:37 +00002901std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002902X86TargetInfo::convertConstraint(const char *&Constraint) const {
2903 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002904 case 'a': return std::string("{ax}");
2905 case 'b': return std::string("{bx}");
2906 case 'c': return std::string("{cx}");
2907 case 'd': return std::string("{dx}");
2908 case 'S': return std::string("{si}");
2909 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00002910 case 'p': // address
2911 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00002912 case 't': // top of floating point stack.
2913 return std::string("{st}");
2914 case 'u': // second from top of floating point stack.
2915 return std::string("{st(1)}"); // second from top of floating point stack.
2916 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00002917 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00002918 }
2919}
Eli Friedman3fd920a2008-08-20 02:34:37 +00002920} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00002921
2922namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002923// X86-32 generic target
2924class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00002925public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002926 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002927 DoubleAlign = LongLongAlign = 32;
2928 LongDoubleWidth = 96;
2929 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00002930 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00002931 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00002932 SizeType = UnsignedInt;
2933 PtrDiffType = SignedInt;
2934 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00002935 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00002936
2937 // Use fpret for all types.
2938 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
2939 (1 << TargetInfo::Double) |
2940 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00002941
2942 // x86-32 has atomics up to 8 bytes
2943 // FIXME: Check that we actually have cmpxchg8b before setting
2944 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
2945 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002946 }
Craig Topper3164f332014-03-11 03:39:26 +00002947 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00002948 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00002949 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002950
Craig Topper3164f332014-03-11 03:39:26 +00002951 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00002952 if (RegNo == 0) return 0;
2953 if (RegNo == 1) return 2;
2954 return -1;
2955 }
Craig Topper3164f332014-03-11 03:39:26 +00002956 bool validateInputSize(StringRef Constraint,
2957 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00002958 switch (Constraint[0]) {
2959 default: break;
2960 case 'a':
2961 case 'b':
2962 case 'c':
2963 case 'd':
Bill Wendling3c7fed82012-11-12 18:52:32 +00002964 return Size <= 32;
Bill Wendling887b4852012-11-12 06:42:51 +00002965 }
2966
2967 return true;
2968 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00002969};
2970} // end anonymous namespace
2971
2972namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002973class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
2974public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002975 NetBSDI386TargetInfo(const llvm::Triple &Triple)
2976 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002977
Craig Topper3164f332014-03-11 03:39:26 +00002978 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00002979 unsigned Major, Minor, Micro;
2980 getTriple().getOSVersion(Major, Minor, Micro);
2981 // New NetBSD uses the default rounding mode.
2982 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
2983 return X86_32TargetInfo::getFloatEvalMethod();
2984 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00002985 return 1;
2986 }
2987};
2988} // end anonymous namespace
2989
2990namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00002991class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
2992public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00002993 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
2994 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00002995 SizeType = UnsignedLong;
2996 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00002997 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00002998 }
2999};
3000} // end anonymous namespace
3001
3002namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003003class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3004public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003005 BitrigI386TargetInfo(const llvm::Triple &Triple)
3006 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003007 SizeType = UnsignedLong;
3008 IntPtrType = SignedLong;
3009 PtrDiffType = SignedLong;
3010 }
3011};
3012} // end anonymous namespace
3013
3014namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003015class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003016public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003017 DarwinI386TargetInfo(const llvm::Triple &Triple)
3018 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003019 LongDoubleWidth = 128;
3020 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003021 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003022 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003023 SizeType = UnsignedLong;
3024 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003025 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003026 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003027 }
3028
Eli Friedman3fd920a2008-08-20 02:34:37 +00003029};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003030} // end anonymous namespace
3031
3032namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003033// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003034class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003035public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003036 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3037 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmand88c8a12009-04-19 21:38:35 +00003038 TLSSupported = false;
Chris Lattner46be2e12009-06-24 17:12:15 +00003039 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003040 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003041 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003042 }
Craig Topper3164f332014-03-11 03:39:26 +00003043 void getTargetDefines(const LangOptions &Opts,
3044 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003045 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3046 }
3047};
3048} // end anonymous namespace
3049
3050namespace {
3051
3052// x86-32 Windows Visual Studio target
3053class VisualStudioWindowsX86_32TargetInfo : public WindowsX86_32TargetInfo {
3054public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003055 VisualStudioWindowsX86_32TargetInfo(const llvm::Triple &Triple)
3056 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003057 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003058 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3059 }
Craig Topper3164f332014-03-11 03:39:26 +00003060 void getTargetDefines(const LangOptions &Opts,
3061 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003062 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3063 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3064 // The value of the following reflects processor type.
3065 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3066 // We lost the original triple, so we use the default.
3067 Builder.defineMacro("_M_IX86", "600");
3068 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003069};
3070} // end anonymous namespace
3071
3072namespace {
3073// x86-32 MinGW target
3074class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3075public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003076 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3077 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003078 void getTargetDefines(const LangOptions &Opts,
3079 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003080 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003081 DefineStd(Builder, "WIN32", Opts);
3082 DefineStd(Builder, "WINNT", Opts);
3083 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003084 Builder.defineMacro("__MSVCRT__");
3085 Builder.defineMacro("__MINGW32__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003086
3087 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3088 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003089 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003090 // Provide "as-is" __declspec.
3091 Builder.defineMacro("__declspec", "__declspec");
3092 else
3093 // Provide alias of __attribute__ like mingw32-gcc.
3094 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003095 }
3096};
3097} // end anonymous namespace
3098
3099namespace {
3100// x86-32 Cygwin target
3101class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3102public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003103 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3104 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003105 TLSSupported = false;
3106 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003107 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003108 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003109 }
Craig Topper3164f332014-03-11 03:39:26 +00003110 void getTargetDefines(const LangOptions &Opts,
3111 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003112 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003113 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003114 Builder.defineMacro("__CYGWIN__");
3115 Builder.defineMacro("__CYGWIN32__");
3116 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003117 if (Opts.CPlusPlus)
3118 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003119 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003120};
3121} // end anonymous namespace
3122
3123namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003124// x86-32 Haiku target
3125class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3126public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003127 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003128 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003129 IntPtrType = SignedLong;
3130 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003131 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003132 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003133 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003134 }
Craig Topper3164f332014-03-11 03:39:26 +00003135 void getTargetDefines(const LangOptions &Opts,
3136 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003137 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3138 Builder.defineMacro("__INTEL__");
3139 Builder.defineMacro("__HAIKU__");
3140 }
3141};
3142} // end anonymous namespace
3143
Douglas Gregor9fabd852011-07-01 22:41:14 +00003144// RTEMS Target
3145template<typename Target>
3146class RTEMSTargetInfo : public OSTargetInfo<Target> {
3147protected:
Craig Topper3164f332014-03-11 03:39:26 +00003148 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3149 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003150 // RTEMS defines; list based off of gcc output
3151
Douglas Gregor9fabd852011-07-01 22:41:14 +00003152 Builder.defineMacro("__rtems__");
3153 Builder.defineMacro("__ELF__");
3154 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003155
Douglas Gregor9fabd852011-07-01 22:41:14 +00003156public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003157 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3158 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003159
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003160 switch (Triple.getArch()) {
3161 default:
3162 case llvm::Triple::x86:
3163 // this->MCountName = ".mcount";
3164 break;
3165 case llvm::Triple::mips:
3166 case llvm::Triple::mipsel:
3167 case llvm::Triple::ppc:
3168 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003169 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003170 // this->MCountName = "_mcount";
3171 break;
3172 case llvm::Triple::arm:
3173 // this->MCountName = "__mcount";
3174 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003175 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003176 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003177};
3178
3179namespace {
3180// x86-32 RTEMS target
3181class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3182public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003183 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003184 SizeType = UnsignedLong;
3185 IntPtrType = SignedLong;
3186 PtrDiffType = SignedLong;
3187 this->UserLabelPrefix = "";
3188 }
Craig Topper3164f332014-03-11 03:39:26 +00003189 void getTargetDefines(const LangOptions &Opts,
3190 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003191 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3192 Builder.defineMacro("__INTEL__");
3193 Builder.defineMacro("__rtems__");
3194 }
3195};
3196} // end anonymous namespace
3197
Chris Lattnerb986aba2010-04-11 19:29:39 +00003198namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003199// x86-64 generic target
3200class X86_64TargetInfo : public X86TargetInfo {
3201public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003202 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00003203 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003204 LongDoubleWidth = 128;
3205 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003206 LargeArrayMinWidth = 128;
3207 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003208 SuitableAlign = 128;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003209 IntMaxType = SignedLong;
3210 UIntMaxType = UnsignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00003211 Int64Type = SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003212 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003213
Rafael Espindolac418ae92014-01-03 19:22:05 +00003214 DescriptionString = "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003215
3216 // Use fpret only for long double.
3217 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003218
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003219 // Use fp2ret for _Complex long double.
3220 ComplexLongDoubleUsesFP2Ret = true;
3221
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003222 // x86-64 has atomics up to 16 bytes.
3223 // FIXME: Once the backend is fixed, increase MaxAtomicInlineWidth to 128
3224 // on CPUs with cmpxchg16b
3225 MaxAtomicPromoteWidth = 128;
3226 MaxAtomicInlineWidth = 64;
Chris Lattner10a5b382007-01-29 05:24:35 +00003227 }
Craig Topper3164f332014-03-11 03:39:26 +00003228 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003229 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003230 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003231
Craig Topper3164f332014-03-11 03:39:26 +00003232 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003233 if (RegNo == 0) return 0;
3234 if (RegNo == 1) return 1;
3235 return -1;
3236 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003237
Craig Topper3164f332014-03-11 03:39:26 +00003238 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003239 return (CC == CC_C ||
3240 CC == CC_IntelOclBicc ||
3241 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003242 }
3243
Craig Topper3164f332014-03-11 03:39:26 +00003244 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003245 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003246 }
3247
Eli Friedman3fd920a2008-08-20 02:34:37 +00003248};
3249} // end anonymous namespace
3250
3251namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003252// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003253class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003254public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003255 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3256 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003257 TLSSupported = false;
3258 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003259 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003260 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003261 IntMaxType = SignedLongLong;
3262 UIntMaxType = UnsignedLongLong;
3263 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003264 SizeType = UnsignedLongLong;
3265 PtrDiffType = SignedLongLong;
3266 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003267 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003268 }
Craig Topper3164f332014-03-11 03:39:26 +00003269 void getTargetDefines(const LangOptions &Opts,
3270 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003271 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003272 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003273 }
Craig Topper3164f332014-03-11 03:39:26 +00003274 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003275 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003276 }
Craig Topper3164f332014-03-11 03:39:26 +00003277 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003278 return (CC == CC_C ||
3279 CC == CC_IntelOclBicc ||
3280 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3281 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003282};
3283} // end anonymous namespace
3284
3285namespace {
3286// x86-64 Windows Visual Studio target
3287class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo {
3288public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003289 VisualStudioWindowsX86_64TargetInfo(const llvm::Triple &Triple)
3290 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003291 LongDoubleWidth = LongDoubleAlign = 64;
3292 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003293 }
Craig Topper3164f332014-03-11 03:39:26 +00003294 void getTargetDefines(const LangOptions &Opts,
3295 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003296 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3297 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003298 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003299 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003300 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003301};
3302} // end anonymous namespace
3303
3304namespace {
3305// x86-64 MinGW target
3306class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3307public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003308 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3309 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003310 void getTargetDefines(const LangOptions &Opts,
3311 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003312 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003313 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003314 Builder.defineMacro("__MSVCRT__");
NAKAMURA Takumi2b7eeb22011-03-08 12:06:46 +00003315 Builder.defineMacro("__MINGW32__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003316 Builder.defineMacro("__MINGW64__");
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003317
3318 // mingw32-gcc provides __declspec(a) as alias of __attribute__((a)).
3319 // In contrast, clang-cc1 provides __declspec(a) with -fms-extensions.
Francois Pichet0706d202011-09-17 17:15:52 +00003320 if (Opts.MicrosoftExt)
NAKAMURA Takumib2beb012011-03-15 02:32:50 +00003321 // Provide "as-is" __declspec.
3322 Builder.defineMacro("__declspec", "__declspec");
3323 else
3324 // Provide alias of __attribute__ like mingw32-gcc.
3325 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003326 }
3327};
3328} // end anonymous namespace
3329
3330namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003331class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3332public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003333 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3334 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003335 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003336 MaxVectorAlign = 256;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003337 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003338 }
3339};
3340} // end anonymous namespace
3341
3342namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003343class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3344public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003345 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3346 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003347 IntMaxType = SignedLongLong;
3348 UIntMaxType = UnsignedLongLong;
3349 Int64Type = SignedLongLong;
3350 }
3351};
3352} // end anonymous namespace
3353
3354namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003355class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3356public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003357 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3358 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3359 IntMaxType = SignedLongLong;
3360 UIntMaxType = UnsignedLongLong;
3361 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003362 }
3363};
Tim Northover9bb857a2013-01-31 12:13:10 +00003364}
3365
3366namespace {
3367class AArch64TargetInfo : public TargetInfo {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003368 virtual void setDescriptionString() = 0;
Tim Northover9bb857a2013-01-31 12:13:10 +00003369 static const char * const GCCRegNames[];
3370 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003371
Tim Northover2fe823a2013-08-01 09:23:19 +00003372 enum FPUModeEnum {
3373 FPUMode,
3374 NeonMode
3375 };
3376
3377 unsigned FPU;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003378 unsigned Crypto;
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003379 static const Builtin::Info BuiltinInfo[];
Tim Northover2fe823a2013-08-01 09:23:19 +00003380
Tim Northover9bb857a2013-01-31 12:13:10 +00003381public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003382 AArch64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Kevin Qinad64f6d2014-02-24 02:45:03 +00003383 IntMaxType = SignedLong;
3384 UIntMaxType = UnsignedLong;
3385 Int64Type = SignedLong;
Tim Northover9bb857a2013-01-31 12:13:10 +00003386 LongWidth = LongAlign = 64;
3387 LongDoubleWidth = LongDoubleAlign = 128;
3388 PointerWidth = PointerAlign = 64;
3389 SuitableAlign = 128;
Tim Northover9bb857a2013-01-31 12:13:10 +00003390
3391 WCharType = UnsignedInt;
Joerg Sonnenberger9864bd52014-02-02 21:55:10 +00003392 if (getTriple().getOS() == llvm::Triple::NetBSD)
3393 WCharType = SignedInt;
3394 else
3395 WCharType = UnsignedInt;
Tim Northover9bb857a2013-01-31 12:13:10 +00003396 LongDoubleFormat = &llvm::APFloat::IEEEquad;
3397
Tim Northover847d2d42013-02-18 12:11:32 +00003398 // AArch64 backend supports 64-bit operations at the moment. In principle
3399 // 128-bit is possible if register-pairs are used.
3400 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3401
Tim Northover9bb857a2013-01-31 12:13:10 +00003402 TheCXXABI.set(TargetCXXABI::GenericAArch64);
3403 }
Craig Topper3164f332014-03-11 03:39:26 +00003404 void getTargetDefines(const LangOptions &Opts,
3405 MacroBuilder &Builder) const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003406 // GCC defines theses currently
3407 Builder.defineMacro("__aarch64__");
Tim Northover9bb857a2013-01-31 12:13:10 +00003408
3409 // ACLE predefines. Many can only have one possible value on v8 AArch64.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003410 Builder.defineMacro("__ARM_ACLE", "200");
Tim Northoverb85654d2013-04-05 14:08:55 +00003411 Builder.defineMacro("__ARM_ARCH", "8");
3412 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
Tim Northover9bb857a2013-01-31 12:13:10 +00003413
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003414 Builder.defineMacro("__ARM_64BIT_STATE");
3415 Builder.defineMacro("__ARM_PCS_AAPCS64");
3416 Builder.defineMacro("__ARM_ARCH_ISA_A64");
3417
Tim Northoverb85654d2013-04-05 14:08:55 +00003418 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
3419 Builder.defineMacro("__ARM_FEATURE_CLZ");
3420 Builder.defineMacro("__ARM_FEATURE_FMA");
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003421 Builder.defineMacro("__ARM_FEATURE_DIV");
Tim Northover9bb857a2013-01-31 12:13:10 +00003422
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003423 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
Tim Northover9bb857a2013-01-31 12:13:10 +00003424
3425 // 0xe implies support for half, single and double precision operations.
Tim Northoverb85654d2013-04-05 14:08:55 +00003426 Builder.defineMacro("__ARM_FP", "0xe");
Tim Northover9bb857a2013-01-31 12:13:10 +00003427
3428 // PCS specifies this for SysV variants, which is all we support. Other ABIs
Tim Northoverb85654d2013-04-05 14:08:55 +00003429 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
3430 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
Tim Northover9bb857a2013-01-31 12:13:10 +00003431
3432 if (Opts.FastMath || Opts.FiniteMathOnly)
Tim Northoverb85654d2013-04-05 14:08:55 +00003433 Builder.defineMacro("__ARM_FP_FAST");
Tim Northover9bb857a2013-01-31 12:13:10 +00003434
3435 if ((Opts.C99 || Opts.C11) && !Opts.Freestanding)
Tim Northoverb85654d2013-04-05 14:08:55 +00003436 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
Tim Northover9bb857a2013-01-31 12:13:10 +00003437
Tim Northoverb85654d2013-04-05 14:08:55 +00003438 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
Tim Northover9bb857a2013-01-31 12:13:10 +00003439 Opts.ShortWChar ? "2" : "4");
3440
Tim Northoverb85654d2013-04-05 14:08:55 +00003441 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
Tim Northover9bb857a2013-01-31 12:13:10 +00003442 Opts.ShortEnums ? "1" : "4");
3443
3444 if (BigEndian)
Tim Northover2fe823a2013-08-01 09:23:19 +00003445 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3446
3447 if (FPU == NeonMode) {
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003448 Builder.defineMacro("__ARM_NEON");
Tim Northover2fe823a2013-08-01 09:23:19 +00003449 // 64-bit NEON supports half, single and double precision operations.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003450 Builder.defineMacro("__ARM_NEON_FP", "7");
3451 }
3452
3453 if (Crypto) {
3454 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northover2fe823a2013-08-01 09:23:19 +00003455 }
Tim Northover9bb857a2013-01-31 12:13:10 +00003456 }
Craig Topper3164f332014-03-11 03:39:26 +00003457 void getTargetBuiltins(const Builtin::Info *&Records,
3458 unsigned &NumRecords) const override {
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003459 Records = BuiltinInfo;
3460 NumRecords = clang::AArch64::LastTSBuiltin-Builtin::FirstTSBuiltin;
Tim Northover9bb857a2013-01-31 12:13:10 +00003461 }
Craig Topper3164f332014-03-11 03:39:26 +00003462 bool hasFeature(StringRef Feature) const override {
Tim Northover2fe823a2013-08-01 09:23:19 +00003463 return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode);
Tim Northover9bb857a2013-01-31 12:13:10 +00003464 }
Tim Northover2fe823a2013-08-01 09:23:19 +00003465
Craig Topper3164f332014-03-11 03:39:26 +00003466 bool setCPU(const std::string &Name) override {
Amara Emerson703da2e2013-10-31 09:32:33 +00003467 return llvm::StringSwitch<bool>(Name)
3468 .Case("generic", true)
3469 .Cases("cortex-a53", "cortex-a57", true)
3470 .Default(false);
3471 }
3472
Craig Topper3164f332014-03-11 03:39:26 +00003473 bool handleTargetFeatures(std::vector<std::string> &Features,
3474 DiagnosticsEngine &Diags) override {
Tim Northover2fe823a2013-08-01 09:23:19 +00003475 FPU = FPUMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003476 Crypto = 0;
Tim Northover2fe823a2013-08-01 09:23:19 +00003477 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3478 if (Features[i] == "+neon")
3479 FPU = NeonMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003480 if (Features[i] == "+crypto")
3481 Crypto = 1;
Tim Northover2fe823a2013-08-01 09:23:19 +00003482 }
Christian Pirker9b019ae2014-02-25 13:51:00 +00003483
3484 setDescriptionString();
3485
Rafael Espindolaeb265472013-08-21 21:59:03 +00003486 return true;
Tim Northover2fe823a2013-08-01 09:23:19 +00003487 }
3488
Craig Topper3164f332014-03-11 03:39:26 +00003489 void getGCCRegNames(const char *const *&Names,
3490 unsigned &NumNames) const override;
3491 void getGCCRegAliases(const GCCRegAlias *&Aliases,
3492 unsigned &NumAliases) const override;
Tim Northover9bb857a2013-01-31 12:13:10 +00003493
Craig Topper3164f332014-03-11 03:39:26 +00003494 bool isCLZForZeroUndef() const override { return false; }
Tim Northover9bb857a2013-01-31 12:13:10 +00003495
Craig Topper3164f332014-03-11 03:39:26 +00003496 bool validateAsmConstraint(const char *&Name,
3497 TargetInfo::ConstraintInfo &Info) const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003498 switch (*Name) {
3499 default: return false;
3500 case 'w': // An FP/SIMD vector register
3501 Info.setAllowsRegister();
3502 return true;
3503 case 'I': // Constant that can be used with an ADD instruction
3504 case 'J': // Constant that can be used with a SUB instruction
3505 case 'K': // Constant that can be used with a 32-bit logical instruction
3506 case 'L': // Constant that can be used with a 64-bit logical instruction
3507 case 'M': // Constant that can be used as a 32-bit MOV immediate
3508 case 'N': // Constant that can be used as a 64-bit MOV immediate
3509 case 'Y': // Floating point constant zero
3510 case 'Z': // Integer constant zero
3511 return true;
3512 case 'Q': // A memory reference with base register and no offset
3513 Info.setAllowsMemory();
3514 return true;
3515 case 'S': // A symbolic address
3516 Info.setAllowsRegister();
3517 return true;
3518 case 'U':
3519 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3520 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3521 // Usa: An absolute symbolic address
3522 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3523 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3524 }
3525 }
3526
Craig Topper3164f332014-03-11 03:39:26 +00003527 const char *getClobbers() const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003528 // There are no AArch64 clobbers shared by all asm statements.
3529 return "";
3530 }
3531
Craig Topper3164f332014-03-11 03:39:26 +00003532 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003533 return TargetInfo::AArch64ABIBuiltinVaList;
3534 }
3535};
3536
3537const char * const AArch64TargetInfo::GCCRegNames[] = {
3538 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3539 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3540 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3541 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3542
3543 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3544 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3545 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3546 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3547
3548 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3549 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3550 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3551 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3552
3553 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3554 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3555 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3556 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3557
3558 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3559 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3560 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3561 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3562
3563 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3564 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3565 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3566 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3567
3568 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3569 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3570 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3571 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3572};
3573
3574void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3575 unsigned &NumNames) const {
3576 Names = GCCRegNames;
3577 NumNames = llvm::array_lengthof(GCCRegNames);
3578}
3579
3580const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3581 { { "x16" }, "ip0"},
3582 { { "x17" }, "ip1"},
3583 { { "x29" }, "fp" },
3584 { { "x30" }, "lr" }
3585};
3586
3587void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3588 unsigned &NumAliases) const {
3589 Aliases = GCCRegAliases;
3590 NumAliases = llvm::array_lengthof(GCCRegAliases);
3591
3592}
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003593
3594const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
3595#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3596#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3597 ALL_LANGUAGES },
Tim Northoverc322f832014-01-30 14:47:51 +00003598#define GET_NEON_BUILTINS
3599#include "clang/Basic/arm_neon.inc"
3600#undef GET_NEON_BUILTINS
3601
3602#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3603#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3604 ALL_LANGUAGES },
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003605#include "clang/Basic/BuiltinsAArch64.def"
3606};
3607
Christian Pirker9b019ae2014-02-25 13:51:00 +00003608class AArch64leTargetInfo : public AArch64TargetInfo {
Craig Topper3164f332014-03-11 03:39:26 +00003609 void setDescriptionString() override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003610 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
3611 }
3612
3613public:
3614 AArch64leTargetInfo(const llvm::Triple &Triple)
3615 : AArch64TargetInfo(Triple) {
3616 BigEndian = false;
3617 }
Craig Topper3164f332014-03-11 03:39:26 +00003618 void getTargetDefines(const LangOptions &Opts,
3619 MacroBuilder &Builder) const override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003620 Builder.defineMacro("__AARCH64EL__");
3621 AArch64TargetInfo::getTargetDefines(Opts, Builder);
3622 }
3623};
3624
3625class AArch64beTargetInfo : public AArch64TargetInfo {
Craig Topper3164f332014-03-11 03:39:26 +00003626 void setDescriptionString() override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003627 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
3628 }
3629
3630public:
3631 AArch64beTargetInfo(const llvm::Triple &Triple)
3632 : AArch64TargetInfo(Triple) { }
Craig Topper3164f332014-03-11 03:39:26 +00003633 void getTargetDefines(const LangOptions &Opts,
3634 MacroBuilder &Builder) const override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003635 Builder.defineMacro("__AARCH64EB__");
3636 AArch64TargetInfo::getTargetDefines(Opts, Builder);
3637 }
3638};
3639
Eli Friedman9fa28852012-08-08 23:57:20 +00003640} // end anonymous namespace
3641
3642namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003643class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003644 // Possible FPU choices.
3645 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003646 VFP2FPU = (1 << 0),
3647 VFP3FPU = (1 << 1),
3648 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003649 NeonFPU = (1 << 3),
3650 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003651 };
3652
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003653 // Possible HWDiv features.
3654 enum HWDivMode {
3655 HWDivThumb = (1 << 0),
3656 HWDivARM = (1 << 1)
3657 };
3658
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003659 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003660 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003661 }
3662
3663 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3664 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003665
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003666 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003667
Rafael Espindolaeb265472013-08-21 21:59:03 +00003668 enum {
3669 FP_Default,
3670 FP_VFP,
3671 FP_Neon
3672 } FPMath;
3673
Bernard Ogdenda13af32013-10-24 18:32:51 +00003674 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003675
Logan Chien57086ce2012-10-10 06:56:20 +00003676 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003677 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003678 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003679
3680 // Initialized via features.
3681 unsigned SoftFloat : 1;
3682 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003683
Bernard Ogden18b57012013-10-29 09:47:51 +00003684 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003685 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003686
Chris Lattner5cc15e02010-03-03 19:03:45 +00003687 static const Builtin::Info BuiltinInfo[];
3688
Rafael Espindola101d5b92013-05-13 20:09:47 +00003689 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3690 // On linux, binaries targeting old cpus call functions in libgcc to
3691 // perform atomic operations. The implementation in libgcc then calls into
3692 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3693 // is that if we assume the kernel is at least as recent as the hardware,
3694 // it is safe to use atomic instructions on armv6 and newer.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003695 if (!T.isOSLinux() &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003696 T.getOS() != llvm::Triple::FreeBSD &&
Joerg Sonnenbergerfbd51be2013-12-02 16:12:05 +00003697 T.getOS() != llvm::Triple::NetBSD &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003698 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten60afa2d2013-06-15 09:40:14 +00003699 return false;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003700 StringRef ArchName = T.getArchName();
Rafael Espindola92dbc312013-05-14 00:44:24 +00003701 if (T.getArch() == llvm::Triple::arm) {
3702 if (!ArchName.startswith("armv"))
3703 return false;
3704 StringRef VersionStr = ArchName.substr(4);
3705 unsigned Version;
3706 if (VersionStr.getAsInteger(10, Version))
3707 return false;
3708 return Version >= 6;
3709 }
3710 assert(T.getArch() == llvm::Triple::thumb);
3711 if (!ArchName.startswith("thumbv"))
3712 return false;
3713 StringRef VersionStr = ArchName.substr(6);
3714 unsigned Version;
3715 if (VersionStr.getAsInteger(10, Version))
3716 return false;
3717 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003718 }
3719
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003720 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003721 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003722
3723 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003724 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003725
Joerg Sonnenbergerf19dc302014-01-26 20:02:03 +00003726 // size_t is unsigned long on Darwin and NetBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003727 if (T.isOSDarwin() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003728 SizeType = UnsignedLong;
3729 else
3730 SizeType = UnsignedInt;
3731
Rafael Espindolac418ae92014-01-03 19:22:05 +00003732 if (T.getOS() == llvm::Triple::NetBSD) {
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003733 WCharType = SignedInt;
3734 } else {
3735 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3736 WCharType = UnsignedInt;
3737 }
3738
3739 UseBitFieldTypeAlignment = true;
3740
3741 ZeroLengthBitfieldBoundary = 0;
3742
3743 if (IsThumb) {
3744 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3745 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003746 if (T.isOSBinFormatMachO())
3747 DescriptionString = "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3748 "v128:64:128-a:0:32-n32-S64";
3749 else
3750 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3751 "v128:64:128-a:0:32-n32-S64";
3752
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003753 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003754 if (T.isOSBinFormatMachO())
3755 DescriptionString = "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
3756 else
3757 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003758 }
3759
3760 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003761 }
3762
3763 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003764 const llvm::Triple &T = getTriple();
3765
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003766 IsAAPCS = false;
3767
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003768 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003769
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003770 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003771 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003772 SizeType = UnsignedInt;
3773 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003774 SizeType = UnsignedLong;
3775
3776 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3777 WCharType = SignedInt;
3778
3779 // Do not respect the alignment of bit-field types when laying out
3780 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3781 UseBitFieldTypeAlignment = false;
3782
3783 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3784 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3785 /// gcc.
3786 ZeroLengthBitfieldBoundary = 32;
3787
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003788 if (IsThumb) {
3789 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3790 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003791 if (T.isOSBinFormatMachO())
3792 DescriptionString = "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3793 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
3794 else
3795 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3796 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003797 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003798 if (T.isOSBinFormatMachO())
3799 DescriptionString =
3800 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3801 else
3802 DescriptionString =
3803 "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 +00003804 }
3805
3806 // FIXME: Override "preferred align" for double and long long.
3807 }
3808
Chris Lattner17df24e2008-04-21 18:56:49 +00003809public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003810 ARMTargetInfo(const llvm::Triple &Triple)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003811 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3812 IsAAPCS(true) {
Eli Friedman803acb32011-12-22 03:51:45 +00003813 BigEndian = false;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003814 switch (getTriple().getOS()) {
3815 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003816 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003817 break;
3818 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003819 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003820 break;
3821 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003822
Chris Lattner1a8f3942010-04-23 16:29:58 +00003823 // {} in inline assembly are neon specifiers, not assembly variant
3824 // specifiers.
3825 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003826
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003827 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003828 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003829
3830 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003831
3832 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003833 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003834
3835 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003836 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003837 if (shouldUseInlineAtomic(getTriple()))
3838 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003839
3840 // Do force alignment of members that follow zero length bitfields. If
3841 // the alignment of the zero-length bitfield is greater than the member
3842 // that follows it, `bar', `bar' will be aligned as the type of the
3843 // zero length bitfield.
3844 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003845 }
Craig Topper3164f332014-03-11 03:39:26 +00003846 const char *getABI() const override { return ABI.c_str(); }
3847 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003848 ABI = Name;
3849
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003850 // The defaults (above) are for AAPCS, check if we need to change them.
3851 //
3852 // FIXME: We need support for -meabi... we could just mangle it into the
3853 // name.
3854 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003855 setABIAPCS();
3856 return true;
3857 }
3858 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3859 setABIAAPCS();
3860 return true;
3861 }
3862 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003863 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003864
Craig Topper3164f332014-03-11 03:39:26 +00003865 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003866 if (IsAAPCS)
3867 Features["aapcs"] = true;
3868 else
3869 Features["apcs"] = true;
3870
Silviu Barangae5690462013-10-21 10:59:33 +00003871 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003872 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3873 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003874 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3875 CPU == "cortex-a9-mp") {
3876 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003877 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003878 }
3879 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003880 Features["vfp4"] = true;
3881 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003882 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3883 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3884 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003885 Features["vfp4"] = true;
3886 Features["neon"] = true;
3887 Features["hwdiv"] = true;
3888 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003889 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3890 Features["fp-armv8"] = true;
3891 Features["neon"] = true;
3892 Features["hwdiv"] = true;
3893 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003894 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003895 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003896 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003897 // Enable the hwdiv extension for all v8a AArch32 cores by
3898 // default.
3899 ArchName == "armv8a" || ArchName == "armv8" ||
3900 ArchName == "thumbv8a" || ArchName == "thumbv8") {
3901 Features["hwdiv"] = true;
3902 Features["hwdiv-arm"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003903 } else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
3904 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003905 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003906 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003907
Craig Topper3164f332014-03-11 03:39:26 +00003908 bool handleTargetFeatures(std::vector<std::string> &Features,
3909 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003910 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003911 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003912 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003913 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003914 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003915 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3916 if (Features[i] == "+soft-float")
3917 SoftFloat = true;
3918 else if (Features[i] == "+soft-float-abi")
3919 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003920 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003921 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003922 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003923 FPU |= VFP3FPU;
3924 else if (Features[i] == "+vfp4")
3925 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003926 else if (Features[i] == "+fp-armv8")
3927 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003928 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003929 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003930 else if (Features[i] == "+hwdiv")
3931 HWDiv |= HWDivThumb;
3932 else if (Features[i] == "+hwdiv-arm")
3933 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00003934 else if (Features[i] == "+crc")
3935 CRC = 1;
Tim Northover02e38602014-02-03 17:28:04 +00003936 else if (Features[i] == "+crypto")
3937 Crypto = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003938 }
3939
Rafael Espindolaeb265472013-08-21 21:59:03 +00003940 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3941 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3942 return false;
3943 }
3944
3945 if (FPMath == FP_Neon)
3946 Features.push_back("+neonfp");
3947 else if (FPMath == FP_VFP)
3948 Features.push_back("-neonfp");
3949
Daniel Dunbar893d4752009-12-19 04:15:38 +00003950 // Remove front-end specific options which the backend handles differently.
3951 std::vector<std::string>::iterator it;
3952 it = std::find(Features.begin(), Features.end(), "+soft-float");
3953 if (it != Features.end())
3954 Features.erase(it);
3955 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3956 if (it != Features.end())
3957 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00003958 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003959 }
3960
Craig Topper3164f332014-03-11 03:39:26 +00003961 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003962 return llvm::StringSwitch<bool>(Feature)
3963 .Case("arm", true)
3964 .Case("softfloat", SoftFloat)
3965 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003966 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003967 .Case("hwdiv", HWDiv & HWDivThumb)
3968 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003969 .Default(false);
3970 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003971 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003972 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003973 return llvm::StringSwitch<const char*>(Name)
3974 .Cases("arm8", "arm810", "4")
3975 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3976 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3977 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3978 .Case("ep9312", "4T")
3979 .Cases("arm10tdmi", "arm1020t", "5T")
3980 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3981 .Case("arm926ej-s", "5TEJ")
3982 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3983 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003984 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003985 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003986 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003987 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00003988 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003989 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003990 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003991 .Case("swift", "7S")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003992 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003993 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003994 .Cases("cortex-a53", "cortex-a57", "8A")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003995 .Default(0);
3996 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003997 static const char *getCPUProfile(StringRef Name) {
3998 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003999 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00004000 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00004001 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004002 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00004003 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00004004 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004005 }
Craig Topper3164f332014-03-11 03:39:26 +00004006 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004007 if (!getCPUDefineSuffix(Name))
4008 return false;
4009
4010 CPU = Name;
4011 return true;
4012 }
Craig Topper3164f332014-03-11 03:39:26 +00004013 bool setFPMath(StringRef Name) override;
4014 void getTargetDefines(const LangOptions &Opts,
4015 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004016 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004017 Builder.defineMacro("__arm");
4018 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004019
Chris Lattnerecd49032009-03-02 22:27:17 +00004020 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004021 Builder.defineMacro("__ARMEL__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004022 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004023
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004024 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004025 unsigned int CPUArchVer;
4026 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
4027 llvm_unreachable("Invalid char for architecture version number");
4028 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004029 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004030 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
4031 StringRef CPUProfile = getCPUProfile(CPU);
4032 if (!CPUProfile.empty())
4033 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004034
Mike Stump9d54bd72009-04-08 02:07:04 +00004035 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004036
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004037 // FIXME: It's more complicated than this and we don't really support
4038 // interworking.
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004039 if (5 <= CPUArchVer && CPUArchVer <= 8)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004040 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004041
David Tweed8f676532012-10-25 13:33:01 +00004042 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004043 // Embedded targets on Darwin follow AAPCS, but not EABI.
4044 if (!getTriple().isOSDarwin())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004045 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004046 Builder.defineMacro("__ARM_PCS", "1");
4047
David Tweed8f676532012-10-25 13:33:01 +00004048 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004049 Builder.defineMacro("__ARM_PCS_VFP", "1");
4050 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004051
Daniel Dunbar893d4752009-12-19 04:15:38 +00004052 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004053 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004054
4055 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004056 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004057
4058 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004059 Builder.defineMacro("__THUMBEL__");
4060 Builder.defineMacro("__thumb__");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004061 // We check both CPUArchVer and ArchName because when only triple is
4062 // specified, the default CPU is arm1136j-s.
4063 StringRef ArchName = getTriple().getArchName();
4064 if (CPUArch == "6T2" || CPUArchVer >= 7 || ArchName.endswith("v6t2") ||
4065 ArchName.endswith("v7") || ArchName.endswith("v8"))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004066 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004067 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004068 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4069 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004070
4071 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004072 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004073
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004074 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004075 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004076 if (FPU & VFP2FPU)
4077 Builder.defineMacro("__ARM_VFPV2__");
4078 if (FPU & VFP3FPU)
4079 Builder.defineMacro("__ARM_VFPV3__");
4080 if (FPU & VFP4FPU)
4081 Builder.defineMacro("__ARM_VFPV4__");
4082 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004083
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004084 // This only gets set when Neon instructions are actually available, unlike
4085 // the VFP define, hence the soft float and arch check. This is subtly
4086 // different from gcc, we follow the intent which was that it should be set
4087 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004088 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4089 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004090 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004091 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004092
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004093 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4094 Opts.ShortWChar ? "2" : "4");
4095
4096 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4097 Opts.ShortEnums ? "1" : "4");
4098
Bernard Ogden18b57012013-10-29 09:47:51 +00004099 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004100 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004101
Tim Northover02e38602014-02-03 17:28:04 +00004102 if (Crypto)
4103 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4104
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004105 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004106 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4107 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4108 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4109 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4110 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004111 }
Craig Topper3164f332014-03-11 03:39:26 +00004112 void getTargetBuiltins(const Builtin::Info *&Records,
4113 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004114 Records = BuiltinInfo;
4115 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004116 }
Craig Topper3164f332014-03-11 03:39:26 +00004117 bool isCLZForZeroUndef() const override { return false; }
4118 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004119 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004120 }
Craig Topper3164f332014-03-11 03:39:26 +00004121 void getGCCRegNames(const char * const *&Names,
4122 unsigned &NumNames) const override;
4123 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4124 unsigned &NumAliases) const override;
4125 bool validateAsmConstraint(const char *&Name,
4126 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004127 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004128 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004129 case 'l': // r0-r7
4130 case 'h': // r8-r15
4131 case 'w': // VFP Floating point register single precision
4132 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004133 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004134 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004135 case 'Q': // A memory address that is a single base register.
4136 Info.setAllowsMemory();
4137 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004138 case 'U': // a memory reference...
4139 switch (Name[1]) {
4140 case 'q': // ...ARMV4 ldrsb
4141 case 'v': // ...VFP load/store (reg+constant offset)
4142 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004143 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004144 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004145 case 'n': // valid address for Neon doubleword vector load/store
4146 case 'm': // valid address for Neon element and structure load/store
4147 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004148 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004149 Info.setAllowsMemory();
4150 Name++;
4151 return true;
4152 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004153 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004154 return false;
4155 }
Craig Topper3164f332014-03-11 03:39:26 +00004156 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004157 std::string R;
4158 switch (*Constraint) {
4159 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004160 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004161 Constraint++;
4162 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004163 case 'p': // 'p' should be translated to 'r' by default.
4164 R = std::string("r");
4165 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004166 default:
4167 return std::string(1, *Constraint);
4168 }
4169 return R;
4170 }
Craig Topper3164f332014-03-11 03:39:26 +00004171 bool validateConstraintModifier(StringRef Constraint, const char Modifier,
4172 unsigned Size) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004173 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004174 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004175
Bill Wendling9d1ee112012-10-25 23:28:48 +00004176 // Strip off constraint modifiers.
4177 while (Constraint[0] == '=' ||
4178 Constraint[0] == '+' ||
4179 Constraint[0] == '&')
4180 Constraint = Constraint.substr(1);
4181
4182 switch (Constraint[0]) {
4183 default: break;
4184 case 'r': {
4185 switch (Modifier) {
4186 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004187 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004188 case 'q':
4189 // A register of size 32 cannot fit a vector type.
4190 return false;
4191 }
4192 }
4193 }
4194
4195 return true;
4196 }
Craig Topper3164f332014-03-11 03:39:26 +00004197 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004198 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004199 return "";
4200 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004201
Craig Topper3164f332014-03-11 03:39:26 +00004202 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004203 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4204 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004205
Craig Topper3164f332014-03-11 03:39:26 +00004206 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004207 if (RegNo == 0) return 0;
4208 if (RegNo == 1) return 1;
4209 return -1;
4210 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004211};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004212
Rafael Espindolaeb265472013-08-21 21:59:03 +00004213bool ARMTargetInfo::setFPMath(StringRef Name) {
4214 if (Name == "neon") {
4215 FPMath = FP_Neon;
4216 return true;
4217 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4218 Name == "vfp4") {
4219 FPMath = FP_VFP;
4220 return true;
4221 }
4222 return false;
4223}
4224
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004225const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004226 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004227 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004228 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4229
4230 // Float registers
4231 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4232 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4233 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004234 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004235
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004236 // Double registers
4237 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4238 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004239 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4240 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004241
4242 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004243 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4244 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004245};
4246
4247void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004248 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004249 Names = GCCRegNames;
4250 NumNames = llvm::array_lengthof(GCCRegNames);
4251}
4252
4253const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004254 { { "a1" }, "r0" },
4255 { { "a2" }, "r1" },
4256 { { "a3" }, "r2" },
4257 { { "a4" }, "r3" },
4258 { { "v1" }, "r4" },
4259 { { "v2" }, "r5" },
4260 { { "v3" }, "r6" },
4261 { { "v4" }, "r7" },
4262 { { "v5" }, "r8" },
4263 { { "v6", "rfp" }, "r9" },
4264 { { "sl" }, "r10" },
4265 { { "fp" }, "r11" },
4266 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004267 { { "r13" }, "sp" },
4268 { { "r14" }, "lr" },
4269 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004270 // The S, D and Q registers overlap, but aren't really aliases; we
4271 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004272};
4273
4274void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4275 unsigned &NumAliases) const {
4276 Aliases = GCCRegAliases;
4277 NumAliases = llvm::array_lengthof(GCCRegAliases);
4278}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004279
4280const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004281#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004282#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004283 ALL_LANGUAGES },
Tim Northoverc322f832014-01-30 14:47:51 +00004284#define GET_NEON_BUILTINS
4285#include "clang/Basic/arm_neon.inc"
4286#undef GET_NEON_BUILTINS
4287
4288#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4289#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4290 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004291#include "clang/Basic/BuiltinsARM.def"
4292};
Chris Lattner17df24e2008-04-21 18:56:49 +00004293} // end anonymous namespace.
4294
Eli Friedmanf05b7722008-08-20 07:44:10 +00004295namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004296class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00004297 public DarwinTargetInfo<ARMTargetInfo> {
4298protected:
Craig Topper3164f332014-03-11 03:39:26 +00004299 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4300 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004301 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004302 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004303
Torok Edwinb2b37c62009-06-30 17:10:35 +00004304public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004305 DarwinARMTargetInfo(const llvm::Triple &Triple)
4306 : DarwinTargetInfo<ARMTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004307 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004308 // iOS always has 64-bit atomic instructions.
4309 // FIXME: This should be based off of the target features in ARMTargetInfo.
4310 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004311
4312 // Darwin on iOS uses a variant of the ARM C++ ABI.
4313 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004314 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004315};
4316} // end anonymous namespace.
4317
Tony Linthicum76329bf2011-12-12 21:14:55 +00004318
4319namespace {
4320// Hexagon abstract base class
4321class HexagonTargetInfo : public TargetInfo {
4322 static const Builtin::Info BuiltinInfo[];
4323 static const char * const GCCRegNames[];
4324 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4325 std::string CPU;
4326public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004327 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004328 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004329 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004330
4331 // {} in inline assembly are packet specifiers, not assembly variant
4332 // specifiers.
4333 NoAsmVariants = true;
4334 }
4335
Craig Topper3164f332014-03-11 03:39:26 +00004336 void getTargetBuiltins(const Builtin::Info *&Records,
4337 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004338 Records = BuiltinInfo;
4339 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4340 }
4341
Craig Topper3164f332014-03-11 03:39:26 +00004342 bool validateAsmConstraint(const char *&Name,
4343 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004344 return true;
4345 }
4346
Craig Topper3164f332014-03-11 03:39:26 +00004347 void getTargetDefines(const LangOptions &Opts,
4348 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004349
Craig Topper3164f332014-03-11 03:39:26 +00004350 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004351 return Feature == "hexagon";
4352 }
Craig Topper3164f332014-03-11 03:39:26 +00004353
4354 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004355 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004356 }
Craig Topper3164f332014-03-11 03:39:26 +00004357 void getGCCRegNames(const char * const *&Names,
4358 unsigned &NumNames) const override;
4359 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4360 unsigned &NumAliases) const override;
4361 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004362 return "";
4363 }
Sebastian Pop86500282012-01-13 20:37:10 +00004364
4365 static const char *getHexagonCPUSuffix(StringRef Name) {
4366 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004367 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004368 .Case("hexagonv5", "5")
Sebastian Pop86500282012-01-13 20:37:10 +00004369 .Default(0);
4370 }
4371
Craig Topper3164f332014-03-11 03:39:26 +00004372 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004373 if (!getHexagonCPUSuffix(Name))
4374 return false;
4375
Tony Linthicum76329bf2011-12-12 21:14:55 +00004376 CPU = Name;
4377 return true;
4378 }
4379};
4380
4381void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4382 MacroBuilder &Builder) const {
4383 Builder.defineMacro("qdsp6");
4384 Builder.defineMacro("__qdsp6", "1");
4385 Builder.defineMacro("__qdsp6__", "1");
4386
4387 Builder.defineMacro("hexagon");
4388 Builder.defineMacro("__hexagon", "1");
4389 Builder.defineMacro("__hexagon__", "1");
4390
4391 if(CPU == "hexagonv1") {
4392 Builder.defineMacro("__HEXAGON_V1__");
4393 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4394 if(Opts.HexagonQdsp6Compat) {
4395 Builder.defineMacro("__QDSP6_V1__");
4396 Builder.defineMacro("__QDSP6_ARCH__", "1");
4397 }
4398 }
4399 else if(CPU == "hexagonv2") {
4400 Builder.defineMacro("__HEXAGON_V2__");
4401 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4402 if(Opts.HexagonQdsp6Compat) {
4403 Builder.defineMacro("__QDSP6_V2__");
4404 Builder.defineMacro("__QDSP6_ARCH__", "2");
4405 }
4406 }
4407 else if(CPU == "hexagonv3") {
4408 Builder.defineMacro("__HEXAGON_V3__");
4409 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4410 if(Opts.HexagonQdsp6Compat) {
4411 Builder.defineMacro("__QDSP6_V3__");
4412 Builder.defineMacro("__QDSP6_ARCH__", "3");
4413 }
4414 }
4415 else if(CPU == "hexagonv4") {
4416 Builder.defineMacro("__HEXAGON_V4__");
4417 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4418 if(Opts.HexagonQdsp6Compat) {
4419 Builder.defineMacro("__QDSP6_V4__");
4420 Builder.defineMacro("__QDSP6_ARCH__", "4");
4421 }
4422 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004423 else if(CPU == "hexagonv5") {
4424 Builder.defineMacro("__HEXAGON_V5__");
4425 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4426 if(Opts.HexagonQdsp6Compat) {
4427 Builder.defineMacro("__QDSP6_V5__");
4428 Builder.defineMacro("__QDSP6_ARCH__", "5");
4429 }
4430 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004431}
4432
4433const char * const HexagonTargetInfo::GCCRegNames[] = {
4434 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4435 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4436 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4437 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4438 "p0", "p1", "p2", "p3",
4439 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4440};
4441
4442void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4443 unsigned &NumNames) const {
4444 Names = GCCRegNames;
4445 NumNames = llvm::array_lengthof(GCCRegNames);
4446}
4447
4448
4449const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4450 { { "sp" }, "r29" },
4451 { { "fp" }, "r30" },
4452 { { "lr" }, "r31" },
4453 };
4454
4455void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4456 unsigned &NumAliases) const {
4457 Aliases = GCCRegAliases;
4458 NumAliases = llvm::array_lengthof(GCCRegAliases);
4459}
4460
4461
4462const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4463#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4464#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4465 ALL_LANGUAGES },
4466#include "clang/Basic/BuiltinsHexagon.def"
4467};
4468}
4469
4470
Chris Lattner5ba61f02006-10-14 07:39:34 +00004471namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004472// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4473class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004474 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4475 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004476 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004477public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004478 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004479
Craig Topper3164f332014-03-11 03:39:26 +00004480 bool handleTargetFeatures(std::vector<std::string> &Features,
4481 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004482 SoftFloat = false;
4483 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4484 if (Features[i] == "+soft-float")
4485 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004486 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004487 }
Craig Topper3164f332014-03-11 03:39:26 +00004488 void getTargetDefines(const LangOptions &Opts,
4489 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004490 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004491 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004492
4493 if (SoftFloat)
4494 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004495 }
Craig Topper3164f332014-03-11 03:39:26 +00004496
4497 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004498 return llvm::StringSwitch<bool>(Feature)
4499 .Case("softfloat", SoftFloat)
4500 .Case("sparc", true)
4501 .Default(false);
4502 }
Craig Topper3164f332014-03-11 03:39:26 +00004503
4504 void getTargetBuiltins(const Builtin::Info *&Records,
4505 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004506 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00004507 }
Craig Topper3164f332014-03-11 03:39:26 +00004508 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004509 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00004510 }
Craig Topper3164f332014-03-11 03:39:26 +00004511 void getGCCRegNames(const char * const *&Names,
4512 unsigned &NumNames) const override;
4513 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4514 unsigned &NumAliases) const override;
4515 bool validateAsmConstraint(const char *&Name,
4516 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004517 // FIXME: Implement!
4518 return false;
Gabor Greif49991682008-02-21 16:29:08 +00004519 }
Craig Topper3164f332014-03-11 03:39:26 +00004520 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004521 // FIXME: Implement!
4522 return "";
Gabor Greif49991682008-02-21 16:29:08 +00004523 }
4524};
4525
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004526const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00004527 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4528 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4529 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4530 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4531};
4532
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004533void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4534 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004535 Names = GCCRegNames;
4536 NumNames = llvm::array_lengthof(GCCRegNames);
4537}
4538
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004539const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004540 { { "g0" }, "r0" },
4541 { { "g1" }, "r1" },
4542 { { "g2" }, "r2" },
4543 { { "g3" }, "r3" },
4544 { { "g4" }, "r4" },
4545 { { "g5" }, "r5" },
4546 { { "g6" }, "r6" },
4547 { { "g7" }, "r7" },
4548 { { "o0" }, "r8" },
4549 { { "o1" }, "r9" },
4550 { { "o2" }, "r10" },
4551 { { "o3" }, "r11" },
4552 { { "o4" }, "r12" },
4553 { { "o5" }, "r13" },
4554 { { "o6", "sp" }, "r14" },
4555 { { "o7" }, "r15" },
4556 { { "l0" }, "r16" },
4557 { { "l1" }, "r17" },
4558 { { "l2" }, "r18" },
4559 { { "l3" }, "r19" },
4560 { { "l4" }, "r20" },
4561 { { "l5" }, "r21" },
4562 { { "l6" }, "r22" },
4563 { { "l7" }, "r23" },
4564 { { "i0" }, "r24" },
4565 { { "i1" }, "r25" },
4566 { { "i2" }, "r26" },
4567 { { "i3" }, "r27" },
4568 { { "i4" }, "r28" },
4569 { { "i5" }, "r29" },
4570 { { "i6", "fp" }, "r30" },
4571 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00004572};
4573
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004574void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4575 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004576 Aliases = GCCRegAliases;
4577 NumAliases = llvm::array_lengthof(GCCRegAliases);
4578}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004579
4580// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4581class SparcV8TargetInfo : public SparcTargetInfo {
4582public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004583 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004584 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004585 }
4586
Craig Topper3164f332014-03-11 03:39:26 +00004587 void getTargetDefines(const LangOptions &Opts,
4588 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004589 SparcTargetInfo::getTargetDefines(Opts, Builder);
4590 Builder.defineMacro("__sparcv8");
4591 }
4592};
4593
4594// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4595class SparcV9TargetInfo : public SparcTargetInfo {
4596public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004597 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004598 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00004599 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00004600 // This is an LP64 platform.
4601 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004602
4603 // OpenBSD uses long long for int64_t and intmax_t.
4604 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
4605 IntMaxType = SignedLongLong;
4606 UIntMaxType = UnsignedLongLong;
4607 } else {
4608 IntMaxType = SignedLong;
4609 UIntMaxType = UnsignedLong;
4610 }
4611 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00004612
4613 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
4614 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
4615 LongDoubleWidth = 128;
4616 LongDoubleAlign = 128;
4617 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00004618 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004619 }
4620
Craig Topper3164f332014-03-11 03:39:26 +00004621 void getTargetDefines(const LangOptions &Opts,
4622 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004623 SparcTargetInfo::getTargetDefines(Opts, Builder);
4624 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00004625 Builder.defineMacro("__arch64__");
4626 // Solaris and its derivative AuroraUX don't need these variants, but the
4627 // BSDs do.
4628 if (getTriple().getOS() != llvm::Triple::Solaris &&
4629 getTriple().getOS() != llvm::Triple::AuroraUX) {
4630 Builder.defineMacro("__sparc64__");
4631 Builder.defineMacro("__sparc_v9__");
4632 Builder.defineMacro("__sparcv9__");
4633 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004634 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00004635
Craig Topper3164f332014-03-11 03:39:26 +00004636 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00004637 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4638 .Case("v9", true)
4639 .Case("ultrasparc", true)
4640 .Case("ultrasparc3", true)
4641 .Case("niagara", true)
4642 .Case("niagara2", true)
4643 .Case("niagara3", true)
4644 .Case("niagara4", true)
4645 .Default(false);
4646
4647 // No need to store the CPU yet. There aren't any CPU-specific
4648 // macros to define.
4649 return CPUKnown;
4650 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004651};
4652
Gabor Greif49991682008-02-21 16:29:08 +00004653} // end anonymous namespace.
4654
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004655namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004656class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4657public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004658 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
4659 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004660 SizeType = UnsignedInt;
4661 PtrDiffType = SignedInt;
4662 }
4663};
Torok Edwinb2b37c62009-06-30 17:10:35 +00004664class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004665public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004666 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
4667 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00004668 SizeType = UnsignedInt;
4669 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004670 }
4671};
4672} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00004673
Chris Lattnerb781dc792008-05-08 05:58:21 +00004674namespace {
Ulrich Weigand47445072013-05-06 16:26:41 +00004675 class SystemZTargetInfo : public TargetInfo {
4676 static const char *const GCCRegNames[];
4677
4678 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004679 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Ulrich Weigand47445072013-05-06 16:26:41 +00004680 TLSSupported = true;
4681 IntWidth = IntAlign = 32;
4682 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
4683 PointerWidth = PointerAlign = 64;
4684 LongDoubleWidth = 128;
4685 LongDoubleAlign = 64;
4686 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4687 MinGlobalAlign = 16;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004688 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
Ulrich Weigand47445072013-05-06 16:26:41 +00004689 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4690 }
Craig Topper3164f332014-03-11 03:39:26 +00004691 void getTargetDefines(const LangOptions &Opts,
4692 MacroBuilder &Builder) const override {
Ulrich Weigand47445072013-05-06 16:26:41 +00004693 Builder.defineMacro("__s390__");
4694 Builder.defineMacro("__s390x__");
4695 Builder.defineMacro("__zarch__");
4696 Builder.defineMacro("__LONG_DOUBLE_128__");
4697 }
Craig Topper3164f332014-03-11 03:39:26 +00004698 void getTargetBuiltins(const Builtin::Info *&Records,
4699 unsigned &NumRecords) const override {
Ulrich Weigand47445072013-05-06 16:26:41 +00004700 // FIXME: Implement.
4701 Records = 0;
4702 NumRecords = 0;
4703 }
4704
Craig Topper3164f332014-03-11 03:39:26 +00004705 void getGCCRegNames(const char *const *&Names,
4706 unsigned &NumNames) const override;
4707 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4708 unsigned &NumAliases) const override {
Ulrich Weigand47445072013-05-06 16:26:41 +00004709 // No aliases.
4710 Aliases = 0;
4711 NumAliases = 0;
4712 }
Craig Topper3164f332014-03-11 03:39:26 +00004713 bool validateAsmConstraint(const char *&Name,
4714 TargetInfo::ConstraintInfo &info) const override;
4715 const char *getClobbers() const override {
Ulrich Weigand47445072013-05-06 16:26:41 +00004716 // FIXME: Is this really right?
4717 return "";
4718 }
Craig Topper3164f332014-03-11 03:39:26 +00004719 BuiltinVaListKind getBuiltinVaListKind() const override {
Ulrich Weigand47445072013-05-06 16:26:41 +00004720 return TargetInfo::SystemZBuiltinVaList;
4721 }
Craig Topper3164f332014-03-11 03:39:26 +00004722 bool setCPU(const std::string &Name) override {
Richard Sandiford4652d892013-07-19 16:51:51 +00004723 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4724 .Case("z10", true)
4725 .Case("z196", true)
4726 .Case("zEC12", true)
4727 .Default(false);
4728
4729 // No need to store the CPU yet. There aren't any CPU-specific
4730 // macros to define.
4731 return CPUKnown;
4732 }
Ulrich Weigand47445072013-05-06 16:26:41 +00004733 };
4734
4735 const char *const SystemZTargetInfo::GCCRegNames[] = {
4736 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4737 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4738 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
4739 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
4740 };
4741
4742 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
4743 unsigned &NumNames) const {
4744 Names = GCCRegNames;
4745 NumNames = llvm::array_lengthof(GCCRegNames);
4746 }
4747
4748 bool SystemZTargetInfo::
4749 validateAsmConstraint(const char *&Name,
4750 TargetInfo::ConstraintInfo &Info) const {
4751 switch (*Name) {
4752 default:
4753 return false;
4754
4755 case 'a': // Address register
4756 case 'd': // Data register (equivalent to 'r')
4757 case 'f': // Floating-point register
4758 Info.setAllowsRegister();
4759 return true;
4760
4761 case 'I': // Unsigned 8-bit constant
4762 case 'J': // Unsigned 12-bit constant
4763 case 'K': // Signed 16-bit constant
4764 case 'L': // Signed 20-bit displacement (on all targets we support)
4765 case 'M': // 0x7fffffff
4766 return true;
4767
4768 case 'Q': // Memory with base and unsigned 12-bit displacement
4769 case 'R': // Likewise, plus an index
4770 case 'S': // Memory with base and signed 20-bit displacement
4771 case 'T': // Likewise, plus an index
4772 Info.setAllowsMemory();
4773 return true;
4774 }
4775 }
4776}
4777
4778namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004779 class MSP430TargetInfo : public TargetInfo {
4780 static const char * const GCCRegNames[];
4781 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004782 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004783 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004784 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00004785 IntWidth = 16; IntAlign = 16;
4786 LongWidth = 32; LongLongWidth = 64;
4787 LongAlign = LongLongAlign = 16;
4788 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004789 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004790 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00004791 IntMaxType = SignedLongLong;
4792 UIntMaxType = UnsignedLongLong;
4793 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004794 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00004795 SigAtomicType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004796 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00004797 }
4798 void getTargetDefines(const LangOptions &Opts,
4799 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004800 Builder.defineMacro("MSP430");
4801 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004802 // FIXME: defines for different 'flavours' of MCU
4803 }
Craig Topper3164f332014-03-11 03:39:26 +00004804 void getTargetBuiltins(const Builtin::Info *&Records,
4805 unsigned &NumRecords) const override {
4806 // FIXME: Implement.
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004807 Records = 0;
4808 NumRecords = 0;
4809 }
Craig Topper3164f332014-03-11 03:39:26 +00004810 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004811 return Feature == "msp430";
4812 }
Craig Topper3164f332014-03-11 03:39:26 +00004813 void getGCCRegNames(const char * const *&Names,
4814 unsigned &NumNames) const override;
4815 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4816 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004817 // No aliases.
4818 Aliases = 0;
4819 NumAliases = 0;
4820 }
Craig Topper3164f332014-03-11 03:39:26 +00004821 bool validateAsmConstraint(const char *&Name,
4822 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00004823 // No target constraints for now.
4824 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004825 }
Craig Topper3164f332014-03-11 03:39:26 +00004826 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004827 // FIXME: Is this really right?
4828 return "";
4829 }
Craig Topper3164f332014-03-11 03:39:26 +00004830 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004831 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00004832 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004833 }
4834 };
4835
4836 const char * const MSP430TargetInfo::GCCRegNames[] = {
4837 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4838 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4839 };
4840
4841 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4842 unsigned &NumNames) const {
4843 Names = GCCRegNames;
4844 NumNames = llvm::array_lengthof(GCCRegNames);
4845 }
4846}
4847
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00004848namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004849
Mike Stump11289f42009-09-09 15:08:12 +00004850 // LLVM and Clang cannot be used directly to output native binaries for
4851 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00004852 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00004853 //
4854 // TCE uses the llvm bitcode as input and uses it for generating customized
4855 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00004856 // publicly available in http://tce.cs.tut.fi
4857
Eli Friedman1f191002011-10-07 19:51:42 +00004858 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4859 3, // opencl_global
4860 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00004861 5, // opencl_constant
4862 0, // cuda_device
4863 0, // cuda_constant
4864 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00004865 };
4866
Eli Friedmana9c3d712009-08-19 20:47:07 +00004867 class TCETargetInfo : public TargetInfo{
4868 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004869 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004870 TLSSupported = false;
4871 IntWidth = 32;
4872 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004873 PointerWidth = 32;
4874 IntAlign = 32;
4875 LongAlign = LongLongAlign = 32;
4876 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004877 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004878 SizeType = UnsignedInt;
4879 IntMaxType = SignedLong;
4880 UIntMaxType = UnsignedLong;
4881 IntPtrType = SignedInt;
4882 PtrDiffType = SignedInt;
4883 FloatWidth = 32;
4884 FloatAlign = 32;
4885 DoubleWidth = 32;
4886 DoubleAlign = 32;
4887 LongDoubleWidth = 32;
4888 LongDoubleAlign = 32;
4889 FloatFormat = &llvm::APFloat::IEEEsingle;
4890 DoubleFormat = &llvm::APFloat::IEEEsingle;
4891 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00004892 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
4893 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00004894 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00004895 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004896 }
4897
Craig Topper3164f332014-03-11 03:39:26 +00004898 void getTargetDefines(const LangOptions &Opts,
4899 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004900 DefineStd(Builder, "tce", Opts);
4901 Builder.defineMacro("__TCE__");
4902 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00004903 }
Craig Topper3164f332014-03-11 03:39:26 +00004904 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004905 return Feature == "tce";
4906 }
Craig Topper3164f332014-03-11 03:39:26 +00004907
4908 void getTargetBuiltins(const Builtin::Info *&Records,
4909 unsigned &NumRecords) const override {}
4910 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00004911 return "";
4912 }
Craig Topper3164f332014-03-11 03:39:26 +00004913 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004914 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004915 }
Craig Topper3164f332014-03-11 03:39:26 +00004916 void getGCCRegNames(const char * const *&Names,
4917 unsigned &NumNames) const override {}
4918 bool validateAsmConstraint(const char *&Name,
4919 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00004920 return true;
4921 }
Craig Topper3164f332014-03-11 03:39:26 +00004922 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4923 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00004924 };
4925}
4926
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004927namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004928class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00004929 virtual void setDescriptionString() = 0;
4930
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004931 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004932 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00004933 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00004934 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004935 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00004936 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004937 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00004938 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004939 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004940 enum DspRevEnum {
4941 NoDSP, DSP1, DSP2
4942 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00004943 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004944
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004945protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00004946 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004947 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004948
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004949public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004950 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
4951 const std::string &CPUStr)
4952 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004953 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004954 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004955
Craig Topper3164f332014-03-11 03:39:26 +00004956 const char *getABI() const override { return ABI.c_str(); }
4957 bool setABI(const std::string &Name) override = 0;
4958 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00004959 CPU = Name;
4960 return true;
4961 }
Craig Topper3164f332014-03-11 03:39:26 +00004962 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00004963 // The backend enables certain ABI's by default according to the
4964 // architecture.
4965 // Disable both possible defaults so that we don't end up with multiple
4966 // ABI's selected and trigger an assertion.
4967 Features["o32"] = false;
4968 Features["n64"] = false;
4969
Eric Christopher0b26a612010-03-02 02:41:08 +00004970 Features[ABI] = true;
4971 Features[CPU] = true;
4972 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004973
Craig Topper3164f332014-03-11 03:39:26 +00004974 void getTargetDefines(const LangOptions &Opts,
4975 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00004976 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00004977 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00004978 if (Opts.GNUMode)
4979 Builder.defineMacro("mips");
4980
Simon Atanasyan683535b2012-08-29 19:14:58 +00004981 Builder.defineMacro("__REGISTER_PREFIX__", "");
4982
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004983 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004984 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004985 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004986 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004987 case SoftFloat:
4988 Builder.defineMacro("__mips_soft_float", Twine(1));
4989 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004990 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00004991
Simon Atanasyan16071912013-04-14 14:07:30 +00004992 if (IsSingleFloat)
4993 Builder.defineMacro("__mips_single_float", Twine(1));
4994
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004995 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
4996 Builder.defineMacro("_MIPS_FPSET",
4997 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
4998
Simon Atanasyan72244b62012-07-05 16:06:06 +00004999 if (IsMips16)
5000 Builder.defineMacro("__mips16", Twine(1));
5001
Simon Atanasyan60777612013-04-14 14:07:51 +00005002 if (IsMicromips)
5003 Builder.defineMacro("__mips_micromips", Twine(1));
5004
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005005 if (IsNan2008)
5006 Builder.defineMacro("__mips_nan2008", Twine(1));
5007
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005008 switch (DspRev) {
5009 default:
5010 break;
5011 case DSP1:
5012 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5013 Builder.defineMacro("__mips_dsp", Twine(1));
5014 break;
5015 case DSP2:
5016 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5017 Builder.defineMacro("__mips_dspr2", Twine(1));
5018 Builder.defineMacro("__mips_dsp", Twine(1));
5019 break;
5020 }
5021
Jack Carter44ff1e52013-08-12 17:20:29 +00005022 if (HasMSA)
5023 Builder.defineMacro("__mips_msa", Twine(1));
5024
Simon Atanasyan26f19672012-04-05 19:28:31 +00005025 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5026 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5027 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005028
5029 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5030 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005031 }
5032
Craig Topper3164f332014-03-11 03:39:26 +00005033 void getTargetBuiltins(const Builtin::Info *&Records,
5034 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005035 Records = BuiltinInfo;
5036 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005037 }
Craig Topper3164f332014-03-11 03:39:26 +00005038 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005039 return llvm::StringSwitch<bool>(Feature)
5040 .Case("mips", true)
5041 .Case("fp64", HasFP64)
5042 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005043 }
Craig Topper3164f332014-03-11 03:39:26 +00005044 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005045 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005046 }
Craig Topper3164f332014-03-11 03:39:26 +00005047 void getGCCRegNames(const char * const *&Names,
5048 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005049 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005050 // CPU register names
5051 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005052 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5053 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5054 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005055 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5056 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005057 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5058 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5059 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5060 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005061 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005062 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005063 "$fcc5","$fcc6","$fcc7",
5064 // MSA register names
5065 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5066 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5067 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5068 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5069 // MSA control register names
5070 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5071 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005072 };
5073 Names = GCCRegNames;
5074 NumNames = llvm::array_lengthof(GCCRegNames);
5075 }
Craig Topper3164f332014-03-11 03:39:26 +00005076 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5077 unsigned &NumAliases) const override = 0;
5078 bool validateAsmConstraint(const char *&Name,
5079 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005080 switch (*Name) {
5081 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005082 return false;
5083
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005084 case 'r': // CPU registers.
5085 case 'd': // Equivalent to "r" unless generating MIPS16 code.
5086 case 'y': // Equivalent to "r", backwards compatibility only.
5087 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005088 case 'c': // $25 for indirect jumps
5089 case 'l': // lo register
5090 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005091 Info.setAllowsRegister();
5092 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005093 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005094 Info.setAllowsMemory();
5095 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005096 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005097 }
5098
Craig Topper3164f332014-03-11 03:39:26 +00005099 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005100 // FIXME: Implement!
5101 return "";
5102 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005103
Craig Topper3164f332014-03-11 03:39:26 +00005104 bool handleTargetFeatures(std::vector<std::string> &Features,
5105 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005106 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005107 IsMicromips = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005108 IsNan2008 = false;
Simon Atanasyan16071912013-04-14 14:07:30 +00005109 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005110 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005111 DspRev = NoDSP;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005112 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005113
5114 for (std::vector<std::string>::iterator it = Features.begin(),
5115 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005116 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005117 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005118 else if (*it == "+soft-float")
5119 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005120 else if (*it == "+mips16")
5121 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005122 else if (*it == "+micromips")
5123 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005124 else if (*it == "+dsp")
5125 DspRev = std::max(DspRev, DSP1);
5126 else if (*it == "+dspr2")
5127 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005128 else if (*it == "+msa")
5129 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005130 else if (*it == "+fp64")
5131 HasFP64 = true;
5132 else if (*it == "-fp64")
5133 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005134 else if (*it == "+nan2008")
5135 IsNan2008 = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005136 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005137
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005138 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005139 std::vector<std::string>::iterator it =
5140 std::find(Features.begin(), Features.end(), "+soft-float");
5141 if (it != Features.end())
5142 Features.erase(it);
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005143 it = std::find(Features.begin(), Features.end(), "+nan2008");
5144 if (it != Features.end())
5145 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005146
Akira Hatanaka9064e362013-10-29 18:30:33 +00005147 setDescriptionString();
5148
Rafael Espindolaeb265472013-08-21 21:59:03 +00005149 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005150 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005151
Craig Topper3164f332014-03-11 03:39:26 +00005152 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005153 if (RegNo == 0) return 4;
5154 if (RegNo == 1) return 5;
5155 return -1;
5156 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005157};
5158
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005159const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5160#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5161#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5162 ALL_LANGUAGES },
5163#include "clang/Basic/BuiltinsMips.def"
5164};
5165
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005166class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005167public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005168 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005169 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005170 SizeType = UnsignedInt;
5171 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005172 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005173 }
Craig Topper3164f332014-03-11 03:39:26 +00005174 bool setABI(const std::string &Name) override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005175 if ((Name == "o32") || (Name == "eabi")) {
5176 ABI = Name;
5177 return true;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005178 } else if (Name == "32") {
5179 ABI = "o32";
5180 return true;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005181 } else
5182 return false;
5183 }
Craig Topper3164f332014-03-11 03:39:26 +00005184 void getTargetDefines(const LangOptions &Opts,
5185 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005186 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005187
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005188 Builder.defineMacro("__mips", "32");
5189
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005190 if (ABI == "o32") {
5191 Builder.defineMacro("__mips_o32");
5192 Builder.defineMacro("_ABIO32", "1");
5193 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5194 }
5195 else if (ABI == "eabi")
5196 Builder.defineMacro("__mips_eabi");
5197 else
David Blaikie83d382b2011-09-23 05:06:16 +00005198 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005199 }
Craig Topper3164f332014-03-11 03:39:26 +00005200 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5201 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005202 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5203 { { "at" }, "$1" },
5204 { { "v0" }, "$2" },
5205 { { "v1" }, "$3" },
5206 { { "a0" }, "$4" },
5207 { { "a1" }, "$5" },
5208 { { "a2" }, "$6" },
5209 { { "a3" }, "$7" },
5210 { { "t0" }, "$8" },
5211 { { "t1" }, "$9" },
5212 { { "t2" }, "$10" },
5213 { { "t3" }, "$11" },
5214 { { "t4" }, "$12" },
5215 { { "t5" }, "$13" },
5216 { { "t6" }, "$14" },
5217 { { "t7" }, "$15" },
5218 { { "s0" }, "$16" },
5219 { { "s1" }, "$17" },
5220 { { "s2" }, "$18" },
5221 { { "s3" }, "$19" },
5222 { { "s4" }, "$20" },
5223 { { "s5" }, "$21" },
5224 { { "s6" }, "$22" },
5225 { { "s7" }, "$23" },
5226 { { "t8" }, "$24" },
5227 { { "t9" }, "$25" },
5228 { { "k0" }, "$26" },
5229 { { "k1" }, "$27" },
5230 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005231 { { "sp","$sp" }, "$29" },
5232 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005233 { { "ra" }, "$31" }
5234 };
5235 Aliases = GCCRegAliases;
5236 NumAliases = llvm::array_lengthof(GCCRegAliases);
5237 }
5238};
5239
5240class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005241 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005242 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005243 }
5244
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005245public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005246 Mips32EBTargetInfo(const llvm::Triple &Triple)
5247 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005248 }
Craig Topper3164f332014-03-11 03:39:26 +00005249 void getTargetDefines(const LangOptions &Opts,
5250 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005251 DefineStd(Builder, "MIPSEB", Opts);
5252 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005253 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005254 }
5255};
5256
5257class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005258 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005259 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005260 }
5261
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005262public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005263 Mips32ELTargetInfo(const llvm::Triple &Triple)
5264 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005265 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005266 }
Craig Topper3164f332014-03-11 03:39:26 +00005267 void getTargetDefines(const LangOptions &Opts,
5268 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005269 DefineStd(Builder, "MIPSEL", Opts);
5270 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005271 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005272 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005273};
Akira Hatanakabef17452011-09-20 19:21:49 +00005274
5275class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005276public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005277 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005278 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005279 LongWidth = LongAlign = 64;
5280 PointerWidth = PointerAlign = 64;
5281 LongDoubleWidth = LongDoubleAlign = 128;
5282 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005283 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5284 LongDoubleWidth = LongDoubleAlign = 64;
5285 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5286 }
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005287 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005288 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005289 }
Craig Topper3164f332014-03-11 03:39:26 +00005290 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005291 if (Name == "n32") {
5292 LongWidth = LongAlign = 32;
5293 PointerWidth = PointerAlign = 32;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005294 ABI = Name;
5295 return true;
5296 } else if (Name == "n64") {
5297 ABI = Name;
5298 return true;
5299 } else if (Name == "64") {
5300 ABI = "n64";
5301 return true;
5302 } else
5303 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005304 }
Craig Topper3164f332014-03-11 03:39:26 +00005305 void getTargetDefines(const LangOptions &Opts,
5306 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005307 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005308
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005309 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005310 Builder.defineMacro("__mips64");
5311 Builder.defineMacro("__mips64__");
5312
Akira Hatanakabef17452011-09-20 19:21:49 +00005313 if (ABI == "n32") {
5314 Builder.defineMacro("__mips_n32");
5315 Builder.defineMacro("_ABIN32", "2");
5316 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5317 }
5318 else if (ABI == "n64") {
5319 Builder.defineMacro("__mips_n64");
5320 Builder.defineMacro("_ABI64", "3");
5321 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5322 }
5323 else
David Blaikie83d382b2011-09-23 05:06:16 +00005324 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005325 }
Craig Topper3164f332014-03-11 03:39:26 +00005326 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5327 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005328 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5329 { { "at" }, "$1" },
5330 { { "v0" }, "$2" },
5331 { { "v1" }, "$3" },
5332 { { "a0" }, "$4" },
5333 { { "a1" }, "$5" },
5334 { { "a2" }, "$6" },
5335 { { "a3" }, "$7" },
5336 { { "a4" }, "$8" },
5337 { { "a5" }, "$9" },
5338 { { "a6" }, "$10" },
5339 { { "a7" }, "$11" },
5340 { { "t0" }, "$12" },
5341 { { "t1" }, "$13" },
5342 { { "t2" }, "$14" },
5343 { { "t3" }, "$15" },
5344 { { "s0" }, "$16" },
5345 { { "s1" }, "$17" },
5346 { { "s2" }, "$18" },
5347 { { "s3" }, "$19" },
5348 { { "s4" }, "$20" },
5349 { { "s5" }, "$21" },
5350 { { "s6" }, "$22" },
5351 { { "s7" }, "$23" },
5352 { { "t8" }, "$24" },
5353 { { "t9" }, "$25" },
5354 { { "k0" }, "$26" },
5355 { { "k1" }, "$27" },
5356 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005357 { { "sp","$sp" }, "$29" },
5358 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005359 { { "ra" }, "$31" }
5360 };
5361 Aliases = GCCRegAliases;
5362 NumAliases = llvm::array_lengthof(GCCRegAliases);
5363 }
5364};
5365
5366class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005367 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005368 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005369 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 +00005370 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005371 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005372
Akira Hatanakabef17452011-09-20 19:21:49 +00005373 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005374
Akira Hatanakabef17452011-09-20 19:21:49 +00005375public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005376 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005377 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005378 void getTargetDefines(const LangOptions &Opts,
5379 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005380 DefineStd(Builder, "MIPSEB", Opts);
5381 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005382 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005383 }
5384};
5385
5386class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005387 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005388 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005389 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 +00005390 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005391 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005392 }
5393public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005394 Mips64ELTargetInfo(const llvm::Triple &Triple)
5395 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005396 // Default ABI is n64.
5397 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005398 }
Craig Topper3164f332014-03-11 03:39:26 +00005399 void getTargetDefines(const LangOptions &Opts,
5400 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005401 DefineStd(Builder, "MIPSEL", Opts);
5402 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005403 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005404 }
5405};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005406} // end anonymous namespace.
5407
Ivan Krasindd7403e2011-08-24 20:22:22 +00005408namespace {
5409class PNaClTargetInfo : public TargetInfo {
5410public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005411 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005412 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005413 this->UserLabelPrefix = "";
5414 this->LongAlign = 32;
5415 this->LongWidth = 32;
5416 this->PointerAlign = 32;
5417 this->PointerWidth = 32;
5418 this->IntMaxType = TargetInfo::SignedLongLong;
5419 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5420 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005421 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005422 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005423 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005424 this->SizeType = TargetInfo::UnsignedInt;
5425 this->PtrDiffType = TargetInfo::SignedInt;
5426 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005427 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005428 }
5429
Craig Topper3164f332014-03-11 03:39:26 +00005430 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005431 }
Craig Toppere6f17d02014-03-11 04:07:52 +00005432 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005433 Builder.defineMacro("__le32__");
5434 Builder.defineMacro("__pnacl__");
5435 }
Craig Topper3164f332014-03-11 03:39:26 +00005436 void getTargetDefines(const LangOptions &Opts,
5437 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005438 getArchDefines(Opts, Builder);
5439 }
Craig Topper3164f332014-03-11 03:39:26 +00005440 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005441 return Feature == "pnacl";
5442 }
Craig Topper3164f332014-03-11 03:39:26 +00005443 void getTargetBuiltins(const Builtin::Info *&Records,
5444 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005445 }
Craig Topper3164f332014-03-11 03:39:26 +00005446 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005447 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005448 }
Craig Topper3164f332014-03-11 03:39:26 +00005449 void getGCCRegNames(const char * const *&Names,
5450 unsigned &NumNames) const override;
5451 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5452 unsigned &NumAliases) const override;
5453 bool validateAsmConstraint(const char *&Name,
5454 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005455 return false;
5456 }
5457
Craig Topper3164f332014-03-11 03:39:26 +00005458 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005459 return "";
5460 }
5461};
5462
5463void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5464 unsigned &NumNames) const {
5465 Names = NULL;
5466 NumNames = 0;
5467}
5468
5469void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5470 unsigned &NumAliases) const {
5471 Aliases = NULL;
5472 NumAliases = 0;
5473}
5474} // end anonymous namespace.
5475
Guy Benyeib798fc92012-12-11 21:38:14 +00005476namespace {
5477 static const unsigned SPIRAddrSpaceMap[] = {
5478 1, // opencl_global
5479 3, // opencl_local
5480 2, // opencl_constant
5481 0, // cuda_device
5482 0, // cuda_constant
5483 0 // cuda_shared
5484 };
5485 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00005486 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005487 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005488 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5489 "SPIR target must use unknown OS");
5490 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5491 "SPIR target must use unknown environment type");
5492 BigEndian = false;
5493 TLSSupported = false;
5494 LongWidth = LongAlign = 64;
5495 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005496 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00005497 // Define available target features
5498 // These must be defined in sorted order!
5499 NoAsmVariants = true;
5500 }
Craig Topper3164f332014-03-11 03:39:26 +00005501 void getTargetDefines(const LangOptions &Opts,
5502 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005503 DefineStd(Builder, "SPIR", Opts);
5504 }
Craig Topper3164f332014-03-11 03:39:26 +00005505 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005506 return Feature == "spir";
5507 }
Craig Topper3164f332014-03-11 03:39:26 +00005508
5509 void getTargetBuiltins(const Builtin::Info *&Records,
5510 unsigned &NumRecords) const override {}
5511 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005512 return "";
5513 }
Craig Topper3164f332014-03-11 03:39:26 +00005514 void getGCCRegNames(const char * const *&Names,
5515 unsigned &NumNames) const override {}
5516 bool validateAsmConstraint(const char *&Name,
5517 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005518 return true;
5519 }
Craig Topper3164f332014-03-11 03:39:26 +00005520 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5521 unsigned &NumAliases) const override {}
5522 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005523 return TargetInfo::VoidPtrBuiltinVaList;
5524 }
5525 };
5526
5527
5528 class SPIR32TargetInfo : public SPIRTargetInfo {
5529 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005530 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005531 PointerWidth = PointerAlign = 32;
5532 SizeType = TargetInfo::UnsignedInt;
5533 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5534 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00005535 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
5536 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005537 }
Craig Topper3164f332014-03-11 03:39:26 +00005538 void getTargetDefines(const LangOptions &Opts,
5539 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00005540 DefineStd(Builder, "SPIR32", Opts);
5541 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005542 };
5543
5544 class SPIR64TargetInfo : public SPIRTargetInfo {
5545 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005546 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005547 PointerWidth = PointerAlign = 64;
5548 SizeType = TargetInfo::UnsignedLong;
5549 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005550 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
5551 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005552 }
Craig Topper3164f332014-03-11 03:39:26 +00005553 void getTargetDefines(const LangOptions &Opts,
5554 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00005555 DefineStd(Builder, "SPIR64", Opts);
5556 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005557 };
5558}
5559
Robert Lytton0e076492013-08-13 09:43:10 +00005560namespace {
5561class XCoreTargetInfo : public TargetInfo {
5562 static const Builtin::Info BuiltinInfo[];
5563public:
5564 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5565 BigEndian = false;
5566 NoAsmVariants = true;
5567 LongLongAlign = 32;
5568 SuitableAlign = 32;
5569 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00005570 SizeType = UnsignedInt;
5571 PtrDiffType = SignedInt;
5572 IntPtrType = SignedInt;
5573 WCharType = UnsignedChar;
5574 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00005575 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005576 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 +00005577 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00005578 }
Craig Topper3164f332014-03-11 03:39:26 +00005579 void getTargetDefines(const LangOptions &Opts,
5580 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005581 Builder.defineMacro("__XS1B__");
5582 }
Craig Topper3164f332014-03-11 03:39:26 +00005583 void getTargetBuiltins(const Builtin::Info *&Records,
5584 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005585 Records = BuiltinInfo;
5586 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5587 }
Craig Topper3164f332014-03-11 03:39:26 +00005588 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005589 return TargetInfo::VoidPtrBuiltinVaList;
5590 }
Craig Topper3164f332014-03-11 03:39:26 +00005591 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005592 return "";
5593 }
Craig Topper3164f332014-03-11 03:39:26 +00005594 void getGCCRegNames(const char * const *&Names,
5595 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005596 static const char * const GCCRegNames[] = {
5597 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5598 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
5599 };
5600 Names = GCCRegNames;
5601 NumNames = llvm::array_lengthof(GCCRegNames);
5602 }
Craig Topper3164f332014-03-11 03:39:26 +00005603 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5604 unsigned &NumAliases) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005605 Aliases = NULL;
5606 NumAliases = 0;
5607 }
Craig Topper3164f332014-03-11 03:39:26 +00005608 bool validateAsmConstraint(const char *&Name,
5609 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005610 return false;
5611 }
Craig Topper3164f332014-03-11 03:39:26 +00005612 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00005613 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
5614 return (RegNo < 2)? RegNo : -1;
5615 }
Robert Lytton0e076492013-08-13 09:43:10 +00005616};
5617
5618const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
5619#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5620#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5621 ALL_LANGUAGES },
5622#include "clang/Basic/BuiltinsXCore.def"
5623};
5624} // end anonymous namespace.
5625
Ivan Krasindd7403e2011-08-24 20:22:22 +00005626
Chris Lattner5ba61f02006-10-14 07:39:34 +00005627//===----------------------------------------------------------------------===//
5628// Driver code
5629//===----------------------------------------------------------------------===//
5630
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005631static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00005632 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00005633
Daniel Dunbar52322032009-08-18 05:47:58 +00005634 switch (Triple.getArch()) {
5635 default:
5636 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00005637
Robert Lytton0e076492013-08-13 09:43:10 +00005638 case llvm::Triple::xcore:
5639 return new XCoreTargetInfo(Triple);
5640
Tony Linthicum76329bf2011-12-12 21:14:55 +00005641 case llvm::Triple::hexagon:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005642 return new HexagonTargetInfo(Triple);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005643
Tim Northover9bb857a2013-01-31 12:13:10 +00005644 case llvm::Triple::aarch64:
5645 switch (os) {
5646 case llvm::Triple::Linux:
Christian Pirker9b019ae2014-02-25 13:51:00 +00005647 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
Joerg Sonnenberger98534392014-01-13 18:25:15 +00005648 case llvm::Triple::NetBSD:
Christian Pirker9b019ae2014-02-25 13:51:00 +00005649 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005650 default:
Christian Pirker9b019ae2014-02-25 13:51:00 +00005651 return new AArch64leTargetInfo(Triple);
5652 }
5653
5654 case llvm::Triple::aarch64_be:
5655 switch (os) {
5656 case llvm::Triple::Linux:
5657 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
5658 case llvm::Triple::NetBSD:
5659 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
5660 default:
5661 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005662 }
5663
Daniel Dunbar52322032009-08-18 05:47:58 +00005664 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00005665 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00005666 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005667 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005668
Daniel Dunbar52322032009-08-18 05:47:58 +00005669 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00005670 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005671 return new LinuxTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005672 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005673 return new FreeBSDTargetInfo<ARMTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005674 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005675 return new NetBSDTargetInfo<ARMTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005676 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005677 return new OpenBSDTargetInfo<ARMTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005678 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005679 return new BitrigTargetInfo<ARMTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005680 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005681 return new RTEMSTargetInfo<ARMTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005682 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005683 return new NaClTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005684 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005685 return new ARMTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005686 }
Eli Friedmanb5366062008-05-20 14:21:01 +00005687
Daniel Dunbar52322032009-08-18 05:47:58 +00005688 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005689 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00005690
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005691 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005692 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005693 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005694 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005695 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005696 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005697 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005698 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005699 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005700 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005701 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005702 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005703 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005704
5705 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005706 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005707 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005708 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005709 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005710 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005711 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005712 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005713 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005714 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00005715 case llvm::Triple::NaCl:
5716 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005717 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005718 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005719 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005720
Akira Hatanakabef17452011-09-20 19:21:49 +00005721 case llvm::Triple::mips64:
5722 switch (os) {
5723 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005724 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005725 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005726 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005727 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005728 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005729 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005730 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005731 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005732 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005733 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005734 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005735 }
5736
5737 case llvm::Triple::mips64el:
5738 switch (os) {
5739 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005740 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005741 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005742 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005743 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005744 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005745 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005746 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005747 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005748 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005749 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005750 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005751 }
5752
Ivan Krasindd7403e2011-08-24 20:22:22 +00005753 case llvm::Triple::le32:
5754 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00005755 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005756 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00005757 default:
5758 return NULL;
5759 }
5760
Daniel Dunbar52322032009-08-18 05:47:58 +00005761 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005762 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005763 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005764 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005765 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005766 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005767 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005768 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005769 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005770 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005771 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005772 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005773 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005774 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005775 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005776 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005777 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005778
5779 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005780 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005781 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005782 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005783 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005784 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005785 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005786 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005787 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005788 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005789 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005790 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005791 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005792 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005793 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005794
Bill Schmidt778d3872013-07-26 01:36:11 +00005795 case llvm::Triple::ppc64le:
5796 switch (os) {
5797 case llvm::Triple::Linux:
5798 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
5799 default:
5800 return new PPC64TargetInfo(Triple);
5801 }
5802
Peter Collingbournec947aae2012-05-20 23:28:41 +00005803 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005804 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005805 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005806 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005807
Eli Friedmand13b41e2012-10-12 23:32:00 +00005808 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005809 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00005810
Daniel Dunbar52322032009-08-18 05:47:58 +00005811 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005812 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005813 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005814 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005815 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005816 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005817 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005818 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005819 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005820 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005821 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005822 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005823 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005824 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005825 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005826 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005827 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005828
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005829 case llvm::Triple::sparcv9:
5830 switch (os) {
5831 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005832 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005833 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005834 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005835 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005836 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005837 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005838 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005839 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005840 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005841 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005842 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005843 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005844 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005845 }
5846
Ulrich Weigand47445072013-05-06 16:26:41 +00005847 case llvm::Triple::systemz:
5848 switch (os) {
5849 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005850 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005851 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005852 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005853 }
5854
Eli Friedmana9c3d712009-08-19 20:47:07 +00005855 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005856 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00005857
Daniel Dunbar52322032009-08-18 05:47:58 +00005858 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005859 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005860 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005861
Daniel Dunbar52322032009-08-18 05:47:58 +00005862 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005863 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005864 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005865 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005866 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005867 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005868 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005869 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005870 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005871 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005872 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005873 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005874 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005875 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005876 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005877 case llvm::Triple::KFreeBSD:
5878 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005879 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005880 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005881 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005882 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005883 case llvm::Triple::Cygwin:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005884 return new CygwinX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005885 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005886 return new MinGWX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005887 case llvm::Triple::Win32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005888 return new VisualStudioWindowsX86_32TargetInfo(Triple);
Chris Lattnerb986aba2010-04-11 19:29:39 +00005889 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005890 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005891 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005892 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005893 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005894 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005895 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005896 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005897 }
5898
5899 case llvm::Triple::x86_64:
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005900 if (Triple.isOSDarwin() || Triple.getObjectFormat() == llvm::Triple::MachO)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005901 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005902
Daniel Dunbar52322032009-08-18 05:47:58 +00005903 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005904 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005905 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005906 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005907 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00005908 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005909 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005910 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005911 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005912 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005913 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005914 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005915 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005916 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005917 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005918 case llvm::Triple::KFreeBSD:
5919 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005920 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005921 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00005922 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005923 return new MinGWX86_64TargetInfo(Triple);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00005924 case llvm::Triple::Win32: // This is what Triple.h supports now.
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005925 return new VisualStudioWindowsX86_64TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005926 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005927 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005928 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005929 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005930 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005931
5932 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005933 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005934 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005935 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005936 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005937 }
5938 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005939 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005940 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005941 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005942 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005943 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005944 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00005945}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005946
5947/// CreateTargetInfo - Return the target info object for the specified target
5948/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00005949TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregorf8715de2012-11-16 04:24:59 +00005950 TargetOptions *Opts) {
5951 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005952
5953 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00005954 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005955 if (!Target) {
5956 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5957 return 0;
5958 }
Douglas Gregorbc10b9f2012-10-15 16:45:32 +00005959 Target->setTargetOpts(Opts);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005960
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005961 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005962 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5963 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005964 return 0;
5965 }
5966
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005967 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005968 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5969 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005970 return 0;
5971 }
5972
Rafael Espindolaeb265472013-08-21 21:59:03 +00005973 // Set the fp math unit.
5974 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
5975 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
5976 return 0;
5977 }
5978
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005979 // Compute the default target features, we need the target to handle this
5980 // because features may have dependencies on one another.
5981 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005982 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005983
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005984 // Apply the user specified deltas.
5985 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
5986 I < N; ++I) {
5987 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00005988 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005989 bool Enabled = Name[0] == '+';
5990 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005991 }
5992
5993 // Add the features to the compile options.
5994 //
5995 // FIXME: If we are completely confident that we have the right set, we only
5996 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005997 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005998 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5999 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006000 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006001 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Rafael Espindolaeb265472013-08-21 21:59:03 +00006002 return 0;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006003
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006004 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006005}