blob: 1030a8cc38424cd705bd943bba411ab984718abd [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
Tim Northover2fe823a2013-08-01 09:23:19 +00003444 if (FPU == NeonMode) {
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003445 Builder.defineMacro("__ARM_NEON");
Tim Northover2fe823a2013-08-01 09:23:19 +00003446 // 64-bit NEON supports half, single and double precision operations.
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003447 Builder.defineMacro("__ARM_NEON_FP", "7");
3448 }
3449
3450 if (Crypto) {
3451 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northover2fe823a2013-08-01 09:23:19 +00003452 }
Tim Northover9bb857a2013-01-31 12:13:10 +00003453 }
Craig Topper3164f332014-03-11 03:39:26 +00003454 void getTargetBuiltins(const Builtin::Info *&Records,
3455 unsigned &NumRecords) const override {
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003456 Records = BuiltinInfo;
3457 NumRecords = clang::AArch64::LastTSBuiltin-Builtin::FirstTSBuiltin;
Tim Northover9bb857a2013-01-31 12:13:10 +00003458 }
Craig Topper3164f332014-03-11 03:39:26 +00003459 bool hasFeature(StringRef Feature) const override {
Tim Northover2fe823a2013-08-01 09:23:19 +00003460 return Feature == "aarch64" || (Feature == "neon" && FPU == NeonMode);
Tim Northover9bb857a2013-01-31 12:13:10 +00003461 }
Tim Northover2fe823a2013-08-01 09:23:19 +00003462
Craig Topper3164f332014-03-11 03:39:26 +00003463 bool setCPU(const std::string &Name) override {
Amara Emerson703da2e2013-10-31 09:32:33 +00003464 return llvm::StringSwitch<bool>(Name)
3465 .Case("generic", true)
3466 .Cases("cortex-a53", "cortex-a57", true)
3467 .Default(false);
3468 }
3469
Craig Topper3164f332014-03-11 03:39:26 +00003470 bool handleTargetFeatures(std::vector<std::string> &Features,
3471 DiagnosticsEngine &Diags) override {
Tim Northover2fe823a2013-08-01 09:23:19 +00003472 FPU = FPUMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003473 Crypto = 0;
Tim Northover2fe823a2013-08-01 09:23:19 +00003474 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3475 if (Features[i] == "+neon")
3476 FPU = NeonMode;
Jiangning Liuc8b0a1a2013-11-19 01:33:17 +00003477 if (Features[i] == "+crypto")
3478 Crypto = 1;
Tim Northover2fe823a2013-08-01 09:23:19 +00003479 }
Christian Pirker9b019ae2014-02-25 13:51:00 +00003480
3481 setDescriptionString();
3482
Rafael Espindolaeb265472013-08-21 21:59:03 +00003483 return true;
Tim Northover2fe823a2013-08-01 09:23:19 +00003484 }
3485
Craig Topper3164f332014-03-11 03:39:26 +00003486 void getGCCRegNames(const char *const *&Names,
3487 unsigned &NumNames) const override;
3488 void getGCCRegAliases(const GCCRegAlias *&Aliases,
3489 unsigned &NumAliases) const override;
Tim Northover9bb857a2013-01-31 12:13:10 +00003490
Craig Topper3164f332014-03-11 03:39:26 +00003491 bool isCLZForZeroUndef() const override { return false; }
Tim Northover9bb857a2013-01-31 12:13:10 +00003492
Craig Topper3164f332014-03-11 03:39:26 +00003493 bool validateAsmConstraint(const char *&Name,
3494 TargetInfo::ConstraintInfo &Info) const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003495 switch (*Name) {
3496 default: return false;
3497 case 'w': // An FP/SIMD vector register
3498 Info.setAllowsRegister();
3499 return true;
3500 case 'I': // Constant that can be used with an ADD instruction
3501 case 'J': // Constant that can be used with a SUB instruction
3502 case 'K': // Constant that can be used with a 32-bit logical instruction
3503 case 'L': // Constant that can be used with a 64-bit logical instruction
3504 case 'M': // Constant that can be used as a 32-bit MOV immediate
3505 case 'N': // Constant that can be used as a 64-bit MOV immediate
3506 case 'Y': // Floating point constant zero
3507 case 'Z': // Integer constant zero
3508 return true;
3509 case 'Q': // A memory reference with base register and no offset
3510 Info.setAllowsMemory();
3511 return true;
3512 case 'S': // A symbolic address
3513 Info.setAllowsRegister();
3514 return true;
3515 case 'U':
3516 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
3517 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
3518 // Usa: An absolute symbolic address
3519 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
3520 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
3521 }
3522 }
3523
Craig Topper3164f332014-03-11 03:39:26 +00003524 const char *getClobbers() const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003525 // There are no AArch64 clobbers shared by all asm statements.
3526 return "";
3527 }
3528
Craig Topper3164f332014-03-11 03:39:26 +00003529 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover9bb857a2013-01-31 12:13:10 +00003530 return TargetInfo::AArch64ABIBuiltinVaList;
3531 }
3532};
3533
3534const char * const AArch64TargetInfo::GCCRegNames[] = {
3535 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7",
3536 "w8", "w9", "w10", "w11", "w12", "w13", "w14", "w15",
3537 "w16", "w17", "w18", "w19", "w20", "w21", "w22", "w23",
3538 "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp", "wzr",
3539
3540 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
3541 "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
3542 "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
3543 "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp", "xzr",
3544
3545 "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7",
3546 "b8", "b9", "b10", "b11", "b12", "b13", "b14", "b15",
3547 "b16", "b17", "b18", "b19", "b20", "b21", "b22", "b23",
3548 "b24", "b25", "b26", "b27", "b28", "b29", "b30", "b31",
3549
3550 "h0", "h1", "h2", "h3", "h4", "h5", "h6", "h7",
3551 "h8", "h9", "h10", "h11", "h12", "h13", "h14", "h15",
3552 "h16", "h17", "h18", "h19", "h20", "h21", "h22", "h23",
3553 "h24", "h25", "h26", "h27", "h28", "h29", "h30", "h31",
3554
3555 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
3556 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
3557 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
3558 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
3559
3560 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
3561 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
3562 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
3563 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
3564
3565 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
3566 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
3567 "q16", "q17", "q18", "q19", "q20", "q21", "q22", "q23",
3568 "q24", "q25", "q26", "q27", "q28", "q29", "q30", "q31"
3569};
3570
3571void AArch64TargetInfo::getGCCRegNames(const char * const *&Names,
3572 unsigned &NumNames) const {
3573 Names = GCCRegNames;
3574 NumNames = llvm::array_lengthof(GCCRegNames);
3575}
3576
3577const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
3578 { { "x16" }, "ip0"},
3579 { { "x17" }, "ip1"},
3580 { { "x29" }, "fp" },
3581 { { "x30" }, "lr" }
3582};
3583
3584void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
3585 unsigned &NumAliases) const {
3586 Aliases = GCCRegAliases;
3587 NumAliases = llvm::array_lengthof(GCCRegAliases);
3588
3589}
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003590
3591const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
3592#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3593#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3594 ALL_LANGUAGES },
Tim Northoverc322f832014-01-30 14:47:51 +00003595#define GET_NEON_BUILTINS
3596#include "clang/Basic/arm_neon.inc"
3597#undef GET_NEON_BUILTINS
3598
3599#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
3600#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
3601 ALL_LANGUAGES },
Tim Northover8ec8c4b2013-05-04 07:15:13 +00003602#include "clang/Basic/BuiltinsAArch64.def"
3603};
3604
Christian Pirker9b019ae2014-02-25 13:51:00 +00003605class AArch64leTargetInfo : public AArch64TargetInfo {
Craig Topper3164f332014-03-11 03:39:26 +00003606 void setDescriptionString() override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003607 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
3608 }
3609
3610public:
3611 AArch64leTargetInfo(const llvm::Triple &Triple)
3612 : AArch64TargetInfo(Triple) {
3613 BigEndian = false;
3614 }
Craig Topper3164f332014-03-11 03:39:26 +00003615 void getTargetDefines(const LangOptions &Opts,
3616 MacroBuilder &Builder) const override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003617 Builder.defineMacro("__AARCH64EL__");
3618 AArch64TargetInfo::getTargetDefines(Opts, Builder);
3619 }
3620};
3621
3622class AArch64beTargetInfo : public AArch64TargetInfo {
Craig Topper3164f332014-03-11 03:39:26 +00003623 void setDescriptionString() override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003624 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
3625 }
3626
3627public:
3628 AArch64beTargetInfo(const llvm::Triple &Triple)
3629 : AArch64TargetInfo(Triple) { }
Craig Topper3164f332014-03-11 03:39:26 +00003630 void getTargetDefines(const LangOptions &Opts,
3631 MacroBuilder &Builder) const override {
Christian Pirker9b019ae2014-02-25 13:51:00 +00003632 Builder.defineMacro("__AARCH64EB__");
Christian Pirker227f5ed2014-03-24 13:57:21 +00003633 Builder.defineMacro("__AARCH_BIG_ENDIAN");
3634 Builder.defineMacro("__ARM_BIG_ENDIAN");
Christian Pirker9b019ae2014-02-25 13:51:00 +00003635 AArch64TargetInfo::getTargetDefines(Opts, Builder);
3636 }
3637};
3638
Eli Friedman9fa28852012-08-08 23:57:20 +00003639} // end anonymous namespace
3640
3641namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003642class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003643 // Possible FPU choices.
3644 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003645 VFP2FPU = (1 << 0),
3646 VFP3FPU = (1 << 1),
3647 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003648 NeonFPU = (1 << 3),
3649 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003650 };
3651
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003652 // Possible HWDiv features.
3653 enum HWDivMode {
3654 HWDivThumb = (1 << 0),
3655 HWDivARM = (1 << 1)
3656 };
3657
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003658 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003659 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003660 }
3661
3662 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3663 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003664
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003665 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003666
Rafael Espindolaeb265472013-08-21 21:59:03 +00003667 enum {
3668 FP_Default,
3669 FP_VFP,
3670 FP_Neon
3671 } FPMath;
3672
Bernard Ogdenda13af32013-10-24 18:32:51 +00003673 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003674
Logan Chien57086ce2012-10-10 06:56:20 +00003675 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003676 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003677 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003678
3679 // Initialized via features.
3680 unsigned SoftFloat : 1;
3681 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003682
Bernard Ogden18b57012013-10-29 09:47:51 +00003683 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003684 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003685
Chris Lattner5cc15e02010-03-03 19:03:45 +00003686 static const Builtin::Info BuiltinInfo[];
3687
Rafael Espindola101d5b92013-05-13 20:09:47 +00003688 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3689 // On linux, binaries targeting old cpus call functions in libgcc to
3690 // perform atomic operations. The implementation in libgcc then calls into
3691 // the kernel which on armv6 and newer uses ldrex and strex. The net result
3692 // is that if we assume the kernel is at least as recent as the hardware,
3693 // it is safe to use atomic instructions on armv6 and newer.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00003694 if (!T.isOSLinux() &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003695 T.getOS() != llvm::Triple::FreeBSD &&
Joerg Sonnenbergerfbd51be2013-12-02 16:12:05 +00003696 T.getOS() != llvm::Triple::NetBSD &&
Rafael Espindola3d4276e2013-06-17 20:00:15 +00003697 T.getOS() != llvm::Triple::Bitrig)
Ed Schouten60afa2d2013-06-15 09:40:14 +00003698 return false;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003699 StringRef ArchName = T.getArchName();
Rafael Espindola92dbc312013-05-14 00:44:24 +00003700 if (T.getArch() == llvm::Triple::arm) {
3701 if (!ArchName.startswith("armv"))
3702 return false;
3703 StringRef VersionStr = ArchName.substr(4);
3704 unsigned Version;
3705 if (VersionStr.getAsInteger(10, Version))
3706 return false;
3707 return Version >= 6;
3708 }
3709 assert(T.getArch() == llvm::Triple::thumb);
3710 if (!ArchName.startswith("thumbv"))
3711 return false;
3712 StringRef VersionStr = ArchName.substr(6);
3713 unsigned Version;
3714 if (VersionStr.getAsInteger(10, Version))
3715 return false;
3716 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003717 }
3718
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003719 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003720 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003721
3722 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003723 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003724
Joerg Sonnenbergerf19dc302014-01-26 20:02:03 +00003725 // size_t is unsigned long on Darwin and NetBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003726 if (T.isOSDarwin() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003727 SizeType = UnsignedLong;
3728 else
3729 SizeType = UnsignedInt;
3730
Rafael Espindolac418ae92014-01-03 19:22:05 +00003731 if (T.getOS() == llvm::Triple::NetBSD) {
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003732 WCharType = SignedInt;
3733 } else {
3734 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3735 WCharType = UnsignedInt;
3736 }
3737
3738 UseBitFieldTypeAlignment = true;
3739
3740 ZeroLengthBitfieldBoundary = 0;
3741
3742 if (IsThumb) {
3743 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3744 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003745 if (T.isOSBinFormatMachO())
3746 DescriptionString = "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3747 "v128:64:128-a:0:32-n32-S64";
3748 else
3749 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:64-"
3750 "v128:64:128-a:0:32-n32-S64";
3751
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003752 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003753 if (T.isOSBinFormatMachO())
3754 DescriptionString = "e-m:o-p:32:32-i64:64-v128:64:128-n32-S64";
3755 else
3756 DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003757 }
3758
3759 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003760 }
3761
3762 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003763 const llvm::Triple &T = getTriple();
3764
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003765 IsAAPCS = false;
3766
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003767 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003768
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003769 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003770 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003771 SizeType = UnsignedInt;
3772 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003773 SizeType = UnsignedLong;
3774
3775 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3776 WCharType = SignedInt;
3777
3778 // Do not respect the alignment of bit-field types when laying out
3779 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3780 UseBitFieldTypeAlignment = false;
3781
3782 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3783 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3784 /// gcc.
3785 ZeroLengthBitfieldBoundary = 32;
3786
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003787 if (IsThumb) {
3788 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3789 // so set preferred for small types to 32.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003790 if (T.isOSBinFormatMachO())
3791 DescriptionString = "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3792 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
3793 else
3794 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64"
3795 "-v64:32:64-v128:32:128-a:0:32-n32-S32";
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003796 } else {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003797 if (T.isOSBinFormatMachO())
3798 DescriptionString =
3799 "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3800 else
3801 DescriptionString =
3802 "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 +00003803 }
3804
3805 // FIXME: Override "preferred align" for double and long long.
3806 }
3807
Chris Lattner17df24e2008-04-21 18:56:49 +00003808public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003809 ARMTargetInfo(const llvm::Triple &Triple)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003810 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3811 IsAAPCS(true) {
Eli Friedman803acb32011-12-22 03:51:45 +00003812 BigEndian = false;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003813 switch (getTriple().getOS()) {
3814 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003815 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003816 break;
3817 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003818 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003819 break;
3820 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003821
Chris Lattner1a8f3942010-04-23 16:29:58 +00003822 // {} in inline assembly are neon specifiers, not assembly variant
3823 // specifiers.
3824 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003825
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003826 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003827 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003828
3829 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003830
3831 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003832 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003833
3834 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003835 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003836 if (shouldUseInlineAtomic(getTriple()))
3837 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003838
3839 // Do force alignment of members that follow zero length bitfields. If
3840 // the alignment of the zero-length bitfield is greater than the member
3841 // that follows it, `bar', `bar' will be aligned as the type of the
3842 // zero length bitfield.
3843 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003844 }
Craig Topper3164f332014-03-11 03:39:26 +00003845 const char *getABI() const override { return ABI.c_str(); }
3846 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003847 ABI = Name;
3848
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003849 // The defaults (above) are for AAPCS, check if we need to change them.
3850 //
3851 // FIXME: We need support for -meabi... we could just mangle it into the
3852 // name.
3853 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003854 setABIAPCS();
3855 return true;
3856 }
3857 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3858 setABIAAPCS();
3859 return true;
3860 }
3861 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003862 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003863
Craig Topper3164f332014-03-11 03:39:26 +00003864 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003865 if (IsAAPCS)
3866 Features["aapcs"] = true;
3867 else
3868 Features["apcs"] = true;
3869
Silviu Barangae5690462013-10-21 10:59:33 +00003870 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003871 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3872 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003873 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3874 CPU == "cortex-a9-mp") {
3875 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003876 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003877 }
3878 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003879 Features["vfp4"] = true;
3880 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003881 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3882 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3883 CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003884 Features["vfp4"] = true;
3885 Features["neon"] = true;
3886 Features["hwdiv"] = true;
3887 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003888 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3889 Features["fp-armv8"] = true;
3890 Features["neon"] = true;
3891 Features["hwdiv"] = true;
3892 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003893 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003894 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003895 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003896 // Enable the hwdiv extension for all v8a AArch32 cores by
3897 // default.
3898 ArchName == "armv8a" || ArchName == "armv8" ||
3899 ArchName == "thumbv8a" || ArchName == "thumbv8") {
3900 Features["hwdiv"] = true;
3901 Features["hwdiv-arm"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003902 } else if (CPU == "cortex-m3" || CPU == "cortex-m4") {
3903 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003904 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003905 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003906
Craig Topper3164f332014-03-11 03:39:26 +00003907 bool handleTargetFeatures(std::vector<std::string> &Features,
3908 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003909 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003910 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003911 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003912 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003913 HWDiv = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003914 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
3915 if (Features[i] == "+soft-float")
3916 SoftFloat = true;
3917 else if (Features[i] == "+soft-float-abi")
3918 SoftFloatABI = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003919 else if (Features[i] == "+vfp2")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003920 FPU |= VFP2FPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003921 else if (Features[i] == "+vfp3")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003922 FPU |= VFP3FPU;
3923 else if (Features[i] == "+vfp4")
3924 FPU |= VFP4FPU;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003925 else if (Features[i] == "+fp-armv8")
3926 FPU |= FPARMV8;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003927 else if (Features[i] == "+neon")
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003928 FPU |= NeonFPU;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003929 else if (Features[i] == "+hwdiv")
3930 HWDiv |= HWDivThumb;
3931 else if (Features[i] == "+hwdiv-arm")
3932 HWDiv |= HWDivARM;
Bernard Ogden18b57012013-10-29 09:47:51 +00003933 else if (Features[i] == "+crc")
3934 CRC = 1;
Tim Northover02e38602014-02-03 17:28:04 +00003935 else if (Features[i] == "+crypto")
3936 Crypto = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003937 }
3938
Rafael Espindolaeb265472013-08-21 21:59:03 +00003939 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3940 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3941 return false;
3942 }
3943
3944 if (FPMath == FP_Neon)
3945 Features.push_back("+neonfp");
3946 else if (FPMath == FP_VFP)
3947 Features.push_back("-neonfp");
3948
Daniel Dunbar893d4752009-12-19 04:15:38 +00003949 // Remove front-end specific options which the backend handles differently.
3950 std::vector<std::string>::iterator it;
3951 it = std::find(Features.begin(), Features.end(), "+soft-float");
3952 if (it != Features.end())
3953 Features.erase(it);
3954 it = std::find(Features.begin(), Features.end(), "+soft-float-abi");
3955 if (it != Features.end())
3956 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00003957 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003958 }
3959
Craig Topper3164f332014-03-11 03:39:26 +00003960 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003961 return llvm::StringSwitch<bool>(Feature)
3962 .Case("arm", true)
3963 .Case("softfloat", SoftFloat)
3964 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003965 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003966 .Case("hwdiv", HWDiv & HWDivThumb)
3967 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003968 .Default(false);
3969 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003970 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003971 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003972 return llvm::StringSwitch<const char*>(Name)
3973 .Cases("arm8", "arm810", "4")
3974 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3975 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3976 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3977 .Case("ep9312", "4T")
3978 .Cases("arm10tdmi", "arm1020t", "5T")
3979 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3980 .Case("arm926ej-s", "5TEJ")
3981 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3982 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003983 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003984 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003985 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003986 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00003987 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003988 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00003989 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00003990 .Case("swift", "7S")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003991 .Cases("cortex-m3", "cortex-m4", "7M")
Bob Wilson87ba1d32011-03-21 21:55:25 +00003992 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00003993 .Cases("cortex-a53", "cortex-a57", "8A")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003994 .Default(0);
3995 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003996 static const char *getCPUProfile(StringRef Name) {
3997 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00003998 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Ana Pazosdd6068d2013-12-06 22:43:17 +00003999 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00004000 .Cases("cortex-a53", "cortex-a57", "A")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004001 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00004002 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00004003 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004004 }
Craig Topper3164f332014-03-11 03:39:26 +00004005 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004006 if (!getCPUDefineSuffix(Name))
4007 return false;
4008
4009 CPU = Name;
4010 return true;
4011 }
Craig Topper3164f332014-03-11 03:39:26 +00004012 bool setFPMath(StringRef Name) override;
4013 void getTargetDefines(const LangOptions &Opts,
4014 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004015 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004016 Builder.defineMacro("__arm");
4017 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004018
Chris Lattnerecd49032009-03-02 22:27:17 +00004019 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004020 Builder.defineMacro("__ARMEL__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004021 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004022
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004023 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004024 unsigned int CPUArchVer;
4025 if(CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer)) {
4026 llvm_unreachable("Invalid char for architecture version number");
4027 }
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004028 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004029 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
4030 StringRef CPUProfile = getCPUProfile(CPU);
4031 if (!CPUProfile.empty())
4032 Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile);
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004033
Mike Stump9d54bd72009-04-08 02:07:04 +00004034 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004035
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004036 // FIXME: It's more complicated than this and we don't really support
4037 // interworking.
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004038 if (5 <= CPUArchVer && CPUArchVer <= 8)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004039 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004040
David Tweed8f676532012-10-25 13:33:01 +00004041 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004042 // Embedded targets on Darwin follow AAPCS, but not EABI.
4043 if (!getTriple().isOSDarwin())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004044 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004045 Builder.defineMacro("__ARM_PCS", "1");
4046
David Tweed8f676532012-10-25 13:33:01 +00004047 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004048 Builder.defineMacro("__ARM_PCS_VFP", "1");
4049 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004050
Daniel Dunbar893d4752009-12-19 04:15:38 +00004051 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004052 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004053
4054 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004055 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004056
4057 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004058 Builder.defineMacro("__THUMBEL__");
4059 Builder.defineMacro("__thumb__");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004060 // We check both CPUArchVer and ArchName because when only triple is
4061 // specified, the default CPU is arm1136j-s.
4062 StringRef ArchName = getTriple().getArchName();
4063 if (CPUArch == "6T2" || CPUArchVer >= 7 || ArchName.endswith("v6t2") ||
4064 ArchName.endswith("v7") || ArchName.endswith("v8"))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004065 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004066 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004067 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4068 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004069
4070 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004071 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004072
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004073 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004074 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004075 if (FPU & VFP2FPU)
4076 Builder.defineMacro("__ARM_VFPV2__");
4077 if (FPU & VFP3FPU)
4078 Builder.defineMacro("__ARM_VFPV3__");
4079 if (FPU & VFP4FPU)
4080 Builder.defineMacro("__ARM_VFPV4__");
4081 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004082
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004083 // This only gets set when Neon instructions are actually available, unlike
4084 // the VFP define, hence the soft float and arch check. This is subtly
4085 // different from gcc, we follow the intent which was that it should be set
4086 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004087 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4088 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004089 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004090 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004091
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004092 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4093 Opts.ShortWChar ? "2" : "4");
4094
4095 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4096 Opts.ShortEnums ? "1" : "4");
4097
Bernard Ogden18b57012013-10-29 09:47:51 +00004098 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004099 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004100
Tim Northover02e38602014-02-03 17:28:04 +00004101 if (Crypto)
4102 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4103
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004104 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004105 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4106 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4107 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4108 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4109 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004110 }
Craig Topper3164f332014-03-11 03:39:26 +00004111 void getTargetBuiltins(const Builtin::Info *&Records,
4112 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004113 Records = BuiltinInfo;
4114 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004115 }
Craig Topper3164f332014-03-11 03:39:26 +00004116 bool isCLZForZeroUndef() const override { return false; }
4117 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004118 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004119 }
Craig Topper3164f332014-03-11 03:39:26 +00004120 void getGCCRegNames(const char * const *&Names,
4121 unsigned &NumNames) const override;
4122 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4123 unsigned &NumAliases) const override;
4124 bool validateAsmConstraint(const char *&Name,
4125 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004126 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004127 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004128 case 'l': // r0-r7
4129 case 'h': // r8-r15
4130 case 'w': // VFP Floating point register single precision
4131 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004132 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004133 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004134 case 'Q': // A memory address that is a single base register.
4135 Info.setAllowsMemory();
4136 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004137 case 'U': // a memory reference...
4138 switch (Name[1]) {
4139 case 'q': // ...ARMV4 ldrsb
4140 case 'v': // ...VFP load/store (reg+constant offset)
4141 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004142 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004143 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004144 case 'n': // valid address for Neon doubleword vector load/store
4145 case 'm': // valid address for Neon element and structure load/store
4146 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004147 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004148 Info.setAllowsMemory();
4149 Name++;
4150 return true;
4151 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004152 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004153 return false;
4154 }
Craig Topper3164f332014-03-11 03:39:26 +00004155 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004156 std::string R;
4157 switch (*Constraint) {
4158 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004159 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004160 Constraint++;
4161 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004162 case 'p': // 'p' should be translated to 'r' by default.
4163 R = std::string("r");
4164 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004165 default:
4166 return std::string(1, *Constraint);
4167 }
4168 return R;
4169 }
Craig Topper3164f332014-03-11 03:39:26 +00004170 bool validateConstraintModifier(StringRef Constraint, const char Modifier,
4171 unsigned Size) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004172 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004173 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004174
Bill Wendling9d1ee112012-10-25 23:28:48 +00004175 // Strip off constraint modifiers.
4176 while (Constraint[0] == '=' ||
4177 Constraint[0] == '+' ||
4178 Constraint[0] == '&')
4179 Constraint = Constraint.substr(1);
4180
4181 switch (Constraint[0]) {
4182 default: break;
4183 case 'r': {
4184 switch (Modifier) {
4185 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004186 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004187 case 'q':
4188 // A register of size 32 cannot fit a vector type.
4189 return false;
4190 }
4191 }
4192 }
4193
4194 return true;
4195 }
Craig Topper3164f332014-03-11 03:39:26 +00004196 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004197 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004198 return "";
4199 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004200
Craig Topper3164f332014-03-11 03:39:26 +00004201 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004202 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4203 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004204
Craig Topper3164f332014-03-11 03:39:26 +00004205 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004206 if (RegNo == 0) return 0;
4207 if (RegNo == 1) return 1;
4208 return -1;
4209 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004210};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004211
Rafael Espindolaeb265472013-08-21 21:59:03 +00004212bool ARMTargetInfo::setFPMath(StringRef Name) {
4213 if (Name == "neon") {
4214 FPMath = FP_Neon;
4215 return true;
4216 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4217 Name == "vfp4") {
4218 FPMath = FP_VFP;
4219 return true;
4220 }
4221 return false;
4222}
4223
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004224const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004225 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004226 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004227 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4228
4229 // Float registers
4230 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4231 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4232 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004233 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004234
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004235 // Double registers
4236 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4237 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004238 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4239 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004240
4241 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004242 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4243 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004244};
4245
4246void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004247 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004248 Names = GCCRegNames;
4249 NumNames = llvm::array_lengthof(GCCRegNames);
4250}
4251
4252const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004253 { { "a1" }, "r0" },
4254 { { "a2" }, "r1" },
4255 { { "a3" }, "r2" },
4256 { { "a4" }, "r3" },
4257 { { "v1" }, "r4" },
4258 { { "v2" }, "r5" },
4259 { { "v3" }, "r6" },
4260 { { "v4" }, "r7" },
4261 { { "v5" }, "r8" },
4262 { { "v6", "rfp" }, "r9" },
4263 { { "sl" }, "r10" },
4264 { { "fp" }, "r11" },
4265 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004266 { { "r13" }, "sp" },
4267 { { "r14" }, "lr" },
4268 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004269 // The S, D and Q registers overlap, but aren't really aliases; we
4270 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004271};
4272
4273void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4274 unsigned &NumAliases) const {
4275 Aliases = GCCRegAliases;
4276 NumAliases = llvm::array_lengthof(GCCRegAliases);
4277}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004278
4279const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004280#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004281#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004282 ALL_LANGUAGES },
Tim Northoverc322f832014-01-30 14:47:51 +00004283#define GET_NEON_BUILTINS
4284#include "clang/Basic/arm_neon.inc"
4285#undef GET_NEON_BUILTINS
4286
4287#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4288#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4289 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004290#include "clang/Basic/BuiltinsARM.def"
4291};
Chris Lattner17df24e2008-04-21 18:56:49 +00004292} // end anonymous namespace.
4293
Eli Friedmanf05b7722008-08-20 07:44:10 +00004294namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004295class DarwinARMTargetInfo :
Torok Edwinb2b37c62009-06-30 17:10:35 +00004296 public DarwinTargetInfo<ARMTargetInfo> {
4297protected:
Craig Topper3164f332014-03-11 03:39:26 +00004298 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4299 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004300 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004301 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004302
Torok Edwinb2b37c62009-06-30 17:10:35 +00004303public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004304 DarwinARMTargetInfo(const llvm::Triple &Triple)
4305 : DarwinTargetInfo<ARMTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004306 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004307 // iOS always has 64-bit atomic instructions.
4308 // FIXME: This should be based off of the target features in ARMTargetInfo.
4309 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004310
4311 // Darwin on iOS uses a variant of the ARM C++ ABI.
4312 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004313 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004314};
4315} // end anonymous namespace.
4316
Tony Linthicum76329bf2011-12-12 21:14:55 +00004317
4318namespace {
4319// Hexagon abstract base class
4320class HexagonTargetInfo : public TargetInfo {
4321 static const Builtin::Info BuiltinInfo[];
4322 static const char * const GCCRegNames[];
4323 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4324 std::string CPU;
4325public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004326 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004327 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004328 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004329
4330 // {} in inline assembly are packet specifiers, not assembly variant
4331 // specifiers.
4332 NoAsmVariants = true;
4333 }
4334
Craig Topper3164f332014-03-11 03:39:26 +00004335 void getTargetBuiltins(const Builtin::Info *&Records,
4336 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004337 Records = BuiltinInfo;
4338 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4339 }
4340
Craig Topper3164f332014-03-11 03:39:26 +00004341 bool validateAsmConstraint(const char *&Name,
4342 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004343 return true;
4344 }
4345
Craig Topper3164f332014-03-11 03:39:26 +00004346 void getTargetDefines(const LangOptions &Opts,
4347 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004348
Craig Topper3164f332014-03-11 03:39:26 +00004349 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004350 return Feature == "hexagon";
4351 }
Craig Topper3164f332014-03-11 03:39:26 +00004352
4353 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004354 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004355 }
Craig Topper3164f332014-03-11 03:39:26 +00004356 void getGCCRegNames(const char * const *&Names,
4357 unsigned &NumNames) const override;
4358 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4359 unsigned &NumAliases) const override;
4360 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004361 return "";
4362 }
Sebastian Pop86500282012-01-13 20:37:10 +00004363
4364 static const char *getHexagonCPUSuffix(StringRef Name) {
4365 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004366 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004367 .Case("hexagonv5", "5")
Sebastian Pop86500282012-01-13 20:37:10 +00004368 .Default(0);
4369 }
4370
Craig Topper3164f332014-03-11 03:39:26 +00004371 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004372 if (!getHexagonCPUSuffix(Name))
4373 return false;
4374
Tony Linthicum76329bf2011-12-12 21:14:55 +00004375 CPU = Name;
4376 return true;
4377 }
4378};
4379
4380void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4381 MacroBuilder &Builder) const {
4382 Builder.defineMacro("qdsp6");
4383 Builder.defineMacro("__qdsp6", "1");
4384 Builder.defineMacro("__qdsp6__", "1");
4385
4386 Builder.defineMacro("hexagon");
4387 Builder.defineMacro("__hexagon", "1");
4388 Builder.defineMacro("__hexagon__", "1");
4389
4390 if(CPU == "hexagonv1") {
4391 Builder.defineMacro("__HEXAGON_V1__");
4392 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4393 if(Opts.HexagonQdsp6Compat) {
4394 Builder.defineMacro("__QDSP6_V1__");
4395 Builder.defineMacro("__QDSP6_ARCH__", "1");
4396 }
4397 }
4398 else if(CPU == "hexagonv2") {
4399 Builder.defineMacro("__HEXAGON_V2__");
4400 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4401 if(Opts.HexagonQdsp6Compat) {
4402 Builder.defineMacro("__QDSP6_V2__");
4403 Builder.defineMacro("__QDSP6_ARCH__", "2");
4404 }
4405 }
4406 else if(CPU == "hexagonv3") {
4407 Builder.defineMacro("__HEXAGON_V3__");
4408 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4409 if(Opts.HexagonQdsp6Compat) {
4410 Builder.defineMacro("__QDSP6_V3__");
4411 Builder.defineMacro("__QDSP6_ARCH__", "3");
4412 }
4413 }
4414 else if(CPU == "hexagonv4") {
4415 Builder.defineMacro("__HEXAGON_V4__");
4416 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4417 if(Opts.HexagonQdsp6Compat) {
4418 Builder.defineMacro("__QDSP6_V4__");
4419 Builder.defineMacro("__QDSP6_ARCH__", "4");
4420 }
4421 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004422 else if(CPU == "hexagonv5") {
4423 Builder.defineMacro("__HEXAGON_V5__");
4424 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4425 if(Opts.HexagonQdsp6Compat) {
4426 Builder.defineMacro("__QDSP6_V5__");
4427 Builder.defineMacro("__QDSP6_ARCH__", "5");
4428 }
4429 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004430}
4431
4432const char * const HexagonTargetInfo::GCCRegNames[] = {
4433 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4434 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4435 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4436 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4437 "p0", "p1", "p2", "p3",
4438 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4439};
4440
4441void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4442 unsigned &NumNames) const {
4443 Names = GCCRegNames;
4444 NumNames = llvm::array_lengthof(GCCRegNames);
4445}
4446
4447
4448const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4449 { { "sp" }, "r29" },
4450 { { "fp" }, "r30" },
4451 { { "lr" }, "r31" },
4452 };
4453
4454void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4455 unsigned &NumAliases) const {
4456 Aliases = GCCRegAliases;
4457 NumAliases = llvm::array_lengthof(GCCRegAliases);
4458}
4459
4460
4461const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
4462#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4463#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4464 ALL_LANGUAGES },
4465#include "clang/Basic/BuiltinsHexagon.def"
4466};
4467}
4468
4469
Chris Lattner5ba61f02006-10-14 07:39:34 +00004470namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004471// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
4472class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00004473 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4474 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004475 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00004476public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004477 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004478
Craig Topper3164f332014-03-11 03:39:26 +00004479 bool handleTargetFeatures(std::vector<std::string> &Features,
4480 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004481 SoftFloat = false;
4482 for (unsigned i = 0, e = Features.size(); i != e; ++i)
4483 if (Features[i] == "+soft-float")
4484 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00004485 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004486 }
Craig Topper3164f332014-03-11 03:39:26 +00004487 void getTargetDefines(const LangOptions &Opts,
4488 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004489 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004490 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004491
4492 if (SoftFloat)
4493 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00004494 }
Craig Topper3164f332014-03-11 03:39:26 +00004495
4496 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004497 return llvm::StringSwitch<bool>(Feature)
4498 .Case("softfloat", SoftFloat)
4499 .Case("sparc", true)
4500 .Default(false);
4501 }
Craig Topper3164f332014-03-11 03:39:26 +00004502
4503 void getTargetBuiltins(const Builtin::Info *&Records,
4504 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004505 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00004506 }
Craig Topper3164f332014-03-11 03:39:26 +00004507 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004508 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00004509 }
Craig Topper3164f332014-03-11 03:39:26 +00004510 void getGCCRegNames(const char * const *&Names,
4511 unsigned &NumNames) const override;
4512 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4513 unsigned &NumAliases) const override;
4514 bool validateAsmConstraint(const char *&Name,
4515 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004516 // FIXME: Implement!
4517 return false;
Gabor Greif49991682008-02-21 16:29:08 +00004518 }
Craig Topper3164f332014-03-11 03:39:26 +00004519 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004520 // FIXME: Implement!
4521 return "";
Gabor Greif49991682008-02-21 16:29:08 +00004522 }
4523};
4524
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004525const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00004526 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4527 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4528 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4529 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
4530};
4531
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004532void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
4533 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004534 Names = GCCRegNames;
4535 NumNames = llvm::array_lengthof(GCCRegNames);
4536}
4537
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004538const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004539 { { "g0" }, "r0" },
4540 { { "g1" }, "r1" },
4541 { { "g2" }, "r2" },
4542 { { "g3" }, "r3" },
4543 { { "g4" }, "r4" },
4544 { { "g5" }, "r5" },
4545 { { "g6" }, "r6" },
4546 { { "g7" }, "r7" },
4547 { { "o0" }, "r8" },
4548 { { "o1" }, "r9" },
4549 { { "o2" }, "r10" },
4550 { { "o3" }, "r11" },
4551 { { "o4" }, "r12" },
4552 { { "o5" }, "r13" },
4553 { { "o6", "sp" }, "r14" },
4554 { { "o7" }, "r15" },
4555 { { "l0" }, "r16" },
4556 { { "l1" }, "r17" },
4557 { { "l2" }, "r18" },
4558 { { "l3" }, "r19" },
4559 { { "l4" }, "r20" },
4560 { { "l5" }, "r21" },
4561 { { "l6" }, "r22" },
4562 { { "l7" }, "r23" },
4563 { { "i0" }, "r24" },
4564 { { "i1" }, "r25" },
4565 { { "i2" }, "r26" },
4566 { { "i3" }, "r27" },
4567 { { "i4" }, "r28" },
4568 { { "i5" }, "r29" },
4569 { { "i6", "fp" }, "r30" },
4570 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00004571};
4572
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004573void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4574 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00004575 Aliases = GCCRegAliases;
4576 NumAliases = llvm::array_lengthof(GCCRegAliases);
4577}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004578
4579// SPARC v8 is the 32-bit mode selected by Triple::sparc.
4580class SparcV8TargetInfo : public SparcTargetInfo {
4581public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004582 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004583 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004584 }
4585
Craig Topper3164f332014-03-11 03:39:26 +00004586 void getTargetDefines(const LangOptions &Opts,
4587 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004588 SparcTargetInfo::getTargetDefines(Opts, Builder);
4589 Builder.defineMacro("__sparcv8");
4590 }
4591};
4592
4593// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
4594class SparcV9TargetInfo : public SparcTargetInfo {
4595public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004596 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004597 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00004598 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00004599 // This is an LP64 platform.
4600 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00004601
4602 // OpenBSD uses long long for int64_t and intmax_t.
4603 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
4604 IntMaxType = SignedLongLong;
4605 UIntMaxType = UnsignedLongLong;
4606 } else {
4607 IntMaxType = SignedLong;
4608 UIntMaxType = UnsignedLong;
4609 }
4610 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00004611
4612 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
4613 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
4614 LongDoubleWidth = 128;
4615 LongDoubleAlign = 128;
4616 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00004617 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004618 }
4619
Craig Topper3164f332014-03-11 03:39:26 +00004620 void getTargetDefines(const LangOptions &Opts,
4621 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004622 SparcTargetInfo::getTargetDefines(Opts, Builder);
4623 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00004624 Builder.defineMacro("__arch64__");
4625 // Solaris and its derivative AuroraUX don't need these variants, but the
4626 // BSDs do.
4627 if (getTriple().getOS() != llvm::Triple::Solaris &&
4628 getTriple().getOS() != llvm::Triple::AuroraUX) {
4629 Builder.defineMacro("__sparc64__");
4630 Builder.defineMacro("__sparc_v9__");
4631 Builder.defineMacro("__sparcv9__");
4632 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004633 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00004634
Craig Topper3164f332014-03-11 03:39:26 +00004635 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00004636 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4637 .Case("v9", true)
4638 .Case("ultrasparc", true)
4639 .Case("ultrasparc3", true)
4640 .Case("niagara", true)
4641 .Case("niagara2", true)
4642 .Case("niagara3", true)
4643 .Case("niagara4", true)
4644 .Default(false);
4645
4646 // No need to store the CPU yet. There aren't any CPU-specific
4647 // macros to define.
4648 return CPUKnown;
4649 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00004650};
4651
Gabor Greif49991682008-02-21 16:29:08 +00004652} // end anonymous namespace.
4653
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004654namespace {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004655class AuroraUXSparcV8TargetInfo : public AuroraUXTargetInfo<SparcV8TargetInfo> {
4656public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004657 AuroraUXSparcV8TargetInfo(const llvm::Triple &Triple)
4658 : AuroraUXTargetInfo<SparcV8TargetInfo>(Triple) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00004659 SizeType = UnsignedInt;
4660 PtrDiffType = SignedInt;
4661 }
4662};
Torok Edwinb2b37c62009-06-30 17:10:35 +00004663class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004664public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004665 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
4666 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00004667 SizeType = UnsignedInt;
4668 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00004669 }
4670};
4671} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00004672
Chris Lattnerb781dc792008-05-08 05:58:21 +00004673namespace {
Ulrich Weigand47445072013-05-06 16:26:41 +00004674 class SystemZTargetInfo : public TargetInfo {
4675 static const char *const GCCRegNames[];
4676
4677 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004678 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Ulrich Weigand47445072013-05-06 16:26:41 +00004679 TLSSupported = true;
4680 IntWidth = IntAlign = 32;
4681 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
4682 PointerWidth = PointerAlign = 64;
4683 LongDoubleWidth = 128;
4684 LongDoubleAlign = 64;
4685 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4686 MinGlobalAlign = 16;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004687 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 +00004688 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
4689 }
Craig Topper3164f332014-03-11 03:39:26 +00004690 void getTargetDefines(const LangOptions &Opts,
4691 MacroBuilder &Builder) const override {
Ulrich Weigand47445072013-05-06 16:26:41 +00004692 Builder.defineMacro("__s390__");
4693 Builder.defineMacro("__s390x__");
4694 Builder.defineMacro("__zarch__");
4695 Builder.defineMacro("__LONG_DOUBLE_128__");
4696 }
Craig Topper3164f332014-03-11 03:39:26 +00004697 void getTargetBuiltins(const Builtin::Info *&Records,
4698 unsigned &NumRecords) const override {
Ulrich Weigand47445072013-05-06 16:26:41 +00004699 // FIXME: Implement.
4700 Records = 0;
4701 NumRecords = 0;
4702 }
4703
Craig Topper3164f332014-03-11 03:39:26 +00004704 void getGCCRegNames(const char *const *&Names,
4705 unsigned &NumNames) const override;
4706 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4707 unsigned &NumAliases) const override {
Ulrich Weigand47445072013-05-06 16:26:41 +00004708 // No aliases.
4709 Aliases = 0;
4710 NumAliases = 0;
4711 }
Craig Topper3164f332014-03-11 03:39:26 +00004712 bool validateAsmConstraint(const char *&Name,
4713 TargetInfo::ConstraintInfo &info) const override;
4714 const char *getClobbers() const override {
Ulrich Weigand47445072013-05-06 16:26:41 +00004715 // FIXME: Is this really right?
4716 return "";
4717 }
Craig Topper3164f332014-03-11 03:39:26 +00004718 BuiltinVaListKind getBuiltinVaListKind() const override {
Ulrich Weigand47445072013-05-06 16:26:41 +00004719 return TargetInfo::SystemZBuiltinVaList;
4720 }
Craig Topper3164f332014-03-11 03:39:26 +00004721 bool setCPU(const std::string &Name) override {
Richard Sandiford4652d892013-07-19 16:51:51 +00004722 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4723 .Case("z10", true)
4724 .Case("z196", true)
4725 .Case("zEC12", true)
4726 .Default(false);
4727
4728 // No need to store the CPU yet. There aren't any CPU-specific
4729 // macros to define.
4730 return CPUKnown;
4731 }
Ulrich Weigand47445072013-05-06 16:26:41 +00004732 };
4733
4734 const char *const SystemZTargetInfo::GCCRegNames[] = {
4735 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4736 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4737 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
4738 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
4739 };
4740
4741 void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
4742 unsigned &NumNames) const {
4743 Names = GCCRegNames;
4744 NumNames = llvm::array_lengthof(GCCRegNames);
4745 }
4746
4747 bool SystemZTargetInfo::
4748 validateAsmConstraint(const char *&Name,
4749 TargetInfo::ConstraintInfo &Info) const {
4750 switch (*Name) {
4751 default:
4752 return false;
4753
4754 case 'a': // Address register
4755 case 'd': // Data register (equivalent to 'r')
4756 case 'f': // Floating-point register
4757 Info.setAllowsRegister();
4758 return true;
4759
4760 case 'I': // Unsigned 8-bit constant
4761 case 'J': // Unsigned 12-bit constant
4762 case 'K': // Signed 16-bit constant
4763 case 'L': // Signed 20-bit displacement (on all targets we support)
4764 case 'M': // 0x7fffffff
4765 return true;
4766
4767 case 'Q': // Memory with base and unsigned 12-bit displacement
4768 case 'R': // Likewise, plus an index
4769 case 'S': // Memory with base and signed 20-bit displacement
4770 case 'T': // Likewise, plus an index
4771 Info.setAllowsMemory();
4772 return true;
4773 }
4774 }
4775}
4776
4777namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004778 class MSP430TargetInfo : public TargetInfo {
4779 static const char * const GCCRegNames[];
4780 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004781 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004782 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004783 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00004784 IntWidth = 16; IntAlign = 16;
4785 LongWidth = 32; LongLongWidth = 64;
4786 LongAlign = LongLongAlign = 16;
4787 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004788 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004789 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00004790 IntMaxType = SignedLongLong;
4791 UIntMaxType = UnsignedLongLong;
4792 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004793 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00004794 SigAtomicType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004795 DescriptionString = "e-m:e-p:16:16-i32:16:32-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00004796 }
4797 void getTargetDefines(const LangOptions &Opts,
4798 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004799 Builder.defineMacro("MSP430");
4800 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004801 // FIXME: defines for different 'flavours' of MCU
4802 }
Craig Topper3164f332014-03-11 03:39:26 +00004803 void getTargetBuiltins(const Builtin::Info *&Records,
4804 unsigned &NumRecords) const override {
4805 // FIXME: Implement.
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004806 Records = 0;
4807 NumRecords = 0;
4808 }
Craig Topper3164f332014-03-11 03:39:26 +00004809 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004810 return Feature == "msp430";
4811 }
Craig Topper3164f332014-03-11 03:39:26 +00004812 void getGCCRegNames(const char * const *&Names,
4813 unsigned &NumNames) const override;
4814 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4815 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004816 // No aliases.
4817 Aliases = 0;
4818 NumAliases = 0;
4819 }
Craig Topper3164f332014-03-11 03:39:26 +00004820 bool validateAsmConstraint(const char *&Name,
4821 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00004822 // No target constraints for now.
4823 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004824 }
Craig Topper3164f332014-03-11 03:39:26 +00004825 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004826 // FIXME: Is this really right?
4827 return "";
4828 }
Craig Topper3164f332014-03-11 03:39:26 +00004829 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004830 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00004831 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00004832 }
4833 };
4834
4835 const char * const MSP430TargetInfo::GCCRegNames[] = {
4836 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4837 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
4838 };
4839
4840 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
4841 unsigned &NumNames) const {
4842 Names = GCCRegNames;
4843 NumNames = llvm::array_lengthof(GCCRegNames);
4844 }
4845}
4846
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00004847namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004848
Mike Stump11289f42009-09-09 15:08:12 +00004849 // LLVM and Clang cannot be used directly to output native binaries for
4850 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00004851 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00004852 //
4853 // TCE uses the llvm bitcode as input and uses it for generating customized
4854 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00004855 // publicly available in http://tce.cs.tut.fi
4856
Eli Friedman1f191002011-10-07 19:51:42 +00004857 static const unsigned TCEOpenCLAddrSpaceMap[] = {
4858 3, // opencl_global
4859 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00004860 5, // opencl_constant
4861 0, // cuda_device
4862 0, // cuda_constant
4863 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00004864 };
4865
Eli Friedmana9c3d712009-08-19 20:47:07 +00004866 class TCETargetInfo : public TargetInfo{
4867 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004868 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00004869 TLSSupported = false;
4870 IntWidth = 32;
4871 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004872 PointerWidth = 32;
4873 IntAlign = 32;
4874 LongAlign = LongLongAlign = 32;
4875 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004876 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004877 SizeType = UnsignedInt;
4878 IntMaxType = SignedLong;
4879 UIntMaxType = UnsignedLong;
4880 IntPtrType = SignedInt;
4881 PtrDiffType = SignedInt;
4882 FloatWidth = 32;
4883 FloatAlign = 32;
4884 DoubleWidth = 32;
4885 DoubleAlign = 32;
4886 LongDoubleWidth = 32;
4887 LongDoubleAlign = 32;
4888 FloatFormat = &llvm::APFloat::IEEEsingle;
4889 DoubleFormat = &llvm::APFloat::IEEEsingle;
4890 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00004891 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
4892 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00004893 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00004894 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004895 }
4896
Craig Topper3164f332014-03-11 03:39:26 +00004897 void getTargetDefines(const LangOptions &Opts,
4898 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004899 DefineStd(Builder, "tce", Opts);
4900 Builder.defineMacro("__TCE__");
4901 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00004902 }
Craig Topper3164f332014-03-11 03:39:26 +00004903 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004904 return Feature == "tce";
4905 }
Craig Topper3164f332014-03-11 03:39:26 +00004906
4907 void getTargetBuiltins(const Builtin::Info *&Records,
4908 unsigned &NumRecords) const override {}
4909 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00004910 return "";
4911 }
Craig Topper3164f332014-03-11 03:39:26 +00004912 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004913 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00004914 }
Craig Topper3164f332014-03-11 03:39:26 +00004915 void getGCCRegNames(const char * const *&Names,
4916 unsigned &NumNames) const override {}
4917 bool validateAsmConstraint(const char *&Name,
4918 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00004919 return true;
4920 }
Craig Topper3164f332014-03-11 03:39:26 +00004921 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4922 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00004923 };
4924}
4925
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004926namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004927class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00004928 virtual void setDescriptionString() = 0;
4929
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00004930 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004931 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00004932 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00004933 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004934 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00004935 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004936 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00004937 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004938 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00004939 enum DspRevEnum {
4940 NoDSP, DSP1, DSP2
4941 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00004942 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004943
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004944protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00004945 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00004946 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004947
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00004948public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004949 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
4950 const std::string &CPUStr)
4951 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00004952 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004953 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004954
Craig Topper3164f332014-03-11 03:39:26 +00004955 const char *getABI() const override { return ABI.c_str(); }
4956 bool setABI(const std::string &Name) override = 0;
4957 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00004958 CPU = Name;
4959 return true;
4960 }
Craig Topper3164f332014-03-11 03:39:26 +00004961 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00004962 // The backend enables certain ABI's by default according to the
4963 // architecture.
4964 // Disable both possible defaults so that we don't end up with multiple
4965 // ABI's selected and trigger an assertion.
4966 Features["o32"] = false;
4967 Features["n64"] = false;
4968
Eric Christopher0b26a612010-03-02 02:41:08 +00004969 Features[ABI] = true;
4970 Features[CPU] = true;
4971 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00004972
Craig Topper3164f332014-03-11 03:39:26 +00004973 void getTargetDefines(const LangOptions &Opts,
4974 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00004975 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00004976 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00004977 if (Opts.GNUMode)
4978 Builder.defineMacro("mips");
4979
Simon Atanasyan683535b2012-08-29 19:14:58 +00004980 Builder.defineMacro("__REGISTER_PREFIX__", "");
4981
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004982 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004983 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004984 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004985 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00004986 case SoftFloat:
4987 Builder.defineMacro("__mips_soft_float", Twine(1));
4988 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00004989 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00004990
Simon Atanasyan16071912013-04-14 14:07:30 +00004991 if (IsSingleFloat)
4992 Builder.defineMacro("__mips_single_float", Twine(1));
4993
Simon Atanasyan2c97a812013-10-18 13:13:53 +00004994 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
4995 Builder.defineMacro("_MIPS_FPSET",
4996 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
4997
Simon Atanasyan72244b62012-07-05 16:06:06 +00004998 if (IsMips16)
4999 Builder.defineMacro("__mips16", Twine(1));
5000
Simon Atanasyan60777612013-04-14 14:07:51 +00005001 if (IsMicromips)
5002 Builder.defineMacro("__mips_micromips", Twine(1));
5003
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005004 if (IsNan2008)
5005 Builder.defineMacro("__mips_nan2008", Twine(1));
5006
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005007 switch (DspRev) {
5008 default:
5009 break;
5010 case DSP1:
5011 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5012 Builder.defineMacro("__mips_dsp", Twine(1));
5013 break;
5014 case DSP2:
5015 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5016 Builder.defineMacro("__mips_dspr2", Twine(1));
5017 Builder.defineMacro("__mips_dsp", Twine(1));
5018 break;
5019 }
5020
Jack Carter44ff1e52013-08-12 17:20:29 +00005021 if (HasMSA)
5022 Builder.defineMacro("__mips_msa", Twine(1));
5023
Simon Atanasyan26f19672012-04-05 19:28:31 +00005024 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5025 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5026 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005027
5028 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5029 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005030 }
5031
Craig Topper3164f332014-03-11 03:39:26 +00005032 void getTargetBuiltins(const Builtin::Info *&Records,
5033 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005034 Records = BuiltinInfo;
5035 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005036 }
Craig Topper3164f332014-03-11 03:39:26 +00005037 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005038 return llvm::StringSwitch<bool>(Feature)
5039 .Case("mips", true)
5040 .Case("fp64", HasFP64)
5041 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005042 }
Craig Topper3164f332014-03-11 03:39:26 +00005043 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005044 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005045 }
Craig Topper3164f332014-03-11 03:39:26 +00005046 void getGCCRegNames(const char * const *&Names,
5047 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005048 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005049 // CPU register names
5050 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005051 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5052 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5053 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005054 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5055 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005056 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5057 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5058 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5059 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005060 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005061 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005062 "$fcc5","$fcc6","$fcc7",
5063 // MSA register names
5064 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5065 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5066 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5067 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5068 // MSA control register names
5069 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5070 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005071 };
5072 Names = GCCRegNames;
5073 NumNames = llvm::array_lengthof(GCCRegNames);
5074 }
Craig Topper3164f332014-03-11 03:39:26 +00005075 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5076 unsigned &NumAliases) const override = 0;
5077 bool validateAsmConstraint(const char *&Name,
5078 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005079 switch (*Name) {
5080 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005081 return false;
5082
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005083 case 'r': // CPU registers.
5084 case 'd': // Equivalent to "r" unless generating MIPS16 code.
5085 case 'y': // Equivalent to "r", backwards compatibility only.
5086 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005087 case 'c': // $25 for indirect jumps
5088 case 'l': // lo register
5089 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005090 Info.setAllowsRegister();
5091 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005092 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005093 Info.setAllowsMemory();
5094 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005095 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005096 }
5097
Craig Topper3164f332014-03-11 03:39:26 +00005098 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005099 // FIXME: Implement!
5100 return "";
5101 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005102
Craig Topper3164f332014-03-11 03:39:26 +00005103 bool handleTargetFeatures(std::vector<std::string> &Features,
5104 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005105 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005106 IsMicromips = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005107 IsNan2008 = false;
Simon Atanasyan16071912013-04-14 14:07:30 +00005108 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005109 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005110 DspRev = NoDSP;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005111 HasFP64 = ABI == "n32" || ABI == "n64" || ABI == "64";
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005112
5113 for (std::vector<std::string>::iterator it = Features.begin(),
5114 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005115 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005116 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005117 else if (*it == "+soft-float")
5118 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005119 else if (*it == "+mips16")
5120 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005121 else if (*it == "+micromips")
5122 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005123 else if (*it == "+dsp")
5124 DspRev = std::max(DspRev, DSP1);
5125 else if (*it == "+dspr2")
5126 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005127 else if (*it == "+msa")
5128 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005129 else if (*it == "+fp64")
5130 HasFP64 = true;
5131 else if (*it == "-fp64")
5132 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005133 else if (*it == "+nan2008")
5134 IsNan2008 = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005135 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005136
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005137 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005138 std::vector<std::string>::iterator it =
5139 std::find(Features.begin(), Features.end(), "+soft-float");
5140 if (it != Features.end())
5141 Features.erase(it);
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005142 it = std::find(Features.begin(), Features.end(), "+nan2008");
5143 if (it != Features.end())
5144 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005145
Akira Hatanaka9064e362013-10-29 18:30:33 +00005146 setDescriptionString();
5147
Rafael Espindolaeb265472013-08-21 21:59:03 +00005148 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005149 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005150
Craig Topper3164f332014-03-11 03:39:26 +00005151 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005152 if (RegNo == 0) return 4;
5153 if (RegNo == 1) return 5;
5154 return -1;
5155 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005156};
5157
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005158const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5159#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5160#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5161 ALL_LANGUAGES },
5162#include "clang/Basic/BuiltinsMips.def"
5163};
5164
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005165class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005166public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005167 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005168 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005169 SizeType = UnsignedInt;
5170 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005171 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005172 }
Craig Topper3164f332014-03-11 03:39:26 +00005173 bool setABI(const std::string &Name) override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005174 if ((Name == "o32") || (Name == "eabi")) {
5175 ABI = Name;
5176 return true;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005177 } else if (Name == "32") {
5178 ABI = "o32";
5179 return true;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005180 } else
5181 return false;
5182 }
Craig Topper3164f332014-03-11 03:39:26 +00005183 void getTargetDefines(const LangOptions &Opts,
5184 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005185 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005186
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005187 Builder.defineMacro("__mips", "32");
5188
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005189 if (ABI == "o32") {
5190 Builder.defineMacro("__mips_o32");
5191 Builder.defineMacro("_ABIO32", "1");
5192 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5193 }
5194 else if (ABI == "eabi")
5195 Builder.defineMacro("__mips_eabi");
5196 else
David Blaikie83d382b2011-09-23 05:06:16 +00005197 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005198 }
Craig Topper3164f332014-03-11 03:39:26 +00005199 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5200 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005201 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5202 { { "at" }, "$1" },
5203 { { "v0" }, "$2" },
5204 { { "v1" }, "$3" },
5205 { { "a0" }, "$4" },
5206 { { "a1" }, "$5" },
5207 { { "a2" }, "$6" },
5208 { { "a3" }, "$7" },
5209 { { "t0" }, "$8" },
5210 { { "t1" }, "$9" },
5211 { { "t2" }, "$10" },
5212 { { "t3" }, "$11" },
5213 { { "t4" }, "$12" },
5214 { { "t5" }, "$13" },
5215 { { "t6" }, "$14" },
5216 { { "t7" }, "$15" },
5217 { { "s0" }, "$16" },
5218 { { "s1" }, "$17" },
5219 { { "s2" }, "$18" },
5220 { { "s3" }, "$19" },
5221 { { "s4" }, "$20" },
5222 { { "s5" }, "$21" },
5223 { { "s6" }, "$22" },
5224 { { "s7" }, "$23" },
5225 { { "t8" }, "$24" },
5226 { { "t9" }, "$25" },
5227 { { "k0" }, "$26" },
5228 { { "k1" }, "$27" },
5229 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005230 { { "sp","$sp" }, "$29" },
5231 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005232 { { "ra" }, "$31" }
5233 };
5234 Aliases = GCCRegAliases;
5235 NumAliases = llvm::array_lengthof(GCCRegAliases);
5236 }
5237};
5238
5239class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005240 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005241 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005242 }
5243
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005244public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005245 Mips32EBTargetInfo(const llvm::Triple &Triple)
5246 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005247 }
Craig Topper3164f332014-03-11 03:39:26 +00005248 void getTargetDefines(const LangOptions &Opts,
5249 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005250 DefineStd(Builder, "MIPSEB", Opts);
5251 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005252 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005253 }
5254};
5255
5256class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005257 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005258 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005259 }
5260
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005261public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005262 Mips32ELTargetInfo(const llvm::Triple &Triple)
5263 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005264 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005265 }
Craig Topper3164f332014-03-11 03:39:26 +00005266 void getTargetDefines(const LangOptions &Opts,
5267 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005268 DefineStd(Builder, "MIPSEL", Opts);
5269 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005270 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005271 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005272};
Akira Hatanakabef17452011-09-20 19:21:49 +00005273
5274class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005275public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005276 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005277 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005278 LongWidth = LongAlign = 64;
5279 PointerWidth = PointerAlign = 64;
5280 LongDoubleWidth = LongDoubleAlign = 128;
5281 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005282 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5283 LongDoubleWidth = LongDoubleAlign = 64;
5284 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5285 }
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005286 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005287 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005288 }
Craig Topper3164f332014-03-11 03:39:26 +00005289 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005290 if (Name == "n32") {
5291 LongWidth = LongAlign = 32;
5292 PointerWidth = PointerAlign = 32;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005293 ABI = Name;
5294 return true;
5295 } else if (Name == "n64") {
5296 ABI = Name;
5297 return true;
5298 } else if (Name == "64") {
5299 ABI = "n64";
5300 return true;
5301 } else
5302 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005303 }
Craig Topper3164f332014-03-11 03:39:26 +00005304 void getTargetDefines(const LangOptions &Opts,
5305 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005306 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005307
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005308 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005309 Builder.defineMacro("__mips64");
5310 Builder.defineMacro("__mips64__");
5311
Akira Hatanakabef17452011-09-20 19:21:49 +00005312 if (ABI == "n32") {
5313 Builder.defineMacro("__mips_n32");
5314 Builder.defineMacro("_ABIN32", "2");
5315 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5316 }
5317 else if (ABI == "n64") {
5318 Builder.defineMacro("__mips_n64");
5319 Builder.defineMacro("_ABI64", "3");
5320 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5321 }
5322 else
David Blaikie83d382b2011-09-23 05:06:16 +00005323 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005324 }
Craig Topper3164f332014-03-11 03:39:26 +00005325 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5326 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005327 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5328 { { "at" }, "$1" },
5329 { { "v0" }, "$2" },
5330 { { "v1" }, "$3" },
5331 { { "a0" }, "$4" },
5332 { { "a1" }, "$5" },
5333 { { "a2" }, "$6" },
5334 { { "a3" }, "$7" },
5335 { { "a4" }, "$8" },
5336 { { "a5" }, "$9" },
5337 { { "a6" }, "$10" },
5338 { { "a7" }, "$11" },
5339 { { "t0" }, "$12" },
5340 { { "t1" }, "$13" },
5341 { { "t2" }, "$14" },
5342 { { "t3" }, "$15" },
5343 { { "s0" }, "$16" },
5344 { { "s1" }, "$17" },
5345 { { "s2" }, "$18" },
5346 { { "s3" }, "$19" },
5347 { { "s4" }, "$20" },
5348 { { "s5" }, "$21" },
5349 { { "s6" }, "$22" },
5350 { { "s7" }, "$23" },
5351 { { "t8" }, "$24" },
5352 { { "t9" }, "$25" },
5353 { { "k0" }, "$26" },
5354 { { "k1" }, "$27" },
5355 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005356 { { "sp","$sp" }, "$29" },
5357 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005358 { { "ra" }, "$31" }
5359 };
5360 Aliases = GCCRegAliases;
5361 NumAliases = llvm::array_lengthof(GCCRegAliases);
5362 }
5363};
5364
5365class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005366 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005367 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005368 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 +00005369 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005370 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005371
Akira Hatanakabef17452011-09-20 19:21:49 +00005372 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005373
Akira Hatanakabef17452011-09-20 19:21:49 +00005374public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005375 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005376 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005377 void getTargetDefines(const LangOptions &Opts,
5378 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005379 DefineStd(Builder, "MIPSEB", Opts);
5380 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005381 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005382 }
5383};
5384
5385class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005386 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005387 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005388 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 +00005389 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005390 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005391 }
5392public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005393 Mips64ELTargetInfo(const llvm::Triple &Triple)
5394 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005395 // Default ABI is n64.
5396 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005397 }
Craig Topper3164f332014-03-11 03:39:26 +00005398 void getTargetDefines(const LangOptions &Opts,
5399 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005400 DefineStd(Builder, "MIPSEL", Opts);
5401 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005402 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005403 }
5404};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005405} // end anonymous namespace.
5406
Ivan Krasindd7403e2011-08-24 20:22:22 +00005407namespace {
5408class PNaClTargetInfo : public TargetInfo {
5409public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005410 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005411 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005412 this->UserLabelPrefix = "";
5413 this->LongAlign = 32;
5414 this->LongWidth = 32;
5415 this->PointerAlign = 32;
5416 this->PointerWidth = 32;
5417 this->IntMaxType = TargetInfo::SignedLongLong;
5418 this->UIntMaxType = TargetInfo::UnsignedLongLong;
5419 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005420 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005421 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00005422 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00005423 this->SizeType = TargetInfo::UnsignedInt;
5424 this->PtrDiffType = TargetInfo::SignedInt;
5425 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00005426 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00005427 }
5428
Craig Topper3164f332014-03-11 03:39:26 +00005429 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005430 }
Craig Toppere6f17d02014-03-11 04:07:52 +00005431 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005432 Builder.defineMacro("__le32__");
5433 Builder.defineMacro("__pnacl__");
5434 }
Craig Topper3164f332014-03-11 03:39:26 +00005435 void getTargetDefines(const LangOptions &Opts,
5436 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005437 getArchDefines(Opts, Builder);
5438 }
Craig Topper3164f332014-03-11 03:39:26 +00005439 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005440 return Feature == "pnacl";
5441 }
Craig Topper3164f332014-03-11 03:39:26 +00005442 void getTargetBuiltins(const Builtin::Info *&Records,
5443 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005444 }
Craig Topper3164f332014-03-11 03:39:26 +00005445 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005446 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005447 }
Craig Topper3164f332014-03-11 03:39:26 +00005448 void getGCCRegNames(const char * const *&Names,
5449 unsigned &NumNames) const override;
5450 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5451 unsigned &NumAliases) const override;
5452 bool validateAsmConstraint(const char *&Name,
5453 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005454 return false;
5455 }
5456
Craig Topper3164f332014-03-11 03:39:26 +00005457 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00005458 return "";
5459 }
5460};
5461
5462void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
5463 unsigned &NumNames) const {
5464 Names = NULL;
5465 NumNames = 0;
5466}
5467
5468void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5469 unsigned &NumAliases) const {
5470 Aliases = NULL;
5471 NumAliases = 0;
5472}
5473} // end anonymous namespace.
5474
Guy Benyeib798fc92012-12-11 21:38:14 +00005475namespace {
5476 static const unsigned SPIRAddrSpaceMap[] = {
5477 1, // opencl_global
5478 3, // opencl_local
5479 2, // opencl_constant
5480 0, // cuda_device
5481 0, // cuda_constant
5482 0 // cuda_shared
5483 };
5484 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00005485 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005486 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005487 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
5488 "SPIR target must use unknown OS");
5489 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
5490 "SPIR target must use unknown environment type");
5491 BigEndian = false;
5492 TLSSupported = false;
5493 LongWidth = LongAlign = 64;
5494 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005495 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00005496 // Define available target features
5497 // These must be defined in sorted order!
5498 NoAsmVariants = true;
5499 }
Craig Topper3164f332014-03-11 03:39:26 +00005500 void getTargetDefines(const LangOptions &Opts,
5501 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005502 DefineStd(Builder, "SPIR", Opts);
5503 }
Craig Topper3164f332014-03-11 03:39:26 +00005504 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005505 return Feature == "spir";
5506 }
Craig Topper3164f332014-03-11 03:39:26 +00005507
5508 void getTargetBuiltins(const Builtin::Info *&Records,
5509 unsigned &NumRecords) const override {}
5510 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005511 return "";
5512 }
Craig Topper3164f332014-03-11 03:39:26 +00005513 void getGCCRegNames(const char * const *&Names,
5514 unsigned &NumNames) const override {}
5515 bool validateAsmConstraint(const char *&Name,
5516 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005517 return true;
5518 }
Craig Topper3164f332014-03-11 03:39:26 +00005519 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5520 unsigned &NumAliases) const override {}
5521 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00005522 return TargetInfo::VoidPtrBuiltinVaList;
5523 }
5524 };
5525
5526
5527 class SPIR32TargetInfo : public SPIRTargetInfo {
5528 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005529 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005530 PointerWidth = PointerAlign = 32;
5531 SizeType = TargetInfo::UnsignedInt;
5532 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
5533 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00005534 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
5535 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005536 }
Craig Topper3164f332014-03-11 03:39:26 +00005537 void getTargetDefines(const LangOptions &Opts,
5538 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00005539 DefineStd(Builder, "SPIR32", Opts);
5540 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005541 };
5542
5543 class SPIR64TargetInfo : public SPIRTargetInfo {
5544 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005545 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00005546 PointerWidth = PointerAlign = 64;
5547 SizeType = TargetInfo::UnsignedLong;
5548 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005549 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
5550 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00005551 }
Craig Topper3164f332014-03-11 03:39:26 +00005552 void getTargetDefines(const LangOptions &Opts,
5553 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00005554 DefineStd(Builder, "SPIR64", Opts);
5555 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005556 };
5557}
5558
Robert Lytton0e076492013-08-13 09:43:10 +00005559namespace {
5560class XCoreTargetInfo : public TargetInfo {
5561 static const Builtin::Info BuiltinInfo[];
5562public:
5563 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5564 BigEndian = false;
5565 NoAsmVariants = true;
5566 LongLongAlign = 32;
5567 SuitableAlign = 32;
5568 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00005569 SizeType = UnsignedInt;
5570 PtrDiffType = SignedInt;
5571 IntPtrType = SignedInt;
5572 WCharType = UnsignedChar;
5573 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00005574 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005575 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 +00005576 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00005577 }
Craig Topper3164f332014-03-11 03:39:26 +00005578 void getTargetDefines(const LangOptions &Opts,
5579 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005580 Builder.defineMacro("__XS1B__");
5581 }
Craig Topper3164f332014-03-11 03:39:26 +00005582 void getTargetBuiltins(const Builtin::Info *&Records,
5583 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005584 Records = BuiltinInfo;
5585 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
5586 }
Craig Topper3164f332014-03-11 03:39:26 +00005587 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005588 return TargetInfo::VoidPtrBuiltinVaList;
5589 }
Craig Topper3164f332014-03-11 03:39:26 +00005590 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005591 return "";
5592 }
Craig Topper3164f332014-03-11 03:39:26 +00005593 void getGCCRegNames(const char * const *&Names,
5594 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005595 static const char * const GCCRegNames[] = {
5596 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5597 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
5598 };
5599 Names = GCCRegNames;
5600 NumNames = llvm::array_lengthof(GCCRegNames);
5601 }
Craig Topper3164f332014-03-11 03:39:26 +00005602 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5603 unsigned &NumAliases) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005604 Aliases = NULL;
5605 NumAliases = 0;
5606 }
Craig Topper3164f332014-03-11 03:39:26 +00005607 bool validateAsmConstraint(const char *&Name,
5608 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00005609 return false;
5610 }
Craig Topper3164f332014-03-11 03:39:26 +00005611 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00005612 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
5613 return (RegNo < 2)? RegNo : -1;
5614 }
Robert Lytton0e076492013-08-13 09:43:10 +00005615};
5616
5617const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
5618#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5619#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5620 ALL_LANGUAGES },
5621#include "clang/Basic/BuiltinsXCore.def"
5622};
5623} // end anonymous namespace.
5624
Ivan Krasindd7403e2011-08-24 20:22:22 +00005625
Chris Lattner5ba61f02006-10-14 07:39:34 +00005626//===----------------------------------------------------------------------===//
5627// Driver code
5628//===----------------------------------------------------------------------===//
5629
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005630static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00005631 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00005632
Daniel Dunbar52322032009-08-18 05:47:58 +00005633 switch (Triple.getArch()) {
5634 default:
5635 return NULL;
Eli Friedmanb5366062008-05-20 14:21:01 +00005636
Robert Lytton0e076492013-08-13 09:43:10 +00005637 case llvm::Triple::xcore:
5638 return new XCoreTargetInfo(Triple);
5639
Tony Linthicum76329bf2011-12-12 21:14:55 +00005640 case llvm::Triple::hexagon:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005641 return new HexagonTargetInfo(Triple);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005642
Tim Northover9bb857a2013-01-31 12:13:10 +00005643 case llvm::Triple::aarch64:
5644 switch (os) {
5645 case llvm::Triple::Linux:
Christian Pirker9b019ae2014-02-25 13:51:00 +00005646 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
Joerg Sonnenberger98534392014-01-13 18:25:15 +00005647 case llvm::Triple::NetBSD:
Christian Pirker9b019ae2014-02-25 13:51:00 +00005648 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005649 default:
Christian Pirker9b019ae2014-02-25 13:51:00 +00005650 return new AArch64leTargetInfo(Triple);
5651 }
5652
5653 case llvm::Triple::aarch64_be:
5654 switch (os) {
5655 case llvm::Triple::Linux:
5656 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
5657 case llvm::Triple::NetBSD:
5658 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
5659 default:
5660 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00005661 }
5662
Daniel Dunbar52322032009-08-18 05:47:58 +00005663 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00005664 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00005665 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005666 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005667
Daniel Dunbar52322032009-08-18 05:47:58 +00005668 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00005669 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005670 return new LinuxTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005671 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005672 return new FreeBSDTargetInfo<ARMTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005673 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005674 return new NetBSDTargetInfo<ARMTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005675 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005676 return new OpenBSDTargetInfo<ARMTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005677 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005678 return new BitrigTargetInfo<ARMTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005679 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005680 return new RTEMSTargetInfo<ARMTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005681 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005682 return new NaClTargetInfo<ARMTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005683 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005684 return new ARMTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005685 }
Eli Friedmanb5366062008-05-20 14:21:01 +00005686
Daniel Dunbar52322032009-08-18 05:47:58 +00005687 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005688 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00005689
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005690 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005691 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005692 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005693 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005694 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005695 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005696 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005697 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005698 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005699 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005700 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005701 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00005702 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005703
5704 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005705 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005706 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005707 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005708 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005709 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005710 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005711 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005712 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005713 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00005714 case llvm::Triple::NaCl:
5715 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005716 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005717 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00005718 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005719
Akira Hatanakabef17452011-09-20 19:21:49 +00005720 case llvm::Triple::mips64:
5721 switch (os) {
5722 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005723 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005724 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005725 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005726 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005727 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005728 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005729 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005730 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005731 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005732 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005733 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005734 }
5735
5736 case llvm::Triple::mips64el:
5737 switch (os) {
5738 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005739 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005740 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005741 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005742 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005743 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005744 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005745 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005746 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005747 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005748 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005749 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00005750 }
5751
Ivan Krasindd7403e2011-08-24 20:22:22 +00005752 case llvm::Triple::le32:
5753 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00005754 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005755 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00005756 default:
5757 return NULL;
5758 }
5759
Daniel Dunbar52322032009-08-18 05:47:58 +00005760 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005761 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005762 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005763 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005764 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005765 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005766 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005767 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005768 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005769 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005770 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005771 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005772 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005773 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005774 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005775 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005776 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005777
5778 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005779 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005780 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005781 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005782 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005783 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005784 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005785 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005786 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005787 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005788 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005789 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005790 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005791 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005792 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005793
Bill Schmidt778d3872013-07-26 01:36:11 +00005794 case llvm::Triple::ppc64le:
5795 switch (os) {
5796 case llvm::Triple::Linux:
5797 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
5798 default:
5799 return new PPC64TargetInfo(Triple);
5800 }
5801
Peter Collingbournec947aae2012-05-20 23:28:41 +00005802 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005803 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005804 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005805 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00005806
Eli Friedmand13b41e2012-10-12 23:32:00 +00005807 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005808 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00005809
Daniel Dunbar52322032009-08-18 05:47:58 +00005810 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005811 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00005812 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005813 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005814 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005815 return new AuroraUXSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005816 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005817 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005818 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005819 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00005820 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005821 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005822 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005823 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005824 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005825 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00005826 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005827
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005828 case llvm::Triple::sparcv9:
5829 switch (os) {
5830 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005831 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005832 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005833 return new AuroraUXTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005834 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005835 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005836 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005837 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005838 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005839 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005840 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005841 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005842 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005843 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005844 }
5845
Ulrich Weigand47445072013-05-06 16:26:41 +00005846 case llvm::Triple::systemz:
5847 switch (os) {
5848 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005849 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005850 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005851 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00005852 }
5853
Eli Friedmana9c3d712009-08-19 20:47:07 +00005854 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005855 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00005856
Daniel Dunbar52322032009-08-18 05:47:58 +00005857 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005858 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005859 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005860
Daniel Dunbar52322032009-08-18 05:47:58 +00005861 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005862 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005863 return new AuroraUXTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005864 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005865 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005866 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005867 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005868 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005869 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005870 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005871 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005872 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005873 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005874 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005875 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005876 case llvm::Triple::KFreeBSD:
5877 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00005878 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005879 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005880 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005881 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005882 case llvm::Triple::Cygwin:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005883 return new CygwinX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005884 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005885 return new MinGWX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005886 case llvm::Triple::Win32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005887 return new VisualStudioWindowsX86_32TargetInfo(Triple);
Chris Lattnerb986aba2010-04-11 19:29:39 +00005888 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005889 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00005890 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005891 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005892 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005893 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005894 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005895 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005896 }
5897
5898 case llvm::Triple::x86_64:
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005899 if (Triple.isOSDarwin() || Triple.getObjectFormat() == llvm::Triple::MachO)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005900 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00005901
Daniel Dunbar52322032009-08-18 05:47:58 +00005902 switch (os) {
Edward O'Callaghan9dda8e982009-10-18 13:33:59 +00005903 case llvm::Triple::AuroraUX:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005904 return new AuroraUXTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005905 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005906 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00005907 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005908 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005909 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005910 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005911 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005912 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00005913 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005914 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005915 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005916 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00005917 case llvm::Triple::KFreeBSD:
5918 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005919 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005920 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
NAKAMURA Takumi31ea2f12011-02-17 08:51:38 +00005921 case llvm::Triple::MinGW32:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005922 return new MinGWX86_64TargetInfo(Triple);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00005923 case llvm::Triple::Win32: // This is what Triple.h supports now.
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005924 return new VisualStudioWindowsX86_64TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00005925 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005926 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005927 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005928 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00005929 }
Guy Benyeib798fc92012-12-11 21:38:14 +00005930
5931 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005932 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005933 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005934 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005935 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005936 }
5937 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00005938 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005939 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Guy Benyeib798fc92012-12-11 21:38:14 +00005940 return NULL;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005941 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00005942 }
Daniel Dunbar52322032009-08-18 05:47:58 +00005943 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00005944}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005945
5946/// CreateTargetInfo - Return the target info object for the specified target
5947/// triple.
David Blaikie9c902b52011-09-25 23:23:43 +00005948TargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Douglas Gregorf8715de2012-11-16 04:24:59 +00005949 TargetOptions *Opts) {
5950 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005951
5952 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00005953 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005954 if (!Target) {
5955 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
5956 return 0;
5957 }
Douglas Gregorbc10b9f2012-10-15 16:45:32 +00005958 Target->setTargetOpts(Opts);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005959
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005960 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005961 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
5962 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005963 return 0;
5964 }
5965
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005966 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005967 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
5968 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005969 return 0;
5970 }
5971
Rafael Espindolaeb265472013-08-21 21:59:03 +00005972 // Set the fp math unit.
5973 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
5974 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
5975 return 0;
5976 }
5977
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005978 // Compute the default target features, we need the target to handle this
5979 // because features may have dependencies on one another.
5980 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00005981 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005982
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005983 // Apply the user specified deltas.
5984 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
5985 I < N; ++I) {
5986 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00005987 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00005988 bool Enabled = Name[0] == '+';
5989 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005990 }
5991
5992 // Add the features to the compile options.
5993 //
5994 // FIXME: If we are completely confident that we have the right set, we only
5995 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00005996 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00005997 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
5998 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00005999 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006000 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Rafael Espindolaeb265472013-08-21 21:59:03 +00006001 return 0;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006002
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006003 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006004}