blob: 957448a2d494e5d5ad57239d94886c597b87eaaf [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"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000024#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000025#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000027#include "llvm/ADT/Triple.h"
Chandler Carruthffd55512013-01-02 11:45:17 +000028#include "llvm/IR/Type.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000031#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000032#include <memory>
Chris Lattner5ba61f02006-10-14 07:39:34 +000033using namespace clang;
34
Chris Lattner5ba61f02006-10-14 07:39:34 +000035//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000036// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
38
Chris Lattner1e1c0b92009-03-20 16:06:38 +000039/// DefineStd - Define a macro name and standard variants. For example if
40/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
41/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000042static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043 const LangOptions &Opts) {
44 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000045
Chris Lattner1e1c0b92009-03-20 16:06:38 +000046 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
47 // in the user's namespace.
48 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000049 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000050
Chris Lattner1e1c0b92009-03-20 16:06:38 +000051 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000052 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000053
Chris Lattner1e1c0b92009-03-20 16:06:38 +000054 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000055 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056}
57
Benjamin Kramere3b442d2012-01-10 11:50:09 +000058static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
59 bool Tuning = true) {
60 Builder.defineMacro("__" + CPUName);
61 Builder.defineMacro("__" + CPUName + "__");
62 if (Tuning)
63 Builder.defineMacro("__tune_" + CPUName + "__");
64}
65
Chris Lattner09d98f52008-10-05 21:50:58 +000066//===----------------------------------------------------------------------===//
67// Defines specific to certain operating systems.
68//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000069
Torok Edwinb2b37c62009-06-30 17:10:35 +000070namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000071template<typename TgtInfo>
72class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000073protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000074 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000075 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000076public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000077 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000078 void getTargetDefines(const LangOptions &Opts,
79 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000080 TgtInfo::getTargetDefines(Opts, Builder);
81 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000082 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000083
84};
Chris Lattner859c37a2009-08-12 06:24:27 +000085} // end anonymous namespace
Torok Edwin4e054162009-06-30 17:00:25 +000086
Chris Lattner30ba6742009-08-10 19:03:04 +000087
Daniel Dunbard86666f2010-01-26 01:44:04 +000088static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000089 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +000090 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +000091 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +000092 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000093 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000094 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +000095 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
Will Dietzf54319c2013-01-18 11:30:38 +000097 if (Opts.Sanitize.Address) Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000098
John McCall5d36a8c2011-06-16 00:03:19 +000099 if (!Opts.ObjCAutoRefCount) {
John McCall31168b02011-06-15 23:02:42 +0000100 // __weak is always defined, for use in blocks and with objc pointers.
101 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000102
John McCall31168b02011-06-15 23:02:42 +0000103 // Darwin defines __strong even in C mode (just to nothing).
Douglas Gregor79a91412011-09-13 17:21:33 +0000104 if (Opts.getGC() != LangOptions::NonGC)
John McCall31168b02011-06-15 23:02:42 +0000105 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
106 else
107 Builder.defineMacro("__strong", "");
Eric Christopher0c912c52011-07-07 22:55:26 +0000108
John McCall31168b02011-06-15 23:02:42 +0000109 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
110 // allow this in C, since one might have block pointers in structs that
111 // are used in pure C code and in Objective-C ARC.
112 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000113 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000114
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000115 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000116 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000117 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000118 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000119
120 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000121 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000122
Daniel Dunbarecf13562011-04-19 21:40:34 +0000123 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000124 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000125 if (Triple.isMacOSX()) {
126 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000127 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000128 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000129 Triple.getOSVersion(Maj, Min, Rev);
130 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000131 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000132
Sebastian Pop422377c2012-01-20 22:01:23 +0000133 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000134 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000135 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
136 if (PlatformName == "win32") {
137 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138 return;
139 }
140
Evan Cheng31dd9a62014-01-26 23:12:43 +0000141 // Set the appropriate OS version define.
142 if (Triple.isiOS()) {
143 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
144 char Str[6];
145 Str[0] = '0' + Maj;
146 Str[1] = '0' + (Min / 10);
147 Str[2] = '0' + (Min % 10);
148 Str[3] = '0' + (Rev / 10);
149 Str[4] = '0' + (Rev % 10);
150 Str[5] = '\0';
151 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
152 Str);
153 } else if (Triple.isMacOSX()) {
154 // Note that the Driver allows versions which aren't representable in the
155 // define (because we only get a single digit for the minor and micro
156 // revision numbers). So, we limit them to the maximum representable
157 // version.
158 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000159 char Str[7];
160 if (Maj < 10 || (Maj == 10 && Min < 10)) {
161 Str[0] = '0' + (Maj / 10);
162 Str[1] = '0' + (Maj % 10);
163 Str[2] = '0' + std::min(Min, 9U);
164 Str[3] = '0' + std::min(Rev, 9U);
165 Str[4] = '\0';
166 } else {
167 // Handle versions > 10.9.
168 Str[0] = '0' + (Maj / 10);
169 Str[1] = '0' + (Maj % 10);
170 Str[2] = '0' + (Min / 10);
171 Str[3] = '0' + (Min % 10);
172 Str[4] = '0' + (Rev / 10);
173 Str[5] = '0' + (Rev % 10);
174 Str[6] = '\0';
175 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000176 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000177 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000178
Tim Northover157d9112014-01-16 08:48:16 +0000179 // Tell users about the kernel if there is one.
180 if (Triple.isOSDarwin())
181 Builder.defineMacro("__MACH__");
182
Daniel Dunbarecf13562011-04-19 21:40:34 +0000183 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000184}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000185
Chris Lattner30ba6742009-08-10 19:03:04 +0000186namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000187template<typename Target>
188class DarwinTargetInfo : public OSTargetInfo<Target> {
189protected:
Craig Topper3164f332014-03-11 03:39:26 +0000190 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
191 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000192 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000193 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000194 }
Mike Stump11289f42009-09-09 15:08:12 +0000195
Torok Edwinb2b37c62009-06-30 17:10:35 +0000196public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000197 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
198 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
199 this->MCountName = "\01mcount";
200 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000201
Craig Topper3164f332014-03-11 03:39:26 +0000202 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000203 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000204 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000205 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000206 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000207 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000208 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000209 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000210
Craig Topper3164f332014-03-11 03:39:26 +0000211 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000212 // FIXME: We should return 0 when building kexts.
213 return "__TEXT,__StaticInit,regular,pure_instructions";
214 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000215
John McCalleed64c72012-01-29 01:20:30 +0000216 /// Darwin does not support protected visibility. Darwin's "default"
217 /// is very similar to ELF's "protected"; Darwin requires a "weak"
218 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000219 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000220 return false;
221 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222};
223
Chris Lattner30ba6742009-08-10 19:03:04 +0000224
Torok Edwinb2b37c62009-06-30 17:10:35 +0000225// DragonFlyBSD Target
226template<typename Target>
227class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
228protected:
Craig Topper3164f332014-03-11 03:39:26 +0000229 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
230 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000231 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000232 Builder.defineMacro("__DragonFly__");
233 Builder.defineMacro("__DragonFly_cc_version", "100001");
234 Builder.defineMacro("__ELF__");
235 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
236 Builder.defineMacro("__tune_i386__");
237 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000238 }
239public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000240 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
241 : OSTargetInfo<Target>(Triple) {
242 this->UserLabelPrefix = "";
Eli Friedman4286fba2012-02-10 23:02:29 +0000243
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000244 switch (Triple.getArch()) {
245 default:
246 case llvm::Triple::x86:
247 case llvm::Triple::x86_64:
248 this->MCountName = ".mcount";
249 break;
250 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000251 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000252};
253
254// FreeBSD Target
255template<typename Target>
256class FreeBSDTargetInfo : public OSTargetInfo<Target> {
257protected:
Craig Topper3164f332014-03-11 03:39:26 +0000258 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
259 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000260 // FreeBSD defines; list based off of gcc output
261
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000262 unsigned Release = Triple.getOSMajorVersion();
263 if (Release == 0U)
264 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000265
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000266 Builder.defineMacro("__FreeBSD__", Twine(Release));
267 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000268 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
269 DefineStd(Builder, "unix", Opts);
270 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000271
272 // On FreeBSD, wchar_t contains the number of the code point as
273 // used by the character set of the locale. These character sets are
274 // not necessarily a superset of ASCII.
275 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000276 }
277public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000278 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
279 this->UserLabelPrefix = "";
Roman Divacky178e01602011-02-10 16:52:03 +0000280
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000281 switch (Triple.getArch()) {
282 default:
283 case llvm::Triple::x86:
284 case llvm::Triple::x86_64:
285 this->MCountName = ".mcount";
286 break;
287 case llvm::Triple::mips:
288 case llvm::Triple::mipsel:
289 case llvm::Triple::ppc:
290 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000291 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000292 this->MCountName = "_mcount";
293 break;
294 case llvm::Triple::arm:
295 this->MCountName = "__mcount";
296 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000297 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000298 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000299};
300
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000301// GNU/kFreeBSD Target
302template<typename Target>
303class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
304protected:
Craig Topper3164f332014-03-11 03:39:26 +0000305 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
306 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000307 // GNU/kFreeBSD defines; list based off of gcc output
308
309 DefineStd(Builder, "unix", Opts);
310 Builder.defineMacro("__FreeBSD_kernel__");
311 Builder.defineMacro("__GLIBC__");
312 Builder.defineMacro("__ELF__");
313 if (Opts.POSIXThreads)
314 Builder.defineMacro("_REENTRANT");
315 if (Opts.CPlusPlus)
316 Builder.defineMacro("_GNU_SOURCE");
317 }
318public:
Sylvestre Ledru15832282013-09-05 13:58:07 +0000319 KFreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000320 this->UserLabelPrefix = "";
321 }
322};
323
Chris Lattner3e2ee142010-07-07 16:01:42 +0000324// Minix Target
325template<typename Target>
326class MinixTargetInfo : public OSTargetInfo<Target> {
327protected:
Craig Topper3164f332014-03-11 03:39:26 +0000328 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
329 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000330 // Minix defines
331
332 Builder.defineMacro("__minix", "3");
333 Builder.defineMacro("_EM_WSIZE", "4");
334 Builder.defineMacro("_EM_PSIZE", "4");
335 Builder.defineMacro("_EM_SSIZE", "2");
336 Builder.defineMacro("_EM_LSIZE", "4");
337 Builder.defineMacro("_EM_FSIZE", "4");
338 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000339 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000340 DefineStd(Builder, "unix", Opts);
341 }
342public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000343 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
344 this->UserLabelPrefix = "";
345 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000346};
347
Torok Edwinb2b37c62009-06-30 17:10:35 +0000348// Linux target
349template<typename Target>
350class LinuxTargetInfo : public OSTargetInfo<Target> {
351protected:
Craig Topper3164f332014-03-11 03:39:26 +0000352 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
353 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000354 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000355 DefineStd(Builder, "unix", Opts);
356 DefineStd(Builder, "linux", Opts);
357 Builder.defineMacro("__gnu_linux__");
358 Builder.defineMacro("__ELF__");
Logan Chienc6fd8202012-09-02 09:30:11 +0000359 if (Triple.getEnvironment() == llvm::Triple::Android)
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000360 Builder.defineMacro("__ANDROID__", "1");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000361 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000362 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000363 if (Opts.CPlusPlus)
364 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000365 }
366public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000367 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000368 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000369 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000370
371 switch (Triple.getArch()) {
372 default:
373 break;
374 case llvm::Triple::ppc:
375 case llvm::Triple::ppc64:
376 case llvm::Triple::ppc64le:
377 this->MCountName = "_mcount";
378 break;
379 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000380 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000381
Craig Topper3164f332014-03-11 03:39:26 +0000382 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000383 return ".text.startup";
384 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000385};
386
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000387// NetBSD Target
388template<typename Target>
389class NetBSDTargetInfo : public OSTargetInfo<Target> {
390protected:
Craig Topper3164f332014-03-11 03:39:26 +0000391 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
392 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000393 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000394 Builder.defineMacro("__NetBSD__");
395 Builder.defineMacro("__unix__");
396 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000397 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000398 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000399
400 switch (Triple.getArch()) {
401 default:
402 break;
403 case llvm::Triple::arm:
404 case llvm::Triple::armeb:
405 case llvm::Triple::thumb:
406 case llvm::Triple::thumbeb:
407 Builder.defineMacro("__ARM_DWARF_EH__");
408 break;
409 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000410 }
411public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000412 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
413 this->UserLabelPrefix = "";
414 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000415};
416
Torok Edwinb2b37c62009-06-30 17:10:35 +0000417// OpenBSD Target
418template<typename Target>
419class OpenBSDTargetInfo : public OSTargetInfo<Target> {
420protected:
Craig Topper3164f332014-03-11 03:39:26 +0000421 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
422 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000423 // OpenBSD defines; list based off of gcc output
424
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000425 Builder.defineMacro("__OpenBSD__");
426 DefineStd(Builder, "unix", Opts);
427 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000428 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000429 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000430 }
431public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000432 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
433 this->UserLabelPrefix = "";
434 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000435
Eli Friedman3715d1f2011-12-15 02:15:56 +0000436 switch (Triple.getArch()) {
437 default:
438 case llvm::Triple::x86:
439 case llvm::Triple::x86_64:
440 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000441 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000442 this->MCountName = "__mcount";
443 break;
444 case llvm::Triple::mips64:
445 case llvm::Triple::mips64el:
446 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000447 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000448 this->MCountName = "_mcount";
449 break;
450 }
451 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000452};
453
Eli Friedman9fa28852012-08-08 23:57:20 +0000454// Bitrig Target
455template<typename Target>
456class BitrigTargetInfo : public OSTargetInfo<Target> {
457protected:
Craig Topper3164f332014-03-11 03:39:26 +0000458 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
459 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000460 // Bitrig defines; list based off of gcc output
461
462 Builder.defineMacro("__Bitrig__");
463 DefineStd(Builder, "unix", Opts);
464 Builder.defineMacro("__ELF__");
465 if (Opts.POSIXThreads)
466 Builder.defineMacro("_REENTRANT");
467 }
468public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000469 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
470 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000471 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000472 }
473};
474
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000475// PSP Target
476template<typename Target>
477class PSPTargetInfo : public OSTargetInfo<Target> {
478protected:
Craig Topper3164f332014-03-11 03:39:26 +0000479 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
480 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000481 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000482 Builder.defineMacro("PSP");
483 Builder.defineMacro("_PSP");
484 Builder.defineMacro("__psp__");
485 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000486 }
487public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000488 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000489 this->UserLabelPrefix = "";
490 }
491};
492
John Thompsone467e192009-11-19 17:18:50 +0000493// PS3 PPU Target
494template<typename Target>
495class PS3PPUTargetInfo : public OSTargetInfo<Target> {
496protected:
Craig Topper3164f332014-03-11 03:39:26 +0000497 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
498 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000499 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000500 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000501 Builder.defineMacro("__PPU__");
502 Builder.defineMacro("__CELLOS_LV2__");
503 Builder.defineMacro("__ELF__");
504 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000505 Builder.defineMacro("_ARCH_PPC64");
506 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000507 }
508public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000509 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
John Thompsone467e192009-11-19 17:18:50 +0000510 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000511 this->LongWidth = this->LongAlign = 32;
512 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000513 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000514 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000515 this->SizeType = TargetInfo::UnsignedInt;
Rafael Espindolac418ae92014-01-03 19:22:05 +0000516 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000517 }
518};
519
Torok Edwinb2b37c62009-06-30 17:10:35 +0000520// Solaris target
521template<typename Target>
522class SolarisTargetInfo : public OSTargetInfo<Target> {
523protected:
Craig Topper3164f332014-03-11 03:39:26 +0000524 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
525 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000526 DefineStd(Builder, "sun", Opts);
527 DefineStd(Builder, "unix", Opts);
528 Builder.defineMacro("__ELF__");
529 Builder.defineMacro("__svr4__");
530 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000531 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
532 // newer, but to 500 for everything else. feature_test.h has a check to
533 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000534 // with a new version.
535 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000536 Builder.defineMacro("_XOPEN_SOURCE", "600");
537 else
538 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000539 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000540 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000541 Builder.defineMacro("_LARGEFILE_SOURCE");
542 Builder.defineMacro("_LARGEFILE64_SOURCE");
543 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000544 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000545 }
546public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000547 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000548 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000549 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000550 // FIXME: WIntType should be SignedLong
551 }
552};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000553
554// Windows target
555template<typename Target>
556class WindowsTargetInfo : public OSTargetInfo<Target> {
557protected:
Craig Topper3164f332014-03-11 03:39:26 +0000558 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
559 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000560 Builder.defineMacro("_WIN32");
561 }
562 void getVisualStudioDefines(const LangOptions &Opts,
563 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000564 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000565 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000566 Builder.defineMacro("_CPPRTTI");
567
568 if (Opts.Exceptions)
569 Builder.defineMacro("_CPPUNWIND");
570 }
571
572 if (!Opts.CharIsSigned)
573 Builder.defineMacro("_CHAR_UNSIGNED");
574
575 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
576 // but it works for now.
577 if (Opts.POSIXThreads)
578 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000579
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000580 if (Opts.MSCompatibilityVersion) {
581 Builder.defineMacro("_MSC_VER",
582 Twine(Opts.MSCompatibilityVersion / 100000));
583 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000584 // FIXME We cannot encode the revision information into 32-bits
585 Builder.defineMacro("_MSC_BUILD", Twine(1));
586 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000587
588 if (Opts.MicrosoftExt) {
589 Builder.defineMacro("_MSC_EXTENSIONS");
590
591 if (Opts.CPlusPlus11) {
592 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
593 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
594 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
595 }
596 }
597
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000598 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000599 }
600
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000601public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000602 WindowsTargetInfo(const llvm::Triple &Triple)
603 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000604};
605
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000606template <typename Target>
607class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000608protected:
Craig Topper3164f332014-03-11 03:39:26 +0000609 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
610 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000611 if (Opts.POSIXThreads)
612 Builder.defineMacro("_REENTRANT");
613 if (Opts.CPlusPlus)
614 Builder.defineMacro("_GNU_SOURCE");
615
616 DefineStd(Builder, "unix", Opts);
617 Builder.defineMacro("__ELF__");
618 Builder.defineMacro("__native_client__");
619 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000620
621public:
622 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000623 this->UserLabelPrefix = "";
624 this->LongAlign = 32;
625 this->LongWidth = 32;
626 this->PointerAlign = 32;
627 this->PointerWidth = 32;
628 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000629 this->Int64Type = TargetInfo::SignedLongLong;
630 this->DoubleAlign = 64;
631 this->LongDoubleWidth = 64;
632 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000633 this->LongLongWidth = 64;
634 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000635 this->SizeType = TargetInfo::UnsignedInt;
636 this->PtrDiffType = TargetInfo::SignedInt;
637 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000638 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000639 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000640 if (Triple.getArch() == llvm::Triple::arm) {
Tim Northoverb98dc4b2014-10-14 20:57:29 +0000641 this->DescriptionString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000642 } else if (Triple.getArch() == llvm::Triple::x86) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000643 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000644 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Rafael Espindolac418ae92014-01-03 19:22:05 +0000645 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000646 } else if (Triple.getArch() == llvm::Triple::mipsel) {
647 // Handled on mips' setDescriptionString.
648 } else {
649 assert(Triple.getArch() == llvm::Triple::le32);
650 this->DescriptionString = "e-p:32:32-i64:64";
651 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000652 }
Craig Topper3164f332014-03-11 03:39:26 +0000653 typename Target::CallingConvCheckResult checkCallingConvention(
654 CallingConv CC) const override {
Derek Schuffa2020962012-10-16 22:30:41 +0000655 return CC == CC_PnaclCall ? Target::CCCR_OK :
656 Target::checkCallingConvention(CC);
657 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000658};
Mike Stump11289f42009-09-09 15:08:12 +0000659} // end anonymous namespace.
Torok Edwinb2b37c62009-06-30 17:10:35 +0000660
Chris Lattner09d98f52008-10-05 21:50:58 +0000661//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000662// Specific target implementations.
663//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000664
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000665namespace {
666// PPC abstract base class
667class PPCTargetInfo : public TargetInfo {
668 static const Builtin::Info BuiltinInfo[];
669 static const char * const GCCRegNames[];
670 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000671 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000672
673 // Target cpu features.
674 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000675 bool HasP8Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000676
Ulrich Weigand8afad612014-07-28 13:17:52 +0000677protected:
678 std::string ABI;
679
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000680public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000681 PPCTargetInfo(const llvm::Triple &Triple)
Bill Schmidt8c184e32014-10-10 17:21:23 +0000682 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000683 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Nico Weber3435ede2012-01-31 02:07:33 +0000684 LongDoubleWidth = LongDoubleAlign = 128;
685 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
686 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000687
Hal Finkel6b984f02012-07-03 16:51:04 +0000688 /// \brief Flags for architecture specific defines.
689 typedef enum {
690 ArchDefineNone = 0,
691 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
692 ArchDefinePpcgr = 1 << 1,
693 ArchDefinePpcsq = 1 << 2,
694 ArchDefine440 = 1 << 3,
695 ArchDefine603 = 1 << 4,
696 ArchDefine604 = 1 << 5,
697 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000698 ArchDefinePwr5 = 1 << 7,
699 ArchDefinePwr5x = 1 << 8,
700 ArchDefinePwr6 = 1 << 9,
701 ArchDefinePwr6x = 1 << 10,
702 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000703 ArchDefinePwr8 = 1 << 12,
704 ArchDefineA2 = 1 << 13,
705 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000706 } ArchDefineTypes;
707
Bill Schmidt38378a02013-02-01 20:23:10 +0000708 // Note: GCC recognizes the following additional cpus:
709 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
710 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
711 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000712 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000713 bool CPUKnown = llvm::StringSwitch<bool>(Name)
714 .Case("generic", true)
715 .Case("440", true)
716 .Case("450", true)
717 .Case("601", true)
718 .Case("602", true)
719 .Case("603", true)
720 .Case("603e", true)
721 .Case("603ev", true)
722 .Case("604", true)
723 .Case("604e", true)
724 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000725 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000726 .Case("g3", true)
727 .Case("7400", true)
728 .Case("g4", true)
729 .Case("7450", true)
730 .Case("g4+", true)
731 .Case("750", true)
732 .Case("970", true)
733 .Case("g5", true)
734 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000735 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000736 .Case("e500mc", true)
737 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000738 .Case("power3", true)
739 .Case("pwr3", true)
740 .Case("power4", true)
741 .Case("pwr4", true)
742 .Case("power5", true)
743 .Case("pwr5", true)
744 .Case("power5x", true)
745 .Case("pwr5x", true)
746 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000747 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000748 .Case("power6x", true)
749 .Case("pwr6x", true)
750 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000751 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000752 .Case("power8", true)
753 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000754 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000755 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000756 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000757 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000758 .Case("powerpc64le", true)
759 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000760 .Default(false);
761
762 if (CPUKnown)
763 CPU = Name;
764
765 return CPUKnown;
766 }
767
Ulrich Weigand8afad612014-07-28 13:17:52 +0000768
769 StringRef getABI() const override { return ABI; }
770
Craig Topper3164f332014-03-11 03:39:26 +0000771 void getTargetBuiltins(const Builtin::Info *&Records,
772 unsigned &NumRecords) const override {
Chris Lattner10a5b382007-01-29 05:24:35 +0000773 Records = BuiltinInfo;
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000774 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +0000775 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000776
Craig Topper3164f332014-03-11 03:39:26 +0000777 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000778
Craig Topper3164f332014-03-11 03:39:26 +0000779 void getTargetDefines(const LangOptions &Opts,
780 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000781
Craig Topper3164f332014-03-11 03:39:26 +0000782 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000783
Craig Topper3164f332014-03-11 03:39:26 +0000784 bool handleTargetFeatures(std::vector<std::string> &Features,
785 DiagnosticsEngine &Diags) override;
786 bool hasFeature(StringRef Feature) const override;
787
788 void getGCCRegNames(const char * const *&Names,
789 unsigned &NumNames) const override;
790 void getGCCRegAliases(const GCCRegAlias *&Aliases,
791 unsigned &NumAliases) const override;
792 bool validateAsmConstraint(const char *&Name,
793 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000794 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000795 default: return false;
796 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000797 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000798 case 'b': // Base register
799 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000800 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000801 break;
802 // FIXME: The following are added to allow parsing.
803 // I just took a guess at what the actions should be.
804 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000805 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000806 case 'v': // Altivec vector register
807 Info.setAllowsRegister();
808 break;
809 case 'w':
810 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000811 case 'd':// VSX vector register to hold vector double data
812 case 'f':// VSX vector register to hold vector float data
813 case 's':// VSX vector register to hold scalar float data
814 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000815 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000816 break;
817 default:
818 return false;
819 }
820 Info.setAllowsRegister();
821 Name++; // Skip over 'w'.
822 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000823 case 'h': // `MQ', `CTR', or `LINK' register
824 case 'q': // `MQ' register
825 case 'c': // `CTR' register
826 case 'l': // `LINK' register
827 case 'x': // `CR' register (condition register) number 0
828 case 'y': // `CR' register (condition register)
829 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000830 Info.setAllowsRegister();
831 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000832 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000833 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000834 // (use `L' instead for SImode constants)
835 case 'K': // Unsigned 16-bit constant
836 case 'L': // Signed 16-bit constant shifted left 16 bits
837 case 'M': // Constant larger than 31
838 case 'N': // Exact power of 2
839 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000840 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000841 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000842 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000843 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000844 break;
845 case 'm': // Memory operand. Note that on PowerPC targets, m can
846 // include addresses that update the base register. It
847 // is therefore only safe to use `m' in an asm statement
848 // if that asm statement accesses the operand exactly once.
849 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000850 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000851 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000852 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000853 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000854 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
855 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000856 // register to be updated.
857 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000858 if (Name[1] != 's')
859 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000860 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000861 // include any automodification of the base register. Unlike
862 // `m', this constraint can be used in asm statements that
863 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000864 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +0000865 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +0000866 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +0000867 break;
868 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000869 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000870 case 'Z': // Memory operand that is an indexed or indirect from a
871 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000872 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +0000873 Info.setAllowsMemory();
874 Info.setAllowsRegister();
875 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000876 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +0000877 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000878 // register (`p' is preferable for asm statements)
879 case 'S': // Constant suitable as a 64-bit mask operand
880 case 'T': // Constant suitable as a 32-bit mask operand
881 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +0000882 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000883 // instructions
884 case 'W': // Vector constant that does not require memory
885 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +0000886 break;
887 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +0000888 }
John Thompson07a61a42010-06-24 22:44:13 +0000889 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +0000890 }
Craig Topper3164f332014-03-11 03:39:26 +0000891 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +0000892 std::string R;
893 switch (*Constraint) {
894 case 'e':
895 case 'w':
896 // Two-character constraint; add "^" hint for later parsing.
897 R = std::string("^") + std::string(Constraint, 2);
898 Constraint++;
899 break;
900 default:
901 return TargetInfo::convertConstraint(Constraint);
902 }
903 return R;
904 }
Craig Topper3164f332014-03-11 03:39:26 +0000905 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000906 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +0000907 }
Craig Topper3164f332014-03-11 03:39:26 +0000908 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +0000909 if (RegNo == 0) return 3;
910 if (RegNo == 1) return 4;
911 return -1;
912 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000913};
Anders Carlssonf511f642007-11-27 04:11:28 +0000914
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000915const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000916#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +0000917#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +0000918 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +0000919#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000920};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000921
Eric Christopher3ff21b32013-10-16 21:26:26 +0000922 /// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000923/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +0000924bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000925 DiagnosticsEngine &Diags) {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000926 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
927 // Ignore disabled features.
928 if (Features[i][0] == '-')
929 continue;
930
931 StringRef Feature = StringRef(Features[i]).substr(1);
932
933 if (Feature == "vsx") {
934 HasVSX = true;
935 continue;
936 }
937
Bill Schmidt59eb7672014-10-10 15:09:43 +0000938 if (Feature == "power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +0000939 HasP8Vector = true;
Bill Schmidt59eb7672014-10-10 15:09:43 +0000940 continue;
941 }
942
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000943 // TODO: Finish this list and add an assert that we've handled them
944 // all.
945 }
946
947 return true;
948}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000949
Chris Lattnerecd49032009-03-02 22:27:17 +0000950/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
951/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +0000952void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000953 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +0000954 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000955 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000956 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000957 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000958 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000959 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000960 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000961 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +0000962 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000963 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +0000964 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +0000965 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000966
Chris Lattnerecd49032009-03-02 22:27:17 +0000967 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +0000968 if (getTriple().getArch() == llvm::Triple::ppc64le) {
969 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000970 } else {
971 if (getTriple().getOS() != llvm::Triple::NetBSD &&
972 getTriple().getOS() != llvm::Triple::OpenBSD)
973 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +0000974 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000975
Ulrich Weigand8afad612014-07-28 13:17:52 +0000976 // ABI options.
977 if (ABI == "elfv1")
978 Builder.defineMacro("_CALL_ELF", "1");
979 if (ABI == "elfv2")
980 Builder.defineMacro("_CALL_ELF", "2");
981
Chris Lattnerecd49032009-03-02 22:27:17 +0000982 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000983 Builder.defineMacro("__NATURAL_ALIGNMENT__");
984 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000985
Chris Lattnerecd49032009-03-02 22:27:17 +0000986 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +0000987 if (LongDoubleWidth == 128)
988 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000989
John Thompsone467e192009-11-19 17:18:50 +0000990 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000991 Builder.defineMacro("__VEC__", "10206");
992 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +0000993 }
Hal Finkel8eb59282012-06-11 22:35:19 +0000994
995 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +0000996 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
997 .Case("440", ArchDefineName)
998 .Case("450", ArchDefineName | ArchDefine440)
999 .Case("601", ArchDefineName)
1000 .Case("602", ArchDefineName | ArchDefinePpcgr)
1001 .Case("603", ArchDefineName | ArchDefinePpcgr)
1002 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1003 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1004 .Case("604", ArchDefineName | ArchDefinePpcgr)
1005 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1006 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001007 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001008 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1009 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1010 .Case("750", ArchDefineName | ArchDefinePpcgr)
1011 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1012 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001013 .Case("a2", ArchDefineA2)
1014 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001015 .Case("pwr3", ArchDefinePpcgr)
1016 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1017 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1018 | ArchDefinePpcsq)
1019 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1020 | ArchDefinePpcgr | ArchDefinePpcsq)
1021 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1022 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1023 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1024 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1025 | ArchDefinePpcsq)
1026 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1027 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001028 | ArchDefinePpcgr | ArchDefinePpcsq)
1029 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1030 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1031 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001032 .Case("power3", ArchDefinePpcgr)
1033 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1034 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1035 | ArchDefinePpcsq)
1036 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1037 | ArchDefinePpcgr | ArchDefinePpcsq)
1038 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1039 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1040 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1041 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1042 | ArchDefinePpcsq)
1043 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1044 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001045 | ArchDefinePpcgr | ArchDefinePpcsq)
1046 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1047 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1048 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001049 .Default(ArchDefineNone);
1050
1051 if (defs & ArchDefineName)
1052 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1053 if (defs & ArchDefinePpcgr)
1054 Builder.defineMacro("_ARCH_PPCGR");
1055 if (defs & ArchDefinePpcsq)
1056 Builder.defineMacro("_ARCH_PPCSQ");
1057 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001058 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001059 if (defs & ArchDefine603)
1060 Builder.defineMacro("_ARCH_603");
1061 if (defs & ArchDefine604)
1062 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001063 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001064 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001065 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001066 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001067 if (defs & ArchDefinePwr5x)
1068 Builder.defineMacro("_ARCH_PWR5X");
1069 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001070 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001071 if (defs & ArchDefinePwr6x)
1072 Builder.defineMacro("_ARCH_PWR6X");
1073 if (defs & ArchDefinePwr7)
1074 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001075 if (defs & ArchDefinePwr8)
1076 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001077 if (defs & ArchDefineA2)
1078 Builder.defineMacro("_ARCH_A2");
1079 if (defs & ArchDefineA2q) {
1080 Builder.defineMacro("_ARCH_A2Q");
1081 Builder.defineMacro("_ARCH_QP");
1082 }
1083
1084 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1085 Builder.defineMacro("__bg__");
1086 Builder.defineMacro("__THW_BLUEGENE__");
1087 Builder.defineMacro("__bgq__");
1088 Builder.defineMacro("__TOS_BGQ__");
1089 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001090
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001091 if (HasVSX)
1092 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001093 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001094 Builder.defineMacro("__POWER8_VECTOR__");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001095
Bill Schmidt38378a02013-02-01 20:23:10 +00001096 // FIXME: The following are not yet generated here by Clang, but are
1097 // generated by GCC:
1098 //
1099 // _SOFT_FLOAT_
1100 // __RECIP_PRECISION__
1101 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001102 // __RECIP__
1103 // __RECIPF__
1104 // __RSQRTE__
1105 // __RSQRTEF__
1106 // _SOFT_DOUBLE_
1107 // __NO_LWSYNC__
1108 // __HAVE_BSWAP__
1109 // __LONGDOUBLE128
1110 // __CMODEL_MEDIUM__
1111 // __CMODEL_LARGE__
1112 // _CALL_SYSV
1113 // _CALL_DARWIN
1114 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001115}
1116
1117void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1118 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1119 .Case("7400", true)
1120 .Case("g4", true)
1121 .Case("7450", true)
1122 .Case("g4+", true)
1123 .Case("970", true)
1124 .Case("g5", true)
1125 .Case("pwr6", true)
1126 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001127 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001128 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001129 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001130 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001131
1132 Features["qpx"] = (CPU == "a2q");
Ulrich Weigand8afad612014-07-28 13:17:52 +00001133
1134 if (!ABI.empty())
1135 Features[ABI] = true;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001136}
1137
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001138bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1139 return Feature == "powerpc";
1140}
Chris Lattner17df24e2008-04-21 18:56:49 +00001141
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001142
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001143const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001144 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1145 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1146 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1147 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1148 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1149 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1150 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1151 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001152 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001153 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001154 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001155 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1156 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1157 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1158 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001159 "vrsave", "vscr",
1160 "spe_acc", "spefscr",
1161 "sfp"
1162};
Chris Lattner10a5b382007-01-29 05:24:35 +00001163
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001164void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001165 unsigned &NumNames) const {
1166 Names = GCCRegNames;
1167 NumNames = llvm::array_lengthof(GCCRegNames);
1168}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001169
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001170const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1171 // While some of these aliases do map to different registers
1172 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001173 { { "0" }, "r0" },
1174 { { "1"}, "r1" },
1175 { { "2" }, "r2" },
1176 { { "3" }, "r3" },
1177 { { "4" }, "r4" },
1178 { { "5" }, "r5" },
1179 { { "6" }, "r6" },
1180 { { "7" }, "r7" },
1181 { { "8" }, "r8" },
1182 { { "9" }, "r9" },
1183 { { "10" }, "r10" },
1184 { { "11" }, "r11" },
1185 { { "12" }, "r12" },
1186 { { "13" }, "r13" },
1187 { { "14" }, "r14" },
1188 { { "15" }, "r15" },
1189 { { "16" }, "r16" },
1190 { { "17" }, "r17" },
1191 { { "18" }, "r18" },
1192 { { "19" }, "r19" },
1193 { { "20" }, "r20" },
1194 { { "21" }, "r21" },
1195 { { "22" }, "r22" },
1196 { { "23" }, "r23" },
1197 { { "24" }, "r24" },
1198 { { "25" }, "r25" },
1199 { { "26" }, "r26" },
1200 { { "27" }, "r27" },
1201 { { "28" }, "r28" },
1202 { { "29" }, "r29" },
1203 { { "30" }, "r30" },
1204 { { "31" }, "r31" },
1205 { { "fr0" }, "f0" },
1206 { { "fr1" }, "f1" },
1207 { { "fr2" }, "f2" },
1208 { { "fr3" }, "f3" },
1209 { { "fr4" }, "f4" },
1210 { { "fr5" }, "f5" },
1211 { { "fr6" }, "f6" },
1212 { { "fr7" }, "f7" },
1213 { { "fr8" }, "f8" },
1214 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001215 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001216 { { "fr11" }, "f11" },
1217 { { "fr12" }, "f12" },
1218 { { "fr13" }, "f13" },
1219 { { "fr14" }, "f14" },
1220 { { "fr15" }, "f15" },
1221 { { "fr16" }, "f16" },
1222 { { "fr17" }, "f17" },
1223 { { "fr18" }, "f18" },
1224 { { "fr19" }, "f19" },
1225 { { "fr20" }, "f20" },
1226 { { "fr21" }, "f21" },
1227 { { "fr22" }, "f22" },
1228 { { "fr23" }, "f23" },
1229 { { "fr24" }, "f24" },
1230 { { "fr25" }, "f25" },
1231 { { "fr26" }, "f26" },
1232 { { "fr27" }, "f27" },
1233 { { "fr28" }, "f28" },
1234 { { "fr29" }, "f29" },
1235 { { "fr30" }, "f30" },
1236 { { "fr31" }, "f31" },
1237 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001238};
1239
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001240void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001241 unsigned &NumAliases) const {
1242 Aliases = GCCRegAliases;
1243 NumAliases = llvm::array_lengthof(GCCRegAliases);
1244}
1245} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001246
Chris Lattner5ba61f02006-10-14 07:39:34 +00001247namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001248class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001249public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001250 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001251 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001252
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001253 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001254 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001255 case llvm::Triple::FreeBSD:
1256 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001257 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001258 PtrDiffType = SignedInt;
1259 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001260 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001261 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001262 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001263 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001264
Roman Divacky3ffe7462012-03-13 19:20:17 +00001265 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1266 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001267 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001268 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001269
1270 // PPC32 supports atomics up to 4 bytes.
1271 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001272 }
1273
Craig Topper3164f332014-03-11 03:39:26 +00001274 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001275 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001276 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001277 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001278};
1279} // end anonymous namespace.
1280
Bill Schmidt778d3872013-07-26 01:36:11 +00001281// Note: ABI differences may eventually require us to have a separate
1282// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001283namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001284class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001285public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001286 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001287 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001288 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001289 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001290
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001291 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1292 DescriptionString = "e-m:e-i64:64-n32:64";
1293 ABI = "elfv2";
1294 } else {
1295 DescriptionString = "E-m:e-i64:64-n32:64";
1296 ABI = "elfv1";
1297 }
1298
1299 switch (getTriple().getOS()) {
1300 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001301 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001302 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001303 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001304 case llvm::Triple::NetBSD:
1305 IntMaxType = SignedLongLong;
1306 Int64Type = SignedLongLong;
1307 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001308 default:
1309 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001310 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001311
1312 // PPC64 supports atomics up to 8 bytes.
1313 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001314 }
Craig Topper3164f332014-03-11 03:39:26 +00001315 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001316 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001317 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001318 // PPC64 Linux-specifc ABI options.
1319 bool setABI(const std::string &Name) override {
1320 if (Name == "elfv1" || Name == "elfv2") {
1321 ABI = Name;
1322 return true;
1323 }
1324 return false;
1325 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001326};
1327} // end anonymous namespace.
1328
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001329
1330namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001331class DarwinPPC32TargetInfo :
1332 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001333public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001334 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1335 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001336 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001337 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherc04fe092013-10-16 21:19:19 +00001338 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001339 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001340 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001341 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001342 }
Craig Topper3164f332014-03-11 03:39:26 +00001343 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001344 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001345 }
1346};
1347
1348class DarwinPPC64TargetInfo :
1349 public DarwinTargetInfo<PPC64TargetInfo> {
1350public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001351 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1352 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001353 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001354 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001355 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001356 }
1357};
1358} // end anonymous namespace.
1359
Chris Lattner5ba61f02006-10-14 07:39:34 +00001360namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001361 static const unsigned NVPTXAddrSpaceMap[] = {
1362 1, // opencl_global
1363 3, // opencl_local
1364 4, // opencl_constant
1365 1, // cuda_device
1366 4, // cuda_constant
1367 3, // cuda_shared
1368 };
1369 class NVPTXTargetInfo : public TargetInfo {
1370 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001371 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001372 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001373 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001374 BigEndian = false;
1375 TLSSupported = false;
1376 LongWidth = LongAlign = 64;
1377 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001378 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001379 // Define available target features
1380 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001381 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001382 }
Craig Topper3164f332014-03-11 03:39:26 +00001383 void getTargetDefines(const LangOptions &Opts,
1384 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001385 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001386 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001387 }
Craig Topper3164f332014-03-11 03:39:26 +00001388 void getTargetBuiltins(const Builtin::Info *&Records,
1389 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001390 Records = BuiltinInfo;
1391 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001392 }
Craig Topper3164f332014-03-11 03:39:26 +00001393 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001394 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001395 }
Craig Topper3164f332014-03-11 03:39:26 +00001396
1397 void getGCCRegNames(const char * const *&Names,
1398 unsigned &NumNames) const override;
1399 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1400 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001401 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001402 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001403 NumAliases = 0;
1404 }
Craig Topper3164f332014-03-11 03:39:26 +00001405 bool validateAsmConstraint(const char *&Name,
1406 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001407 switch (*Name) {
1408 default: return false;
1409 case 'c':
1410 case 'h':
1411 case 'r':
1412 case 'l':
1413 case 'f':
1414 case 'd':
1415 Info.setAllowsRegister();
1416 return true;
1417 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001418 }
Craig Topper3164f332014-03-11 03:39:26 +00001419 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001420 // FIXME: Is this really right?
1421 return "";
1422 }
Craig Topper3164f332014-03-11 03:39:26 +00001423 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001424 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001425 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001426 }
Craig Topper3164f332014-03-11 03:39:26 +00001427 bool setCPU(const std::string &Name) override {
Justin Holewinski91203e82013-03-30 14:38:26 +00001428 bool Valid = llvm::StringSwitch<bool>(Name)
1429 .Case("sm_20", true)
1430 .Case("sm_21", true)
1431 .Case("sm_30", true)
1432 .Case("sm_35", true)
1433 .Default(false);
1434
1435 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001436 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001437 };
1438
1439 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1440#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1441#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1442 ALL_LANGUAGES },
1443#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001444 };
1445
1446 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1447 "r0"
1448 };
1449
1450 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1451 unsigned &NumNames) const {
1452 Names = GCCRegNames;
1453 NumNames = llvm::array_lengthof(GCCRegNames);
1454 }
1455
1456 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1457 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001458 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001459 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001460 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1461 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001462 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001463 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001464 };
1465
1466 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1467 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001468 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001469 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001470 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1471 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001472 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001473 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001474 };
1475}
1476
1477namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001478
1479static const unsigned R600AddrSpaceMap[] = {
1480 1, // opencl_global
1481 3, // opencl_local
1482 2, // opencl_constant
1483 1, // cuda_device
1484 2, // cuda_constant
1485 3 // cuda_shared
1486};
1487
Tom Stellarda96344b2014-08-21 13:58:40 +00001488// If you edit the description strings, make sure you update
1489// getPointerWidthV().
1490
Tom Stellardc74b1e02013-03-04 17:40:53 +00001491static const char *DescriptionStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001492 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1493 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001494
1495static const char *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001496 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1497 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001498
1499static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001500 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001501 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1502 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001503
Eli Friedmand13b41e2012-10-12 23:32:00 +00001504class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001505 static const Builtin::Info BuiltinInfo[];
1506
Tom Stellardc74b1e02013-03-04 17:40:53 +00001507 /// \brief The GPU profiles supported by the R600 target.
1508 enum GPUKind {
1509 GK_NONE,
1510 GK_R600,
1511 GK_R600_DOUBLE_OPS,
1512 GK_R700,
1513 GK_R700_DOUBLE_OPS,
1514 GK_EVERGREEN,
1515 GK_EVERGREEN_DOUBLE_OPS,
1516 GK_NORTHERN_ISLANDS,
1517 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001518 GK_SOUTHERN_ISLANDS,
1519 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001520 } GPU;
1521
Eli Friedmand13b41e2012-10-12 23:32:00 +00001522public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001523 R600TargetInfo(const llvm::Triple &Triple)
1524 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001525 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001526 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001527 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001528 }
1529
Tom Stellarda96344b2014-08-21 13:58:40 +00001530 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1531 if (GPU <= GK_CAYMAN)
1532 return 32;
1533
1534 switch(AddrSpace) {
1535 default:
1536 return 64;
1537 case 0:
1538 case 3:
1539 case 5:
1540 return 32;
1541 }
1542 }
1543
Craig Topper3164f332014-03-11 03:39:26 +00001544 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001545 return "";
1546 }
1547
Craig Topper3164f332014-03-11 03:39:26 +00001548 void getGCCRegNames(const char * const *&Names,
1549 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001550 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001551 numNames = 0;
1552 }
1553
Craig Topper3164f332014-03-11 03:39:26 +00001554 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1555 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001556 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001557 NumAliases = 0;
1558 }
1559
Craig Topper3164f332014-03-11 03:39:26 +00001560 bool validateAsmConstraint(const char *&Name,
1561 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001562 return true;
1563 }
1564
Craig Topper3164f332014-03-11 03:39:26 +00001565 void getTargetBuiltins(const Builtin::Info *&Records,
1566 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001567 Records = BuiltinInfo;
1568 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001569 }
1570
Craig Topper3164f332014-03-11 03:39:26 +00001571 void getTargetDefines(const LangOptions &Opts,
1572 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001573 Builder.defineMacro("__R600__");
1574 }
1575
Craig Topper3164f332014-03-11 03:39:26 +00001576 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001577 return TargetInfo::CharPtrBuiltinVaList;
1578 }
1579
Craig Topper3164f332014-03-11 03:39:26 +00001580 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001581 GPU = llvm::StringSwitch<GPUKind>(Name)
1582 .Case("r600" , GK_R600)
1583 .Case("rv610", GK_R600)
1584 .Case("rv620", GK_R600)
1585 .Case("rv630", GK_R600)
1586 .Case("rv635", GK_R600)
1587 .Case("rs780", GK_R600)
1588 .Case("rs880", GK_R600)
1589 .Case("rv670", GK_R600_DOUBLE_OPS)
1590 .Case("rv710", GK_R700)
1591 .Case("rv730", GK_R700)
1592 .Case("rv740", GK_R700_DOUBLE_OPS)
1593 .Case("rv770", GK_R700_DOUBLE_OPS)
1594 .Case("palm", GK_EVERGREEN)
1595 .Case("cedar", GK_EVERGREEN)
1596 .Case("sumo", GK_EVERGREEN)
1597 .Case("sumo2", GK_EVERGREEN)
1598 .Case("redwood", GK_EVERGREEN)
1599 .Case("juniper", GK_EVERGREEN)
1600 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1601 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1602 .Case("barts", GK_NORTHERN_ISLANDS)
1603 .Case("turks", GK_NORTHERN_ISLANDS)
1604 .Case("caicos", GK_NORTHERN_ISLANDS)
1605 .Case("cayman", GK_CAYMAN)
1606 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001607 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001608 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1609 .Case("verde", GK_SOUTHERN_ISLANDS)
1610 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001611 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001612 .Case("bonaire", GK_SEA_ISLANDS)
1613 .Case("kabini", GK_SEA_ISLANDS)
1614 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001615 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001616 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001617 .Default(GK_NONE);
1618
1619 if (GPU == GK_NONE) {
1620 return false;
1621 }
1622
1623 // Set the correct data layout
1624 switch (GPU) {
1625 case GK_NONE:
1626 case GK_R600:
1627 case GK_R700:
1628 case GK_EVERGREEN:
1629 case GK_NORTHERN_ISLANDS:
1630 DescriptionString = DescriptionStringR600;
1631 break;
1632 case GK_R600_DOUBLE_OPS:
1633 case GK_R700_DOUBLE_OPS:
1634 case GK_EVERGREEN_DOUBLE_OPS:
1635 case GK_CAYMAN:
1636 DescriptionString = DescriptionStringR600DoubleOps;
1637 break;
1638 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001639 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001640 DescriptionString = DescriptionStringSI;
1641 break;
1642 }
1643
1644 return true;
1645 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001646};
1647
Matt Arsenault56f008d2014-06-24 20:45:01 +00001648const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1649#define BUILTIN(ID, TYPE, ATTRS) \
1650 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1651#include "clang/Basic/BuiltinsR600.def"
1652};
1653
Eli Friedmand13b41e2012-10-12 23:32:00 +00001654} // end anonymous namespace
1655
1656namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001657// Namespace for x86 abstract base class
1658const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001659#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001660#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001661 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001662#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001663};
Eli Friedmanb5366062008-05-20 14:21:01 +00001664
Nuno Lopescfca1f02009-12-23 17:49:57 +00001665static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001666 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1667 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001668 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001669 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1670 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1671 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001672 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001673 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1674 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001675};
1676
Eric Christophercdd36352011-06-21 00:05:20 +00001677const TargetInfo::AddlRegName AddlRegNames[] = {
1678 { { "al", "ah", "eax", "rax" }, 0 },
1679 { { "bl", "bh", "ebx", "rbx" }, 3 },
1680 { { "cl", "ch", "ecx", "rcx" }, 2 },
1681 { { "dl", "dh", "edx", "rdx" }, 1 },
1682 { { "esi", "rsi" }, 4 },
1683 { { "edi", "rdi" }, 5 },
1684 { { "esp", "rsp" }, 7 },
1685 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001686};
1687
1688// X86 target abstract base class; x86-32 and x86-64 are very close, so
1689// most of the implementation can be shared.
1690class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001691 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001692 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001693 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001694 enum MMX3DNowEnum {
1695 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1696 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001697 enum XOPEnum {
1698 NoXOP,
1699 SSE4A,
1700 FMA4,
1701 XOP
1702 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001703
Eric Christophere1ddaf92010-04-02 23:50:19 +00001704 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001705 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001706 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001707 bool HasRDRND;
Craig Topper22967d42011-12-25 05:06:45 +00001708 bool HasBMI;
1709 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001710 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001711 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001712 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001713 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001714 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001715 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001716 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001717 bool HasF16C;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001718 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW, HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001719 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001720 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001721
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001722 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1723 ///
1724 /// Each enumeration represents a particular CPU supported by Clang. These
1725 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1726 enum CPUKind {
1727 CK_Generic,
1728
1729 /// \name i386
1730 /// i386-generation processors.
1731 //@{
1732 CK_i386,
1733 //@}
1734
1735 /// \name i486
1736 /// i486-generation processors.
1737 //@{
1738 CK_i486,
1739 CK_WinChipC6,
1740 CK_WinChip2,
1741 CK_C3,
1742 //@}
1743
1744 /// \name i586
1745 /// i586-generation processors, P5 microarchitecture based.
1746 //@{
1747 CK_i586,
1748 CK_Pentium,
1749 CK_PentiumMMX,
1750 //@}
1751
1752 /// \name i686
1753 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1754 //@{
1755 CK_i686,
1756 CK_PentiumPro,
1757 CK_Pentium2,
1758 CK_Pentium3,
1759 CK_Pentium3M,
1760 CK_PentiumM,
1761 CK_C3_2,
1762
1763 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1764 /// Clang however has some logic to suport this.
1765 // FIXME: Warn, deprecate, and potentially remove this.
1766 CK_Yonah,
1767 //@}
1768
1769 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001770 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001771 //@{
1772 CK_Pentium4,
1773 CK_Pentium4M,
1774 CK_Prescott,
1775 CK_Nocona,
1776 //@}
1777
1778 /// \name Core
1779 /// Core microarchitecture based processors.
1780 //@{
1781 CK_Core2,
1782
1783 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1784 /// codename which GCC no longer accepts as an option to -march, but Clang
1785 /// has some logic for recognizing it.
1786 // FIXME: Warn, deprecate, and potentially remove this.
1787 CK_Penryn,
1788 //@}
1789
1790 /// \name Atom
1791 /// Atom processors
1792 //@{
1793 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001794 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001795 //@}
1796
1797 /// \name Nehalem
1798 /// Nehalem microarchitecture based processors.
1799 //@{
1800 CK_Corei7,
1801 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001802 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001803 CK_CoreAVX2,
Robert Khasanov50e6f582014-09-19 09:53:48 +00001804 CK_Broadwell,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001805 //@}
1806
Craig Topper449314e2013-08-20 07:09:39 +00001807 /// \name Knights Landing
1808 /// Knights Landing processor.
1809 CK_KNL,
1810
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001811 /// \name Skylake Server
1812 /// Skylake server processor.
1813 CK_SKX,
1814
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001815 /// \name K6
1816 /// K6 architecture processors.
1817 //@{
1818 CK_K6,
1819 CK_K6_2,
1820 CK_K6_3,
1821 //@}
1822
1823 /// \name K7
1824 /// K7 architecture processors.
1825 //@{
1826 CK_Athlon,
1827 CK_AthlonThunderbird,
1828 CK_Athlon4,
1829 CK_AthlonXP,
1830 CK_AthlonMP,
1831 //@}
1832
1833 /// \name K8
1834 /// K8 architecture processors.
1835 //@{
1836 CK_Athlon64,
1837 CK_Athlon64SSE3,
1838 CK_AthlonFX,
1839 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001840 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001841 CK_Opteron,
1842 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001843 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001844 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001845
Benjamin Kramer569f2152012-01-10 11:50:18 +00001846 /// \name Bobcat
1847 /// Bobcat architecture processors.
1848 //@{
1849 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001850 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001851 //@}
1852
1853 /// \name Bulldozer
1854 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001855 //@{
1856 CK_BDVER1,
1857 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001858 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001859 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001860 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001861
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001862 /// This specification is deprecated and will be removed in the future.
1863 /// Users should prefer \see CK_K8.
1864 // FIXME: Warn on this when the CPU is set to it.
1865 CK_x86_64,
1866 //@}
1867
1868 /// \name Geode
1869 /// Geode processors.
1870 //@{
1871 CK_Geode
1872 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001873 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001874
Rafael Espindolaeb265472013-08-21 21:59:03 +00001875 enum FPMathKind {
1876 FP_Default,
1877 FP_SSE,
1878 FP_387
1879 } FPMath;
1880
Eli Friedman3fd920a2008-08-20 02:34:37 +00001881public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001882 X86TargetInfo(const llvm::Triple &Triple)
1883 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001884 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1885 HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false),
Robert Khasanov50e6f582014-09-19 09:53:48 +00001886 HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasADX(false),
1887 HasTBM(false), HasFMA(false), HasF16C(false), HasAVX512CD(false),
1888 HasAVX512ER(false), HasAVX512PF(false), HasAVX512DQ(false),
1889 HasAVX512BW(false), HasAVX512VL(false), HasSHA(false), HasCX16(false),
1890 CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001891 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001892 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001893 }
Craig Topper3164f332014-03-11 03:39:26 +00001894 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001895 // X87 evaluates with 80 bits "long double" precision.
1896 return SSELevel == NoSSE ? 2 : 0;
1897 }
Craig Topper3164f332014-03-11 03:39:26 +00001898 void getTargetBuiltins(const Builtin::Info *&Records,
1899 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001900 Records = BuiltinInfo;
1901 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001902 }
Craig Topper3164f332014-03-11 03:39:26 +00001903 void getGCCRegNames(const char * const *&Names,
1904 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001905 Names = GCCRegNames;
1906 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001907 }
Craig Topper3164f332014-03-11 03:39:26 +00001908 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1909 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001910 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00001911 NumAliases = 0;
1912 }
Craig Topper3164f332014-03-11 03:39:26 +00001913 void getGCCAddlRegNames(const AddlRegName *&Names,
1914 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001915 Names = AddlRegNames;
1916 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001917 }
Craig Topper3164f332014-03-11 03:39:26 +00001918 bool validateAsmConstraint(const char *&Name,
1919 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00001920
Akira Hatanaka974131e2014-09-18 18:17:18 +00001921 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
1922
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00001923 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
1924
Akira Hatanaka974131e2014-09-18 18:17:18 +00001925 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
1926
Craig Topper3164f332014-03-11 03:39:26 +00001927 std::string convertConstraint(const char *&Constraint) const override;
1928 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001929 return "~{dirflag},~{fpsr},~{flags}";
1930 }
Craig Topper3164f332014-03-11 03:39:26 +00001931 void getTargetDefines(const LangOptions &Opts,
1932 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001933 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1934 bool Enabled);
1935 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1936 bool Enabled);
1937 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1938 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001939 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1940 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00001941 setFeatureEnabledImpl(Features, Name, Enabled);
1942 }
1943 // This exists purely to cut down on the number of virtual calls in
1944 // getDefaultFeatures which calls this repeatedly.
1945 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1946 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001947 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1948 bool hasFeature(StringRef Feature) const override;
1949 bool handleTargetFeatures(std::vector<std::string> &Features,
1950 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00001951 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001952 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001953 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001954 else if (getTriple().getArch() == llvm::Triple::x86 &&
1955 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001956 return "no-mmx";
1957 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001958 }
Craig Topper3164f332014-03-11 03:39:26 +00001959 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00001960 CPU = llvm::StringSwitch<CPUKind>(Name)
1961 .Case("i386", CK_i386)
1962 .Case("i486", CK_i486)
1963 .Case("winchip-c6", CK_WinChipC6)
1964 .Case("winchip2", CK_WinChip2)
1965 .Case("c3", CK_C3)
1966 .Case("i586", CK_i586)
1967 .Case("pentium", CK_Pentium)
1968 .Case("pentium-mmx", CK_PentiumMMX)
1969 .Case("i686", CK_i686)
1970 .Case("pentiumpro", CK_PentiumPro)
1971 .Case("pentium2", CK_Pentium2)
1972 .Case("pentium3", CK_Pentium3)
1973 .Case("pentium3m", CK_Pentium3M)
1974 .Case("pentium-m", CK_PentiumM)
1975 .Case("c3-2", CK_C3_2)
1976 .Case("yonah", CK_Yonah)
1977 .Case("pentium4", CK_Pentium4)
1978 .Case("pentium4m", CK_Pentium4M)
1979 .Case("prescott", CK_Prescott)
1980 .Case("nocona", CK_Nocona)
1981 .Case("core2", CK_Core2)
1982 .Case("penryn", CK_Penryn)
1983 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001984 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001985 .Case("corei7", CK_Corei7)
1986 .Case("corei7-avx", CK_Corei7AVX)
1987 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001988 .Case("core-avx2", CK_CoreAVX2)
Robert Khasanov50e6f582014-09-19 09:53:48 +00001989 .Case("broadwell", CK_Broadwell)
Craig Topper449314e2013-08-20 07:09:39 +00001990 .Case("knl", CK_KNL)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001991 .Case("skx", CK_SKX)
Chandler Carruth212334f2011-09-28 08:55:37 +00001992 .Case("k6", CK_K6)
1993 .Case("k6-2", CK_K6_2)
1994 .Case("k6-3", CK_K6_3)
1995 .Case("athlon", CK_Athlon)
1996 .Case("athlon-tbird", CK_AthlonThunderbird)
1997 .Case("athlon-4", CK_Athlon4)
1998 .Case("athlon-xp", CK_AthlonXP)
1999 .Case("athlon-mp", CK_AthlonMP)
2000 .Case("athlon64", CK_Athlon64)
2001 .Case("athlon64-sse3", CK_Athlon64SSE3)
2002 .Case("athlon-fx", CK_AthlonFX)
2003 .Case("k8", CK_K8)
2004 .Case("k8-sse3", CK_K8SSE3)
2005 .Case("opteron", CK_Opteron)
2006 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002007 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002008 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002009 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002010 .Case("bdver1", CK_BDVER1)
2011 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002012 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002013 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002014 .Case("x86-64", CK_x86_64)
2015 .Case("geode", CK_Geode)
2016 .Default(CK_Generic);
2017
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002018 // Perform any per-CPU checks necessary to determine if this CPU is
2019 // acceptable.
2020 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2021 // invalid without explaining *why*.
2022 switch (CPU) {
2023 case CK_Generic:
2024 // No processor selected!
2025 return false;
2026
2027 case CK_i386:
2028 case CK_i486:
2029 case CK_WinChipC6:
2030 case CK_WinChip2:
2031 case CK_C3:
2032 case CK_i586:
2033 case CK_Pentium:
2034 case CK_PentiumMMX:
2035 case CK_i686:
2036 case CK_PentiumPro:
2037 case CK_Pentium2:
2038 case CK_Pentium3:
2039 case CK_Pentium3M:
2040 case CK_PentiumM:
2041 case CK_Yonah:
2042 case CK_C3_2:
2043 case CK_Pentium4:
2044 case CK_Pentium4M:
2045 case CK_Prescott:
2046 case CK_K6:
2047 case CK_K6_2:
2048 case CK_K6_3:
2049 case CK_Athlon:
2050 case CK_AthlonThunderbird:
2051 case CK_Athlon4:
2052 case CK_AthlonXP:
2053 case CK_AthlonMP:
2054 case CK_Geode:
2055 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002056 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002057 return false;
2058
2059 // Fallthrough
2060 case CK_Nocona:
2061 case CK_Core2:
2062 case CK_Penryn:
2063 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00002064 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002065 case CK_Corei7:
2066 case CK_Corei7AVX:
2067 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002068 case CK_CoreAVX2:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002069 case CK_Broadwell:
Craig Topper449314e2013-08-20 07:09:39 +00002070 case CK_KNL:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002071 case CK_SKX:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002072 case CK_Athlon64:
2073 case CK_Athlon64SSE3:
2074 case CK_AthlonFX:
2075 case CK_K8:
2076 case CK_K8SSE3:
2077 case CK_Opteron:
2078 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002079 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002080 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002081 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002082 case CK_BDVER1:
2083 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002084 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002085 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002086 case CK_x86_64:
2087 return true;
2088 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002089 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002090 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002091
Craig Topper3164f332014-03-11 03:39:26 +00002092 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002093
Craig Topper3164f332014-03-11 03:39:26 +00002094 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002095 // We accept all non-ARM calling conventions
2096 return (CC == CC_X86ThisCall ||
2097 CC == CC_X86FastCall ||
Peter Collingbourne47f9f2d2013-02-23 00:06:18 +00002098 CC == CC_X86StdCall ||
2099 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002100 CC == CC_X86Pascal ||
2101 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002102 }
2103
Craig Topper3164f332014-03-11 03:39:26 +00002104 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002105 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002106 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002107};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002108
Rafael Espindolaeb265472013-08-21 21:59:03 +00002109bool X86TargetInfo::setFPMath(StringRef Name) {
2110 if (Name == "387") {
2111 FPMath = FP_387;
2112 return true;
2113 }
2114 if (Name == "sse") {
2115 FPMath = FP_SSE;
2116 return true;
2117 }
2118 return false;
2119}
2120
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002121void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002122 // FIXME: This *really* should not be here.
2123
2124 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002125 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002126 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002127
Chandler Carruth212334f2011-09-28 08:55:37 +00002128 switch (CPU) {
2129 case CK_Generic:
2130 case CK_i386:
2131 case CK_i486:
2132 case CK_i586:
2133 case CK_Pentium:
2134 case CK_i686:
2135 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002136 break;
2137 case CK_PentiumMMX:
2138 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002139 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002140 break;
2141 case CK_Pentium3:
2142 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002143 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002144 break;
2145 case CK_PentiumM:
2146 case CK_Pentium4:
2147 case CK_Pentium4M:
2148 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002149 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002150 break;
2151 case CK_Yonah:
2152 case CK_Prescott:
2153 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002154 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002155 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002156 break;
2157 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002158 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002159 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002160 break;
2161 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002162 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002163 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002164 break;
2165 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002166 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002167 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002168 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002169 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002170 setFeatureEnabledImpl(Features, "sse4.2", true);
2171 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002172 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002173 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002174 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002175 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002176 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002177 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002178 break;
2179 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002180 setFeatureEnabledImpl(Features, "avx", true);
2181 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002182 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002183 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002184 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002185 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002186 setFeatureEnabledImpl(Features, "avx", true);
2187 setFeatureEnabledImpl(Features, "aes", true);
2188 setFeatureEnabledImpl(Features, "pclmul", true);
2189 setFeatureEnabledImpl(Features, "rdrnd", true);
2190 setFeatureEnabledImpl(Features, "f16c", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002191 break;
Craig Topper865fff52011-12-17 19:55:21 +00002192 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002193 setFeatureEnabledImpl(Features, "avx2", true);
2194 setFeatureEnabledImpl(Features, "aes", true);
2195 setFeatureEnabledImpl(Features, "pclmul", true);
2196 setFeatureEnabledImpl(Features, "lzcnt", true);
2197 setFeatureEnabledImpl(Features, "rdrnd", true);
2198 setFeatureEnabledImpl(Features, "f16c", true);
2199 setFeatureEnabledImpl(Features, "bmi", true);
2200 setFeatureEnabledImpl(Features, "bmi2", true);
2201 setFeatureEnabledImpl(Features, "rtm", true);
2202 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002203 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002204 break;
Robert Khasanov50e6f582014-09-19 09:53:48 +00002205 case CK_Broadwell:
2206 setFeatureEnabledImpl(Features, "avx2", true);
2207 setFeatureEnabledImpl(Features, "aes", true);
2208 setFeatureEnabledImpl(Features, "pclmul", true);
2209 setFeatureEnabledImpl(Features, "lzcnt", true);
2210 setFeatureEnabledImpl(Features, "rdrnd", true);
2211 setFeatureEnabledImpl(Features, "f16c", true);
2212 setFeatureEnabledImpl(Features, "bmi", true);
2213 setFeatureEnabledImpl(Features, "bmi2", true);
2214 setFeatureEnabledImpl(Features, "rtm", true);
2215 setFeatureEnabledImpl(Features, "fma", true);
2216 setFeatureEnabledImpl(Features, "cx16", true);
2217 setFeatureEnabledImpl(Features, "rdseed", true);
2218 setFeatureEnabledImpl(Features, "adx", true);
2219 break;
Craig Topper449314e2013-08-20 07:09:39 +00002220 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002221 setFeatureEnabledImpl(Features, "avx512f", true);
2222 setFeatureEnabledImpl(Features, "avx512cd", true);
2223 setFeatureEnabledImpl(Features, "avx512er", true);
2224 setFeatureEnabledImpl(Features, "avx512pf", true);
2225 setFeatureEnabledImpl(Features, "aes", true);
2226 setFeatureEnabledImpl(Features, "pclmul", true);
2227 setFeatureEnabledImpl(Features, "lzcnt", true);
2228 setFeatureEnabledImpl(Features, "rdrnd", true);
2229 setFeatureEnabledImpl(Features, "f16c", true);
2230 setFeatureEnabledImpl(Features, "bmi", true);
2231 setFeatureEnabledImpl(Features, "bmi2", true);
2232 setFeatureEnabledImpl(Features, "rtm", true);
2233 setFeatureEnabledImpl(Features, "fma", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002234 setFeatureEnabledImpl(Features, "rdseed", true);
2235 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper449314e2013-08-20 07:09:39 +00002236 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002237 case CK_SKX:
2238 setFeatureEnabledImpl(Features, "avx512f", true);
2239 setFeatureEnabledImpl(Features, "avx512cd", true);
2240 setFeatureEnabledImpl(Features, "avx512dq", true);
2241 setFeatureEnabledImpl(Features, "avx512bw", true);
2242 setFeatureEnabledImpl(Features, "avx512vl", true);
2243 setFeatureEnabledImpl(Features, "aes", true);
2244 setFeatureEnabledImpl(Features, "pclmul", true);
2245 setFeatureEnabledImpl(Features, "lzcnt", true);
2246 setFeatureEnabledImpl(Features, "rdrnd", true);
2247 setFeatureEnabledImpl(Features, "f16c", true);
2248 setFeatureEnabledImpl(Features, "bmi", true);
2249 setFeatureEnabledImpl(Features, "bmi2", true);
2250 setFeatureEnabledImpl(Features, "rtm", true);
2251 setFeatureEnabledImpl(Features, "fma", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002252 setFeatureEnabledImpl(Features, "rdseed", true);
2253 setFeatureEnabledImpl(Features, "adx", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002254 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002255 case CK_K6:
2256 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002257 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002258 break;
2259 case CK_K6_2:
2260 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002261 case CK_WinChip2:
2262 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002263 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002264 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002265 case CK_Athlon:
2266 case CK_AthlonThunderbird:
2267 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002268 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002269 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002270 case CK_Athlon4:
2271 case CK_AthlonXP:
2272 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002273 setFeatureEnabledImpl(Features, "sse", true);
2274 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002275 break;
2276 case CK_K8:
2277 case CK_Opteron:
2278 case CK_Athlon64:
2279 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002280 setFeatureEnabledImpl(Features, "sse2", true);
2281 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002282 break;
2283 case CK_K8SSE3:
2284 case CK_OpteronSSE3:
2285 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002286 setFeatureEnabledImpl(Features, "sse3", true);
2287 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002288 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002289 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002290 setFeatureEnabledImpl(Features, "sse3", true);
2291 setFeatureEnabledImpl(Features, "sse4a", true);
2292 setFeatureEnabledImpl(Features, "3dnowa", true);
2293 setFeatureEnabledImpl(Features, "lzcnt", true);
2294 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002295 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002296 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002297 setFeatureEnabledImpl(Features, "ssse3", true);
2298 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002299 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002300 setFeatureEnabledImpl(Features, "lzcnt", true);
2301 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002302 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002303 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002304 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002305 setFeatureEnabledImpl(Features, "avx", true);
2306 setFeatureEnabledImpl(Features, "sse4a", true);
2307 setFeatureEnabledImpl(Features, "lzcnt", true);
2308 setFeatureEnabledImpl(Features, "aes", true);
2309 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002310 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002311 setFeatureEnabledImpl(Features, "bmi", true);
2312 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002313 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002314 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002315 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002316 setFeatureEnabledImpl(Features, "xop", true);
2317 setFeatureEnabledImpl(Features, "lzcnt", true);
2318 setFeatureEnabledImpl(Features, "aes", true);
2319 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002320 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002321 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002322 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002323 case CK_BDVER4:
2324 setFeatureEnabledImpl(Features, "avx2", true);
2325 setFeatureEnabledImpl(Features, "bmi2", true);
2326 // FALLTHROUGH
Eli Friedman3e94f572012-11-17 01:43:10 +00002327 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002328 case CK_BDVER3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002329 setFeatureEnabledImpl(Features, "xop", true);
2330 setFeatureEnabledImpl(Features, "lzcnt", true);
2331 setFeatureEnabledImpl(Features, "aes", true);
2332 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002333 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002334 setFeatureEnabledImpl(Features, "bmi", true);
2335 setFeatureEnabledImpl(Features, "fma", true);
2336 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002337 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002338 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002339 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002340 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002341 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002342 break;
Eli Friedman33465822011-07-08 23:31:17 +00002343 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002344}
2345
Rafael Espindolae62e2792013-08-20 13:44:29 +00002346void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002347 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002348 if (Enabled) {
2349 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002350 case AVX512F:
2351 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002352 case AVX2:
2353 Features["avx2"] = true;
2354 case AVX:
2355 Features["avx"] = true;
2356 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002357 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002358 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002359 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002360 case SSSE3:
2361 Features["ssse3"] = true;
2362 case SSE3:
2363 Features["sse3"] = true;
2364 case SSE2:
2365 Features["sse2"] = true;
2366 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002367 Features["sse"] = true;
2368 case NoSSE:
2369 break;
2370 }
2371 return;
2372 }
2373
2374 switch (Level) {
2375 case NoSSE:
2376 case SSE1:
2377 Features["sse"] = false;
2378 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002379 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2380 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002381 case SSE3:
2382 Features["sse3"] = false;
2383 setXOPLevel(Features, NoXOP, false);
2384 case SSSE3:
2385 Features["ssse3"] = false;
2386 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002387 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002388 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002389 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002390 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002391 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002392 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002393 case AVX2:
2394 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002395 case AVX512F:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002396 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] = Features["avx512pf"] =
2397 Features["avx512dq"] = Features["avx512bw"] = Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002398 }
2399}
2400
2401void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002402 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002403 if (Enabled) {
2404 switch (Level) {
2405 case AMD3DNowAthlon:
2406 Features["3dnowa"] = true;
2407 case AMD3DNow:
2408 Features["3dnow"] = true;
2409 case MMX:
2410 Features["mmx"] = true;
2411 case NoMMX3DNow:
2412 break;
2413 }
2414 return;
2415 }
2416
2417 switch (Level) {
2418 case NoMMX3DNow:
2419 case MMX:
2420 Features["mmx"] = false;
2421 case AMD3DNow:
2422 Features["3dnow"] = false;
2423 case AMD3DNowAthlon:
2424 Features["3dnowa"] = false;
2425 }
2426}
2427
2428void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002429 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002430 if (Enabled) {
2431 switch (Level) {
2432 case XOP:
2433 Features["xop"] = true;
2434 case FMA4:
2435 Features["fma4"] = true;
2436 setSSELevel(Features, AVX, true);
2437 case SSE4A:
2438 Features["sse4a"] = true;
2439 setSSELevel(Features, SSE3, true);
2440 case NoXOP:
2441 break;
2442 }
2443 return;
2444 }
2445
2446 switch (Level) {
2447 case NoXOP:
2448 case SSE4A:
2449 Features["sse4a"] = false;
2450 case FMA4:
2451 Features["fma4"] = false;
2452 case XOP:
2453 Features["xop"] = false;
2454 }
2455}
2456
Craig Topper86d79ef2013-09-17 04:51:29 +00002457void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2458 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002459 // FIXME: This *really* should not be here. We need some way of translating
2460 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002461 if (Name == "sse4")
2462 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002463
Rafael Espindolae62e2792013-08-20 13:44:29 +00002464 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002465
Craig Topper29561122013-09-19 01:13:07 +00002466 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002467 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002468 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002469 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002470 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002471 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002472 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002473 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002474 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002475 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002476 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002477 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002478 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002479 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002480 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002481 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002482 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002483 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002484 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002485 if (Enabled)
2486 setSSELevel(Features, SSE2, Enabled);
2487 } else if (Name == "pclmul") {
2488 if (Enabled)
2489 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002490 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002491 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002492 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002493 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002494 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002495 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002496 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2497 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002498 if (Enabled)
2499 setSSELevel(Features, AVX512F, Enabled);
2500 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002501 if (Enabled)
2502 setSSELevel(Features, AVX, Enabled);
2503 } else if (Name == "fma4") {
2504 setXOPLevel(Features, FMA4, Enabled);
2505 } else if (Name == "xop") {
2506 setXOPLevel(Features, XOP, Enabled);
2507 } else if (Name == "sse4a") {
2508 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002509 } else if (Name == "f16c") {
2510 if (Enabled)
2511 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002512 } else if (Name == "sha") {
2513 if (Enabled)
2514 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002515 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002516}
2517
Eric Christopher3ff21b32013-10-16 21:26:26 +00002518/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002519/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002520bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002521 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002522 // Remember the maximum enabled sselevel.
2523 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2524 // Ignore disabled features.
2525 if (Features[i][0] == '-')
2526 continue;
2527
Benjamin Kramer27402c62012-03-05 15:10:44 +00002528 StringRef Feature = StringRef(Features[i]).substr(1);
2529
2530 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002531 HasAES = true;
2532 continue;
2533 }
2534
Craig Topper3f122a72012-05-31 05:18:48 +00002535 if (Feature == "pclmul") {
2536 HasPCLMUL = true;
2537 continue;
2538 }
2539
Benjamin Kramer27402c62012-03-05 15:10:44 +00002540 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002541 HasLZCNT = true;
2542 continue;
2543 }
2544
Rafael Espindola89049822013-08-23 20:21:37 +00002545 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002546 HasRDRND = true;
2547 continue;
2548 }
2549
Benjamin Kramer27402c62012-03-05 15:10:44 +00002550 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002551 HasBMI = true;
2552 continue;
2553 }
2554
Benjamin Kramer27402c62012-03-05 15:10:44 +00002555 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002556 HasBMI2 = true;
2557 continue;
2558 }
2559
Benjamin Kramer27402c62012-03-05 15:10:44 +00002560 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002561 HasPOPCNT = true;
2562 continue;
2563 }
2564
Michael Liao625a8752012-11-10 05:17:46 +00002565 if (Feature == "rtm") {
2566 HasRTM = true;
2567 continue;
2568 }
2569
Michael Liao74f4eaf2013-03-26 17:52:08 +00002570 if (Feature == "prfchw") {
2571 HasPRFCHW = true;
2572 continue;
2573 }
2574
Michael Liaoffaae352013-03-29 05:17:55 +00002575 if (Feature == "rdseed") {
2576 HasRDSEED = true;
2577 continue;
2578 }
2579
Robert Khasanov50e6f582014-09-19 09:53:48 +00002580 if (Feature == "adx") {
2581 HasADX = true;
2582 continue;
2583 }
2584
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002585 if (Feature == "tbm") {
2586 HasTBM = true;
2587 continue;
2588 }
2589
Craig Topperbba778b2012-06-03 21:46:30 +00002590 if (Feature == "fma") {
2591 HasFMA = true;
2592 continue;
2593 }
2594
Manman Rena45358c2012-10-11 00:59:55 +00002595 if (Feature == "f16c") {
2596 HasF16C = true;
2597 continue;
2598 }
2599
Craig Topper679b53a2013-08-21 05:29:10 +00002600 if (Feature == "avx512cd") {
2601 HasAVX512CD = true;
2602 continue;
2603 }
2604
2605 if (Feature == "avx512er") {
2606 HasAVX512ER = true;
2607 continue;
2608 }
2609
2610 if (Feature == "avx512pf") {
2611 HasAVX512PF = true;
2612 continue;
2613 }
2614
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002615 if (Feature == "avx512dq") {
2616 HasAVX512DQ = true;
2617 continue;
2618 }
2619
2620 if (Feature == "avx512bw") {
2621 HasAVX512BW = true;
2622 continue;
2623 }
2624
2625 if (Feature == "avx512vl") {
2626 HasAVX512VL = true;
2627 continue;
2628 }
2629
Ben Langmuir58078d02013-09-19 13:22:04 +00002630 if (Feature == "sha") {
2631 HasSHA = true;
2632 continue;
2633 }
2634
Nick Lewycky50e8f482013-10-05 20:14:27 +00002635 if (Feature == "cx16") {
2636 HasCX16 = true;
2637 continue;
2638 }
2639
Daniel Dunbar979586e2009-11-11 09:38:56 +00002640 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002641 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002642 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002643 .Case("avx2", AVX2)
2644 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002645 .Case("sse4.2", SSE42)
2646 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002647 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002648 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002649 .Case("sse2", SSE2)
2650 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002651 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002652 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002653
Eli Friedman33465822011-07-08 23:31:17 +00002654 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002655 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002656 .Case("3dnowa", AMD3DNowAthlon)
2657 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002658 .Case("mmx", MMX)
2659 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002660 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002661
2662 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2663 .Case("xop", XOP)
2664 .Case("fma4", FMA4)
2665 .Case("sse4a", SSE4A)
2666 .Default(NoXOP);
2667 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002668 }
Eli Friedman33465822011-07-08 23:31:17 +00002669
Craig Topper7481d8a2013-09-10 06:55:47 +00002670 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2671 // Can't do this earlier because we need to be able to explicitly enable
2672 // popcnt and still disable sse4.2.
2673 if (!HasPOPCNT && SSELevel >= SSE42 &&
2674 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2675 HasPOPCNT = true;
2676 Features.push_back("+popcnt");
2677 }
2678
Yunzhong Gao61089362013-10-16 19:07:02 +00002679 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2680 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2681 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2682 HasPRFCHW = true;
2683 Features.push_back("+prfchw");
2684 }
2685
Rafael Espindolaeb265472013-08-21 21:59:03 +00002686 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2687 // matches the selected sse level.
2688 if (FPMath == FP_SSE && SSELevel < SSE1) {
2689 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2690 return false;
2691 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2692 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2693 return false;
2694 }
2695
Eli Friedman33465822011-07-08 23:31:17 +00002696 // Don't tell the backend if we're turning off mmx; it will end up disabling
2697 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002698 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2699 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002700 std::vector<std::string>::iterator it;
2701 it = std::find(Features.begin(), Features.end(), "-mmx");
2702 if (it != Features.end())
2703 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002704 else if (SSELevel > NoSSE)
2705 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002706 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002707}
Chris Lattnerecd49032009-03-02 22:27:17 +00002708
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002709/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2710/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002711void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002712 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002713 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002714 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002715 Builder.defineMacro("__amd64__");
2716 Builder.defineMacro("__amd64");
2717 Builder.defineMacro("__x86_64");
2718 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002719 if (getTriple().getArchName() == "x86_64h") {
2720 Builder.defineMacro("__x86_64h");
2721 Builder.defineMacro("__x86_64h__");
2722 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002723 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002724 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002725 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002726
Chris Lattnerecd49032009-03-02 22:27:17 +00002727 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002728 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2729 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002730 switch (CPU) {
2731 case CK_Generic:
2732 break;
2733 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002734 // The rest are coming from the i386 define above.
2735 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002736 break;
2737 case CK_i486:
2738 case CK_WinChipC6:
2739 case CK_WinChip2:
2740 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002741 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002742 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002743 case CK_PentiumMMX:
2744 Builder.defineMacro("__pentium_mmx__");
2745 Builder.defineMacro("__tune_pentium_mmx__");
2746 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002747 case CK_i586:
2748 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002749 defineCPUMacros(Builder, "i586");
2750 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002751 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002752 case CK_Pentium3:
2753 case CK_Pentium3M:
2754 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002755 Builder.defineMacro("__tune_pentium3__");
2756 // Fallthrough
2757 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002758 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002759 Builder.defineMacro("__tune_pentium2__");
2760 // Fallthrough
2761 case CK_PentiumPro:
2762 Builder.defineMacro("__tune_i686__");
2763 Builder.defineMacro("__tune_pentiumpro__");
2764 // Fallthrough
2765 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002766 Builder.defineMacro("__i686");
2767 Builder.defineMacro("__i686__");
2768 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2769 Builder.defineMacro("__pentiumpro");
2770 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002771 break;
2772 case CK_Pentium4:
2773 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002774 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002775 break;
2776 case CK_Yonah:
2777 case CK_Prescott:
2778 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002779 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002780 break;
2781 case CK_Core2:
2782 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002783 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002784 break;
2785 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002786 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002787 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002788 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002789 defineCPUMacros(Builder, "slm");
2790 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002791 case CK_Corei7:
2792 case CK_Corei7AVX:
2793 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002794 case CK_CoreAVX2:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002795 case CK_Broadwell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002796 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002797 break;
Craig Topper449314e2013-08-20 07:09:39 +00002798 case CK_KNL:
2799 defineCPUMacros(Builder, "knl");
2800 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002801 case CK_SKX:
2802 defineCPUMacros(Builder, "skx");
2803 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002804 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002805 Builder.defineMacro("__k6_2__");
2806 Builder.defineMacro("__tune_k6_2__");
2807 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002808 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002809 if (CPU != CK_K6_2) { // In case of fallthrough
2810 // FIXME: GCC may be enabling these in cases where some other k6
2811 // architecture is specified but -m3dnow is explicitly provided. The
2812 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002813 Builder.defineMacro("__k6_3__");
2814 Builder.defineMacro("__tune_k6_3__");
2815 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002816 // Fallthrough
2817 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002818 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002819 break;
2820 case CK_Athlon:
2821 case CK_AthlonThunderbird:
2822 case CK_Athlon4:
2823 case CK_AthlonXP:
2824 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002825 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002826 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002827 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002828 Builder.defineMacro("__tune_athlon_sse__");
2829 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002830 break;
2831 case CK_K8:
2832 case CK_K8SSE3:
2833 case CK_x86_64:
2834 case CK_Opteron:
2835 case CK_OpteronSSE3:
2836 case CK_Athlon64:
2837 case CK_Athlon64SSE3:
2838 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002839 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002840 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002841 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002842 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002843 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002844 case CK_BTVER1:
2845 defineCPUMacros(Builder, "btver1");
2846 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002847 case CK_BTVER2:
2848 defineCPUMacros(Builder, "btver2");
2849 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002850 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002851 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002852 break;
2853 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002854 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002855 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002856 case CK_BDVER3:
2857 defineCPUMacros(Builder, "bdver3");
2858 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002859 case CK_BDVER4:
2860 defineCPUMacros(Builder, "bdver4");
2861 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002862 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002863 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002864 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002865 }
Chris Lattner96e43572009-03-02 22:40:39 +00002866
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002867 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002868 Builder.defineMacro("__REGISTER_PREFIX__", "");
2869
Chris Lattner6df41af2009-04-19 17:32:33 +00002870 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2871 // functions in glibc header files that use FP Stack inline asm which the
2872 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002873 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002874
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002875 if (HasAES)
2876 Builder.defineMacro("__AES__");
2877
Craig Topper3f122a72012-05-31 05:18:48 +00002878 if (HasPCLMUL)
2879 Builder.defineMacro("__PCLMUL__");
2880
Craig Topper22967d42011-12-25 05:06:45 +00002881 if (HasLZCNT)
2882 Builder.defineMacro("__LZCNT__");
2883
Benjamin Kramer1e250392012-07-07 09:39:18 +00002884 if (HasRDRND)
2885 Builder.defineMacro("__RDRND__");
2886
Craig Topper22967d42011-12-25 05:06:45 +00002887 if (HasBMI)
2888 Builder.defineMacro("__BMI__");
2889
2890 if (HasBMI2)
2891 Builder.defineMacro("__BMI2__");
2892
Craig Topper1de83482011-12-29 16:10:46 +00002893 if (HasPOPCNT)
2894 Builder.defineMacro("__POPCNT__");
2895
Michael Liao625a8752012-11-10 05:17:46 +00002896 if (HasRTM)
2897 Builder.defineMacro("__RTM__");
2898
Michael Liao74f4eaf2013-03-26 17:52:08 +00002899 if (HasPRFCHW)
2900 Builder.defineMacro("__PRFCHW__");
2901
Michael Liaoffaae352013-03-29 05:17:55 +00002902 if (HasRDSEED)
2903 Builder.defineMacro("__RDSEED__");
2904
Robert Khasanov50e6f582014-09-19 09:53:48 +00002905 if (HasADX)
2906 Builder.defineMacro("__ADX__");
2907
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002908 if (HasTBM)
2909 Builder.defineMacro("__TBM__");
2910
Rafael Espindolae62e2792013-08-20 13:44:29 +00002911 switch (XOPLevel) {
2912 case XOP:
2913 Builder.defineMacro("__XOP__");
2914 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002915 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002916 case SSE4A:
2917 Builder.defineMacro("__SSE4A__");
2918 case NoXOP:
2919 break;
2920 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002921
Craig Topperbba778b2012-06-03 21:46:30 +00002922 if (HasFMA)
2923 Builder.defineMacro("__FMA__");
2924
Manman Rena45358c2012-10-11 00:59:55 +00002925 if (HasF16C)
2926 Builder.defineMacro("__F16C__");
2927
Craig Topper679b53a2013-08-21 05:29:10 +00002928 if (HasAVX512CD)
2929 Builder.defineMacro("__AVX512CD__");
2930 if (HasAVX512ER)
2931 Builder.defineMacro("__AVX512ER__");
2932 if (HasAVX512PF)
2933 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002934 if (HasAVX512DQ)
2935 Builder.defineMacro("__AVX512DQ__");
2936 if (HasAVX512BW)
2937 Builder.defineMacro("__AVX512BW__");
2938 if (HasAVX512VL)
2939 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00002940
Ben Langmuir58078d02013-09-19 13:22:04 +00002941 if (HasSHA)
2942 Builder.defineMacro("__SHA__");
2943
Nick Lewycky50e8f482013-10-05 20:14:27 +00002944 if (HasCX16)
2945 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2946
Chris Lattner96e43572009-03-02 22:40:39 +00002947 // Each case falls through to the previous one here.
2948 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002949 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002950 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002951 case AVX2:
2952 Builder.defineMacro("__AVX2__");
2953 case AVX:
2954 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002955 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002956 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002957 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002958 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002959 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002960 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002961 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002962 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002963 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002964 Builder.defineMacro("__SSE2__");
2965 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002966 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002967 Builder.defineMacro("__SSE__");
2968 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002969 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002970 break;
2971 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002972
Derek Schuffc7dd7222012-10-11 15:52:22 +00002973 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002974 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002975 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002976 case AVX2:
2977 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002978 case SSE42:
2979 case SSE41:
2980 case SSSE3:
2981 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002982 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002983 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002984 break;
2985 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002986 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002987 break;
2988 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002989 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002990 }
2991 }
2992
Anders Carlssone437c682010-01-27 03:47:49 +00002993 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00002994 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00002995 case AMD3DNowAthlon:
2996 Builder.defineMacro("__3dNOW_A__");
2997 case AMD3DNow:
2998 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00002999 case MMX:
3000 Builder.defineMacro("__MMX__");
3001 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003002 break;
3003 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003004
3005 if (CPU >= CK_i486) {
3006 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3007 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3008 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3009 }
3010 if (CPU >= CK_i586)
3011 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003012}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003013
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003014bool X86TargetInfo::hasFeature(StringRef Feature) const {
3015 return llvm::StringSwitch<bool>(Feature)
3016 .Case("aes", HasAES)
3017 .Case("avx", SSELevel >= AVX)
3018 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003019 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003020 .Case("avx512cd", HasAVX512CD)
3021 .Case("avx512er", HasAVX512ER)
3022 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003023 .Case("avx512dq", HasAVX512DQ)
3024 .Case("avx512bw", HasAVX512BW)
3025 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003026 .Case("bmi", HasBMI)
3027 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003028 .Case("cx16", HasCX16)
3029 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003030 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003031 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003032 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003033 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00003034 .Case("rdrnd", HasRDRND)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003035 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3036 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3037 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003038 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003039 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00003040 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003041 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00003042 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00003043 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003044 .Case("sse", SSELevel >= SSE1)
3045 .Case("sse2", SSELevel >= SSE2)
3046 .Case("sse3", SSELevel >= SSE3)
3047 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003048 .Case("sse4.1", SSELevel >= SSE41)
3049 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003050 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003051 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003052 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3053 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003054 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003055 .Default(false);
3056}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003057
Eli Friedman3fd920a2008-08-20 02:34:37 +00003058bool
Anders Carlsson58436352009-02-28 17:11:49 +00003059X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003060 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003061 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003062 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00003063 case 'Y': // first letter of a pair:
3064 switch (*(Name+1)) {
3065 default: return false;
3066 case '0': // First SSE register.
3067 case 't': // Any SSE register, when SSE2 is enabled.
3068 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3069 case 'm': // any MMX register, when inter-unit moves enabled.
3070 break; // falls through to setAllowsRegister.
3071 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003072 case 'f': // any x87 floating point stack register.
3073 // Constraint 'f' cannot be used for output operands.
3074 if (Info.ConstraintStr[0] == '=')
3075 return false;
3076
3077 Info.setAllowsRegister();
3078 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003079 case 'a': // eax.
3080 case 'b': // ebx.
3081 case 'c': // ecx.
3082 case 'd': // edx.
3083 case 'S': // esi.
3084 case 'D': // edi.
3085 case 'A': // edx:eax.
3086 case 't': // top of floating point stack.
3087 case 'u': // second from top of floating point stack.
3088 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003089 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003090 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003091 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003092 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3093 case 'l': // "Index" registers: any general register that can be used as an
3094 // index in a base+index memory access.
3095 Info.setAllowsRegister();
3096 return true;
3097 case 'C': // SSE floating point constant.
3098 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003099 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003100 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003101 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003102 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003103 return true;
3104 }
3105}
3106
Akira Hatanaka974131e2014-09-18 18:17:18 +00003107bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3108 unsigned Size) const {
3109 // Strip off constraint modifiers.
3110 while (Constraint[0] == '=' ||
3111 Constraint[0] == '+' ||
3112 Constraint[0] == '&')
3113 Constraint = Constraint.substr(1);
3114
3115 return validateOperandSize(Constraint, Size);
3116}
3117
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003118bool X86TargetInfo::validateInputSize(StringRef Constraint,
3119 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003120 return validateOperandSize(Constraint, Size);
3121}
3122
3123bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3124 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003125 switch (Constraint[0]) {
3126 default: break;
3127 case 'y':
3128 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003129 case 'f':
3130 case 't':
3131 case 'u':
3132 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003133 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003134 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003135 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003136 }
3137
3138 return true;
3139}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003140
Eli Friedman3fd920a2008-08-20 02:34:37 +00003141std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003142X86TargetInfo::convertConstraint(const char *&Constraint) const {
3143 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003144 case 'a': return std::string("{ax}");
3145 case 'b': return std::string("{bx}");
3146 case 'c': return std::string("{cx}");
3147 case 'd': return std::string("{dx}");
3148 case 'S': return std::string("{si}");
3149 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003150 case 'p': // address
3151 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003152 case 't': // top of floating point stack.
3153 return std::string("{st}");
3154 case 'u': // second from top of floating point stack.
3155 return std::string("{st(1)}"); // second from top of floating point stack.
3156 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003157 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003158 }
3159}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003160} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003161
3162namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003163// X86-32 generic target
3164class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003165public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003166 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003167 DoubleAlign = LongLongAlign = 32;
3168 LongDoubleWidth = 96;
3169 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003170 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003171 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003172 SizeType = UnsignedInt;
3173 PtrDiffType = SignedInt;
3174 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003175 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003176
3177 // Use fpret for all types.
3178 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3179 (1 << TargetInfo::Double) |
3180 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003181
3182 // x86-32 has atomics up to 8 bytes
3183 // FIXME: Check that we actually have cmpxchg8b before setting
3184 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3185 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003186 }
Craig Topper3164f332014-03-11 03:39:26 +00003187 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003188 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003189 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003190
Craig Topper3164f332014-03-11 03:39:26 +00003191 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003192 if (RegNo == 0) return 0;
3193 if (RegNo == 1) return 2;
3194 return -1;
3195 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003196 bool validateOperandSize(StringRef Constraint,
3197 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003198 switch (Constraint[0]) {
3199 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003200 case 'R':
3201 case 'q':
3202 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003203 case 'a':
3204 case 'b':
3205 case 'c':
3206 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003207 case 'S':
3208 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003209 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003210 case 'A':
3211 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003212 }
3213
Akira Hatanaka974131e2014-09-18 18:17:18 +00003214 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003215 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003216};
3217} // end anonymous namespace
3218
3219namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003220class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3221public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003222 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3223 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003224
Craig Topper3164f332014-03-11 03:39:26 +00003225 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003226 unsigned Major, Minor, Micro;
3227 getTriple().getOSVersion(Major, Minor, Micro);
3228 // New NetBSD uses the default rounding mode.
3229 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3230 return X86_32TargetInfo::getFloatEvalMethod();
3231 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003232 return 1;
3233 }
3234};
3235} // end anonymous namespace
3236
3237namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003238class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3239public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003240 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3241 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003242 SizeType = UnsignedLong;
3243 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003244 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003245 }
3246};
3247} // end anonymous namespace
3248
3249namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003250class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3251public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003252 BitrigI386TargetInfo(const llvm::Triple &Triple)
3253 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003254 SizeType = UnsignedLong;
3255 IntPtrType = SignedLong;
3256 PtrDiffType = SignedLong;
3257 }
3258};
3259} // end anonymous namespace
3260
3261namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003262class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003263public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003264 DarwinI386TargetInfo(const llvm::Triple &Triple)
3265 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003266 LongDoubleWidth = 128;
3267 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003268 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003269 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003270 SizeType = UnsignedLong;
3271 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003272 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003273 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003274 }
3275
Eli Friedman3fd920a2008-08-20 02:34:37 +00003276};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003277} // end anonymous namespace
3278
3279namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003280// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003281class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003282public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003283 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3284 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003285 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003286 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003287 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003288 }
Craig Topper3164f332014-03-11 03:39:26 +00003289 void getTargetDefines(const LangOptions &Opts,
3290 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003291 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3292 }
3293};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003294
3295// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003296class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003297public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003298 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003299 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003300 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003301 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3302 }
Craig Topper3164f332014-03-11 03:39:26 +00003303 void getTargetDefines(const LangOptions &Opts,
3304 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003305 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3306 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3307 // The value of the following reflects processor type.
3308 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3309 // We lost the original triple, so we use the default.
3310 Builder.defineMacro("_M_IX86", "600");
3311 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003312};
3313} // end anonymous namespace
3314
Reid Kleckner47606832014-04-21 20:58:00 +00003315static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3316 Builder.defineMacro("__MSVCRT__");
3317 Builder.defineMacro("__MINGW32__");
3318
3319 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3320 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3321 // macro anyway for pre-processor compatibility.
3322 if (Opts.MicrosoftExt)
3323 Builder.defineMacro("__declspec", "__declspec");
3324 else
3325 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3326
3327 if (!Opts.MicrosoftExt) {
3328 // Provide macros for all the calling convention keywords. Provide both
3329 // single and double underscore prefixed variants. These are available on
3330 // x64 as well as x86, even though they have no effect.
3331 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3332 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003333 std::string GCCSpelling = "__attribute__((__";
3334 GCCSpelling += CC;
3335 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003336 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3337 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3338 }
3339 }
3340}
3341
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003342namespace {
3343// x86-32 MinGW target
3344class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3345public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003346 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3347 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003348 void getTargetDefines(const LangOptions &Opts,
3349 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003350 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003351 DefineStd(Builder, "WIN32", Opts);
3352 DefineStd(Builder, "WINNT", Opts);
3353 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003354 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003355 }
3356};
3357} // end anonymous namespace
3358
3359namespace {
3360// x86-32 Cygwin target
3361class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3362public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003363 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3364 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003365 TLSSupported = false;
3366 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003367 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003368 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003369 }
Craig Topper3164f332014-03-11 03:39:26 +00003370 void getTargetDefines(const LangOptions &Opts,
3371 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003372 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003373 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003374 Builder.defineMacro("__CYGWIN__");
3375 Builder.defineMacro("__CYGWIN32__");
3376 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003377 if (Opts.CPlusPlus)
3378 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003379 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003380};
3381} // end anonymous namespace
3382
3383namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003384// x86-32 Haiku target
3385class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3386public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003387 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003388 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003389 IntPtrType = SignedLong;
3390 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003391 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003392 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003393 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003394 }
Craig Topper3164f332014-03-11 03:39:26 +00003395 void getTargetDefines(const LangOptions &Opts,
3396 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003397 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3398 Builder.defineMacro("__INTEL__");
3399 Builder.defineMacro("__HAIKU__");
3400 }
3401};
3402} // end anonymous namespace
3403
Douglas Gregor9fabd852011-07-01 22:41:14 +00003404// RTEMS Target
3405template<typename Target>
3406class RTEMSTargetInfo : public OSTargetInfo<Target> {
3407protected:
Craig Topper3164f332014-03-11 03:39:26 +00003408 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3409 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003410 // RTEMS defines; list based off of gcc output
3411
Douglas Gregor9fabd852011-07-01 22:41:14 +00003412 Builder.defineMacro("__rtems__");
3413 Builder.defineMacro("__ELF__");
3414 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003415
Douglas Gregor9fabd852011-07-01 22:41:14 +00003416public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003417 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3418 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003419
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003420 switch (Triple.getArch()) {
3421 default:
3422 case llvm::Triple::x86:
3423 // this->MCountName = ".mcount";
3424 break;
3425 case llvm::Triple::mips:
3426 case llvm::Triple::mipsel:
3427 case llvm::Triple::ppc:
3428 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003429 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003430 // this->MCountName = "_mcount";
3431 break;
3432 case llvm::Triple::arm:
3433 // this->MCountName = "__mcount";
3434 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003435 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003436 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003437};
3438
3439namespace {
3440// x86-32 RTEMS target
3441class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3442public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003443 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003444 SizeType = UnsignedLong;
3445 IntPtrType = SignedLong;
3446 PtrDiffType = SignedLong;
3447 this->UserLabelPrefix = "";
3448 }
Craig Topper3164f332014-03-11 03:39:26 +00003449 void getTargetDefines(const LangOptions &Opts,
3450 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003451 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3452 Builder.defineMacro("__INTEL__");
3453 Builder.defineMacro("__rtems__");
3454 }
3455};
3456} // end anonymous namespace
3457
Chris Lattnerb986aba2010-04-11 19:29:39 +00003458namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003459// x86-64 generic target
3460class X86_64TargetInfo : public X86TargetInfo {
3461public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003462 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003463 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003464 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003465 LongDoubleWidth = 128;
3466 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003467 LargeArrayMinWidth = 128;
3468 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003469 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003470 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3471 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3472 IntPtrType = IsX32 ? SignedInt : SignedLong;
3473 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003474 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003475 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003476
Zinovy Nis1db95732014-07-10 15:27:19 +00003477 DescriptionString = (IsX32)
3478 ? "e-m:e-" "p:32:32-" "i64:64-f80:128-n8:16:32:64-S128"
3479 : "e-m:e-" "i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003480
3481 // Use fpret only for long double.
3482 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003483
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003484 // Use fp2ret for _Complex long double.
3485 ComplexLongDoubleUsesFP2Ret = true;
3486
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003487 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003488 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003489 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003490 }
Craig Topper3164f332014-03-11 03:39:26 +00003491 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003492 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003493 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003494
Craig Topper3164f332014-03-11 03:39:26 +00003495 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003496 if (RegNo == 0) return 0;
3497 if (RegNo == 1) return 1;
3498 return -1;
3499 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003500
Craig Topper3164f332014-03-11 03:39:26 +00003501 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003502 return (CC == CC_C ||
3503 CC == CC_IntelOclBicc ||
3504 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003505 }
3506
Craig Topper3164f332014-03-11 03:39:26 +00003507 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003508 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003509 }
3510
Pavel Chupinfd223e12014-08-04 12:39:43 +00003511 // for x32 we need it here explicitly
3512 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003513};
3514} // end anonymous namespace
3515
3516namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003517// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003518class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003519public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003520 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3521 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003522 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003523 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003524 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003525 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003526 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003527 SizeType = UnsignedLongLong;
3528 PtrDiffType = SignedLongLong;
3529 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003530 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003531 }
Craig Topper3164f332014-03-11 03:39:26 +00003532 void getTargetDefines(const LangOptions &Opts,
3533 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003534 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003535 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003536 }
Craig Topper3164f332014-03-11 03:39:26 +00003537 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003538 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003539 }
Craig Topper3164f332014-03-11 03:39:26 +00003540 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003541 return (CC == CC_C ||
3542 CC == CC_IntelOclBicc ||
3543 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3544 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003545};
3546} // end anonymous namespace
3547
3548namespace {
3549// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003550class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003551public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003552 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003553 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003554 LongDoubleWidth = LongDoubleAlign = 64;
3555 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003556 }
Craig Topper3164f332014-03-11 03:39:26 +00003557 void getTargetDefines(const LangOptions &Opts,
3558 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003559 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3560 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003561 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003562 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003563 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003564};
3565} // end anonymous namespace
3566
3567namespace {
3568// x86-64 MinGW target
3569class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3570public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003571 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3572 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003573 void getTargetDefines(const LangOptions &Opts,
3574 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003575 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003576 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003577 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003578 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003579 }
3580};
3581} // end anonymous namespace
3582
3583namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003584class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3585public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003586 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3587 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003588 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003589 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003590 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3591 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003592 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003593 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003594 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003595 }
3596};
3597} // end anonymous namespace
3598
3599namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003600class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3601public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003602 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3603 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003604 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003605 Int64Type = SignedLongLong;
3606 }
3607};
3608} // end anonymous namespace
3609
3610namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003611class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3612public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003613 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3614 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3615 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003616 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003617 }
3618};
Tim Northover9bb857a2013-01-31 12:13:10 +00003619}
3620
Eli Friedman9fa28852012-08-08 23:57:20 +00003621
3622namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003623class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003624 // Possible FPU choices.
3625 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003626 VFP2FPU = (1 << 0),
3627 VFP3FPU = (1 << 1),
3628 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003629 NeonFPU = (1 << 3),
3630 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003631 };
3632
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003633 // Possible HWDiv features.
3634 enum HWDivMode {
3635 HWDivThumb = (1 << 0),
3636 HWDivARM = (1 << 1)
3637 };
3638
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003639 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003640 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003641 }
3642
3643 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3644 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003645
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003646 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003647
Rafael Espindolaeb265472013-08-21 21:59:03 +00003648 enum {
3649 FP_Default,
3650 FP_VFP,
3651 FP_Neon
3652 } FPMath;
3653
Bernard Ogdenda13af32013-10-24 18:32:51 +00003654 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003655
Logan Chien57086ce2012-10-10 06:56:20 +00003656 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003657 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003658 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003659
3660 // Initialized via features.
3661 unsigned SoftFloat : 1;
3662 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003663
Bernard Ogden18b57012013-10-29 09:47:51 +00003664 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003665 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003666
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003667 // ACLE 6.5.1 Hardware floating point
3668 enum {
3669 HW_FP_HP = (1 << 1), /// half (16-bit)
3670 HW_FP_SP = (1 << 2), /// single (32-bit)
3671 HW_FP_DP = (1 << 3), /// double (64-bit)
3672 };
3673 uint32_t HW_FP;
3674
Chris Lattner5cc15e02010-03-03 19:03:45 +00003675 static const Builtin::Info BuiltinInfo[];
3676
Rafael Espindola101d5b92013-05-13 20:09:47 +00003677 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003678 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003679 if (T.getArch() == llvm::Triple::arm ||
3680 T.getArch() == llvm::Triple::armeb) {
3681 StringRef VersionStr;
3682 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003683 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003684 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003685 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003686 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003687 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003688 unsigned Version;
3689 if (VersionStr.getAsInteger(10, Version))
3690 return false;
3691 return Version >= 6;
3692 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003693 assert(T.getArch() == llvm::Triple::thumb ||
3694 T.getArch() == llvm::Triple::thumbeb);
3695 StringRef VersionStr;
3696 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003697 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003698 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003699 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003700 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003701 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003702 unsigned Version;
3703 if (VersionStr.getAsInteger(10, Version))
3704 return false;
3705 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003706 }
3707
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003708 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003709 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003710
3711 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003712 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003713
Tim Northover00853e52014-08-05 11:07:26 +00003714 // size_t is unsigned long on MachO-derived environments and NetBSD.
3715 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003716 SizeType = UnsignedLong;
3717 else
3718 SizeType = UnsignedInt;
3719
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003720 switch (T.getOS()) {
3721 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003722 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003723 break;
3724 case llvm::Triple::Win32:
3725 WCharType = UnsignedShort;
3726 break;
3727 case llvm::Triple::Linux:
3728 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003729 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3730 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003731 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003732 }
3733
3734 UseBitFieldTypeAlignment = true;
3735
3736 ZeroLengthBitfieldBoundary = 0;
3737
Tim Northover147cd2f2014-10-14 22:12:21 +00003738 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3739 // so set preferred for small types to 32.
3740 if (T.isOSBinFormatMachO()) {
3741 DescriptionString =
3742 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3743 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3744 } else if (T.isOSWindows()) {
3745 // FIXME: this is invalid for WindowsCE
3746 assert(!BigEndian && "Windows on ARM does not support big endian");
3747 DescriptionString = "e"
3748 "-m:e"
3749 "-p:32:32"
3750 "-i64:64"
3751 "-v128:64:128"
3752 "-a:0:32"
3753 "-n32"
3754 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003755 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003756 DescriptionString =
3757 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3758 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003759 }
3760
3761 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003762 }
3763
3764 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003765 const llvm::Triple &T = getTriple();
3766
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003767 IsAAPCS = false;
3768
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003769 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003770
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003771 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003772 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003773 SizeType = UnsignedInt;
3774 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003775 SizeType = UnsignedLong;
3776
3777 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3778 WCharType = SignedInt;
3779
3780 // Do not respect the alignment of bit-field types when laying out
3781 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3782 UseBitFieldTypeAlignment = false;
3783
3784 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3785 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3786 /// gcc.
3787 ZeroLengthBitfieldBoundary = 32;
3788
Tim Northover147cd2f2014-10-14 22:12:21 +00003789 if (T.isOSBinFormatMachO())
3790 DescriptionString =
3791 BigEndian
3792 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3793 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3794 else
3795 DescriptionString =
3796 BigEndian
3797 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3798 : "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 +00003799
3800 // FIXME: Override "preferred align" for double and long long.
3801 }
3802
Chris Lattner17df24e2008-04-21 18:56:49 +00003803public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003804 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003805 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003806 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003807 BigEndian = IsBigEndian;
3808
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003809 switch (getTriple().getOS()) {
3810 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003811 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003812 break;
3813 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003814 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003815 break;
3816 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003817
Chris Lattner1a8f3942010-04-23 16:29:58 +00003818 // {} in inline assembly are neon specifiers, not assembly variant
3819 // specifiers.
3820 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003821
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003822 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003823 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003824
3825 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003826
3827 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003828 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003829
3830 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003831 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003832 if (shouldUseInlineAtomic(getTriple()))
3833 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003834
3835 // Do force alignment of members that follow zero length bitfields. If
3836 // the alignment of the zero-length bitfield is greater than the member
3837 // that follows it, `bar', `bar' will be aligned as the type of the
3838 // zero length bitfield.
3839 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003840 }
Alp Toker4925ba72014-06-07 23:30:42 +00003841 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003842 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003843 ABI = Name;
3844
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003845 // The defaults (above) are for AAPCS, check if we need to change them.
3846 //
3847 // FIXME: We need support for -meabi... we could just mangle it into the
3848 // name.
3849 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003850 setABIAPCS();
3851 return true;
3852 }
3853 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3854 setABIAAPCS();
3855 return true;
3856 }
3857 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003858 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003859
Craig Topper3164f332014-03-11 03:39:26 +00003860 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003861 if (IsAAPCS)
3862 Features["aapcs"] = true;
3863 else
3864 Features["apcs"] = true;
3865
Silviu Barangae5690462013-10-21 10:59:33 +00003866 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003867 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3868 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003869 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3870 CPU == "cortex-a9-mp") {
3871 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003872 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003873 }
3874 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003875 Features["vfp4"] = true;
3876 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003877 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3878 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00003879 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003880 Features["vfp4"] = true;
3881 Features["neon"] = true;
3882 Features["hwdiv"] = true;
3883 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003884 } else if (CPU == "cyclone") {
3885 Features["v8fp"] = true;
3886 Features["neon"] = true;
3887 Features["hwdiv"] = true;
3888 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003889 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3890 Features["fp-armv8"] = true;
3891 Features["neon"] = true;
3892 Features["hwdiv"] = true;
3893 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003894 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003895 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003896 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003897 // Enable the hwdiv extension for all v8a AArch32 cores by
3898 // default.
3899 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003900 ArchName == "armebv8a" || ArchName == "armebv8" ||
3901 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3902 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00003903 Features["hwdiv"] = true;
3904 Features["hwdiv-arm"] = true;
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00003905 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003906 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003907 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003908 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003909
Craig Topper3164f332014-03-11 03:39:26 +00003910 bool handleTargetFeatures(std::vector<std::string> &Features,
3911 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003912 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003913 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003914 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003915 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003916 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00003917
3918 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003919 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00003920 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003921 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00003922 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003923 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003924 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003925 HW_FP = HW_FP_SP | HW_FP_DP;
3926 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003927 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003928 HW_FP = HW_FP_SP | HW_FP_DP;
3929 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003930 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003931 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
3932 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003933 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003934 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
3935 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003936 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003937 HW_FP = HW_FP_SP | HW_FP_DP;
3938 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003939 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003940 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003941 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003942 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00003943 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003944 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00003945 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003946 } else if (Feature == "+fp-only-sp") {
3947 HW_FP &= ~HW_FP_DP;
3948 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003949 }
3950
Rafael Espindolaeb265472013-08-21 21:59:03 +00003951 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3952 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3953 return false;
3954 }
3955
3956 if (FPMath == FP_Neon)
3957 Features.push_back("+neonfp");
3958 else if (FPMath == FP_VFP)
3959 Features.push_back("-neonfp");
3960
Daniel Dunbar893d4752009-12-19 04:15:38 +00003961 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00003962 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
3963 for (const auto &FEFeature : FrontEndFeatures) {
3964 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
3965 if (Feature != Features.end())
3966 Features.erase(Feature);
3967 }
3968
Rafael Espindolaeb265472013-08-21 21:59:03 +00003969 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003970 }
3971
Craig Topper3164f332014-03-11 03:39:26 +00003972 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003973 return llvm::StringSwitch<bool>(Feature)
3974 .Case("arm", true)
3975 .Case("softfloat", SoftFloat)
3976 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00003977 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003978 .Case("hwdiv", HWDiv & HWDivThumb)
3979 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003980 .Default(false);
3981 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00003982 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003983 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003984 return llvm::StringSwitch<const char*>(Name)
3985 .Cases("arm8", "arm810", "4")
3986 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
3987 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
3988 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
3989 .Case("ep9312", "4T")
3990 .Cases("arm10tdmi", "arm1020t", "5T")
3991 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
3992 .Case("arm926ej-s", "5TEJ")
3993 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
3994 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003995 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003996 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003997 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003998 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00003999 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Renato Golin5886bc32014-10-13 10:22:48 +00004000 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00004001 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00004002 .Case("swift", "7S")
Tim Northovera2ee4332014-03-29 15:09:45 +00004003 .Case("cyclone", "8A")
Jim Grosbachbe83cb82014-06-26 17:24:16 +00004004 .Case("cortex-m3", "7M")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00004005 .Cases("cortex-m4", "cortex-m7", "7EM")
Bob Wilson87ba1d32011-03-21 21:55:25 +00004006 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00004007 .Cases("cortex-a53", "cortex-a57", "8A")
Craig Topperf1186c52014-05-08 06:41:40 +00004008 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004009 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004010 static const char *getCPUProfile(StringRef Name) {
4011 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00004012 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Renato Golin5886bc32014-10-13 10:22:48 +00004013 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00004014 .Cases("cortex-a53", "cortex-a57", "A")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00004015 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m7", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00004016 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00004017 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004018 }
Craig Topper3164f332014-03-11 03:39:26 +00004019 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004020 if (!getCPUDefineSuffix(Name))
4021 return false;
4022
Tim Northovere8c37212014-07-09 09:24:43 +00004023 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4024 StringRef Profile = getCPUProfile(Name);
4025 if (Profile == "M" && MaxAtomicInlineWidth) {
4026 MaxAtomicPromoteWidth = 32;
4027 MaxAtomicInlineWidth = 32;
4028 }
4029
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004030 CPU = Name;
4031 return true;
4032 }
Craig Topper3164f332014-03-11 03:39:26 +00004033 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004034 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4035 unsigned CPUArchVer) const {
4036 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4037 (CPUArch.find('M') != StringRef::npos);
4038 }
4039 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4040 unsigned CPUArchVer) const {
4041 // We check both CPUArchVer and ArchName because when only triple is
4042 // specified, the default CPU is arm1136j-s.
4043 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4044 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4045 }
Craig Topper3164f332014-03-11 03:39:26 +00004046 void getTargetDefines(const LangOptions &Opts,
4047 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004048 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004049 Builder.defineMacro("__arm");
4050 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004051
Chris Lattnerecd49032009-03-02 22:27:17 +00004052 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004053 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004054
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004055 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004056 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004057 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004058 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004059 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004060
4061 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004062 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004063 StringRef ArchName = getTriple().getArchName();
4064
4065 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4066 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
James Molloy0ffb0932014-09-15 11:25:38 +00004067 if (CPUArch[0] >= '8') {
4068 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4069 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
4070 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004071
4072 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4073 // is not defined for the M-profile.
4074 // NOTE that the deffault profile is assumed to be 'A'
4075 if (CPUProfile.empty() || CPUProfile != "M")
4076 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4077
4078 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4079 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4080 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4081 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4082 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4083 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4084 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4085
4086 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4087 // instruction set such as ARM or Thumb.
4088 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4089
4090 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4091
4092 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004093 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004094 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004095
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004096 // ACLE 6.5.1 Hardware Floating Point
4097 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004098 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004099
Yi Konga44c4d72014-06-27 21:25:42 +00004100 // ACLE predefines.
4101 Builder.defineMacro("__ARM_ACLE", "200");
4102
Mike Stump9d54bd72009-04-08 02:07:04 +00004103 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004104
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004105 // FIXME: It's more complicated than this and we don't really support
4106 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004107 // Windows on ARM does not "support" interworking
4108 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004109 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004110
David Tweed8f676532012-10-25 13:33:01 +00004111 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004112 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004113 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4114 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004115 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004116 Builder.defineMacro("__ARM_PCS", "1");
4117
David Tweed8f676532012-10-25 13:33:01 +00004118 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004119 Builder.defineMacro("__ARM_PCS_VFP", "1");
4120 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004121
Daniel Dunbar893d4752009-12-19 04:15:38 +00004122 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004123 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004124
4125 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004126 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004127
4128 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004129 Builder.defineMacro("__THUMBEL__");
4130 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004131 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004132 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004133 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004134 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4135 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004136
4137 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004138 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004139
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004140 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004141 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004142 if (FPU & VFP2FPU)
4143 Builder.defineMacro("__ARM_VFPV2__");
4144 if (FPU & VFP3FPU)
4145 Builder.defineMacro("__ARM_VFPV3__");
4146 if (FPU & VFP4FPU)
4147 Builder.defineMacro("__ARM_VFPV4__");
4148 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004149
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004150 // This only gets set when Neon instructions are actually available, unlike
4151 // the VFP define, hence the soft float and arch check. This is subtly
4152 // different from gcc, we follow the intent which was that it should be set
4153 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004154 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4155 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004156 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004157 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004158
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004159 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4160 Opts.ShortWChar ? "2" : "4");
4161
4162 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4163 Opts.ShortEnums ? "1" : "4");
4164
Bernard Ogden18b57012013-10-29 09:47:51 +00004165 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004166 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004167
Tim Northover02e38602014-02-03 17:28:04 +00004168 if (Crypto)
4169 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4170
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004171 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004172 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4173 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4174 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4175 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4176 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004177 }
Craig Topper3164f332014-03-11 03:39:26 +00004178 void getTargetBuiltins(const Builtin::Info *&Records,
4179 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004180 Records = BuiltinInfo;
4181 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004182 }
Craig Topper3164f332014-03-11 03:39:26 +00004183 bool isCLZForZeroUndef() const override { return false; }
4184 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004185 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004186 }
Craig Topper3164f332014-03-11 03:39:26 +00004187 void getGCCRegNames(const char * const *&Names,
4188 unsigned &NumNames) const override;
4189 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4190 unsigned &NumAliases) const override;
4191 bool validateAsmConstraint(const char *&Name,
4192 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004193 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004194 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004195 case 'l': // r0-r7
4196 case 'h': // r8-r15
4197 case 'w': // VFP Floating point register single precision
4198 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004199 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004200 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004201 case 'Q': // A memory address that is a single base register.
4202 Info.setAllowsMemory();
4203 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004204 case 'U': // a memory reference...
4205 switch (Name[1]) {
4206 case 'q': // ...ARMV4 ldrsb
4207 case 'v': // ...VFP load/store (reg+constant offset)
4208 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004209 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004210 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004211 case 'n': // valid address for Neon doubleword vector load/store
4212 case 'm': // valid address for Neon element and structure load/store
4213 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004214 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004215 Info.setAllowsMemory();
4216 Name++;
4217 return true;
4218 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004219 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004220 return false;
4221 }
Craig Topper3164f332014-03-11 03:39:26 +00004222 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004223 std::string R;
4224 switch (*Constraint) {
4225 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004226 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004227 Constraint++;
4228 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004229 case 'p': // 'p' should be translated to 'r' by default.
4230 R = std::string("r");
4231 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004232 default:
4233 return std::string(1, *Constraint);
4234 }
4235 return R;
4236 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004237 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004238 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004239 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004240 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004241 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004242
Bill Wendling9d1ee112012-10-25 23:28:48 +00004243 // Strip off constraint modifiers.
4244 while (Constraint[0] == '=' ||
4245 Constraint[0] == '+' ||
4246 Constraint[0] == '&')
4247 Constraint = Constraint.substr(1);
4248
4249 switch (Constraint[0]) {
4250 default: break;
4251 case 'r': {
4252 switch (Modifier) {
4253 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004254 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004255 case 'q':
4256 // A register of size 32 cannot fit a vector type.
4257 return false;
4258 }
4259 }
4260 }
4261
4262 return true;
4263 }
Craig Topper3164f332014-03-11 03:39:26 +00004264 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004265 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004266 return "";
4267 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004268
Craig Topper3164f332014-03-11 03:39:26 +00004269 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004270 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4271 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004272
Craig Topper3164f332014-03-11 03:39:26 +00004273 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004274 if (RegNo == 0) return 0;
4275 if (RegNo == 1) return 1;
4276 return -1;
4277 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004278};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004279
Rafael Espindolaeb265472013-08-21 21:59:03 +00004280bool ARMTargetInfo::setFPMath(StringRef Name) {
4281 if (Name == "neon") {
4282 FPMath = FP_Neon;
4283 return true;
4284 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4285 Name == "vfp4") {
4286 FPMath = FP_VFP;
4287 return true;
4288 }
4289 return false;
4290}
4291
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004292const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004293 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004294 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004295 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4296
4297 // Float registers
4298 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4299 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4300 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004301 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004302
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004303 // Double registers
4304 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4305 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004306 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4307 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004308
4309 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004310 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4311 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004312};
4313
4314void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004315 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004316 Names = GCCRegNames;
4317 NumNames = llvm::array_lengthof(GCCRegNames);
4318}
4319
4320const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004321 { { "a1" }, "r0" },
4322 { { "a2" }, "r1" },
4323 { { "a3" }, "r2" },
4324 { { "a4" }, "r3" },
4325 { { "v1" }, "r4" },
4326 { { "v2" }, "r5" },
4327 { { "v3" }, "r6" },
4328 { { "v4" }, "r7" },
4329 { { "v5" }, "r8" },
4330 { { "v6", "rfp" }, "r9" },
4331 { { "sl" }, "r10" },
4332 { { "fp" }, "r11" },
4333 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004334 { { "r13" }, "sp" },
4335 { { "r14" }, "lr" },
4336 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004337 // The S, D and Q registers overlap, but aren't really aliases; we
4338 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004339};
4340
4341void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4342 unsigned &NumAliases) const {
4343 Aliases = GCCRegAliases;
4344 NumAliases = llvm::array_lengthof(GCCRegAliases);
4345}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004346
4347const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004348#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004349#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004350 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004351#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004352
4353#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004354#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004355#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4356 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004357#include "clang/Basic/BuiltinsARM.def"
4358};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004359
4360class ARMleTargetInfo : public ARMTargetInfo {
4361public:
4362 ARMleTargetInfo(const llvm::Triple &Triple)
4363 : ARMTargetInfo(Triple, false) { }
4364 virtual void getTargetDefines(const LangOptions &Opts,
4365 MacroBuilder &Builder) const {
4366 Builder.defineMacro("__ARMEL__");
4367 ARMTargetInfo::getTargetDefines(Opts, Builder);
4368 }
4369};
4370
4371class ARMbeTargetInfo : public ARMTargetInfo {
4372public:
4373 ARMbeTargetInfo(const llvm::Triple &Triple)
4374 : ARMTargetInfo(Triple, true) { }
4375 virtual void getTargetDefines(const LangOptions &Opts,
4376 MacroBuilder &Builder) const {
4377 Builder.defineMacro("__ARMEB__");
4378 Builder.defineMacro("__ARM_BIG_ENDIAN");
4379 ARMTargetInfo::getTargetDefines(Opts, Builder);
4380 }
4381};
Chris Lattner17df24e2008-04-21 18:56:49 +00004382} // end anonymous namespace.
4383
Eli Friedmanf05b7722008-08-20 07:44:10 +00004384namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004385class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4386 const llvm::Triple Triple;
4387public:
4388 WindowsARMTargetInfo(const llvm::Triple &Triple)
4389 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4390 TLSSupported = false;
4391 WCharType = UnsignedShort;
4392 SizeType = UnsignedInt;
4393 UserLabelPrefix = "";
4394 }
4395 void getVisualStudioDefines(const LangOptions &Opts,
4396 MacroBuilder &Builder) const {
4397 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4398
4399 // FIXME: this is invalid for WindowsCE
4400 Builder.defineMacro("_M_ARM_NT", "1");
4401 Builder.defineMacro("_M_ARMT", "_M_ARM");
4402 Builder.defineMacro("_M_THUMB", "_M_ARM");
4403
4404 assert((Triple.getArch() == llvm::Triple::arm ||
4405 Triple.getArch() == llvm::Triple::thumb) &&
4406 "invalid architecture for Windows ARM target info");
4407 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4408 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4409
4410 // TODO map the complete set of values
4411 // 31: VFPv3 40: VFPv4
4412 Builder.defineMacro("_M_ARM_FP", "31");
4413 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004414 BuiltinVaListKind getBuiltinVaListKind() const override {
4415 return TargetInfo::CharPtrBuiltinVaList;
4416 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004417};
4418
4419// Windows ARM + Itanium C++ ABI Target
4420class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4421public:
4422 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4423 : WindowsARMTargetInfo(Triple) {
4424 TheCXXABI.set(TargetCXXABI::GenericARM);
4425 }
4426
4427 void getTargetDefines(const LangOptions &Opts,
4428 MacroBuilder &Builder) const override {
4429 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4430
4431 if (Opts.MSVCCompat)
4432 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4433 }
4434};
4435
4436// Windows ARM, MS (C++) ABI
4437class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4438public:
4439 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4440 : WindowsARMTargetInfo(Triple) {
4441 TheCXXABI.set(TargetCXXABI::Microsoft);
4442 }
4443
4444 void getTargetDefines(const LangOptions &Opts,
4445 MacroBuilder &Builder) const override {
4446 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4447 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4448 }
4449};
4450}
4451
4452
4453namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004454class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004455 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004456protected:
Craig Topper3164f332014-03-11 03:39:26 +00004457 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4458 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004459 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004460 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004461
Torok Edwinb2b37c62009-06-30 17:10:35 +00004462public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004463 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004464 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004465 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004466 // iOS always has 64-bit atomic instructions.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004467 // FIXME: This should be based off of the target features in ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004468 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004469
4470 // Darwin on iOS uses a variant of the ARM C++ ABI.
4471 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004472 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004473};
4474} // end anonymous namespace.
4475
Tony Linthicum76329bf2011-12-12 21:14:55 +00004476
4477namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004478class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004479 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004480 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4481 static const char *const GCCRegNames[];
4482
James Molloy75f5f9e2014-04-16 15:33:48 +00004483 enum FPUModeEnum {
4484 FPUMode,
4485 NeonMode
4486 };
4487
4488 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004489 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004490 unsigned Crypto;
4491
Tim Northovera2ee4332014-03-29 15:09:45 +00004492 static const Builtin::Info BuiltinInfo[];
4493
4494 std::string ABI;
4495
4496public:
Tim Northover573cbee2014-05-24 12:52:07 +00004497 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004498 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004499
4500 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4501 WCharType = SignedInt;
4502
4503 // NetBSD apparently prefers consistency across ARM targets to consistency
4504 // across 64-bit targets.
4505 Int64Type = SignedLongLong;
4506 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004507 } else {
4508 WCharType = UnsignedInt;
4509 Int64Type = SignedLong;
4510 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004511 }
4512
Tim Northovera2ee4332014-03-29 15:09:45 +00004513 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004514 MaxVectorAlign = 128;
4515 RegParmMax = 8;
4516 MaxAtomicInlineWidth = 128;
4517 MaxAtomicPromoteWidth = 128;
4518
4519 LongDoubleWidth = LongDoubleAlign = 128;
4520 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4521
Tim Northovera2ee4332014-03-29 15:09:45 +00004522 // {} in inline assembly are neon specifiers, not assembly variant
4523 // specifiers.
4524 NoAsmVariants = true;
4525
Tim Northover573cbee2014-05-24 12:52:07 +00004526 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004527 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4528 }
4529
Alp Toker4925ba72014-06-07 23:30:42 +00004530 StringRef getABI() const override { return ABI; }
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004531 virtual bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004532 if (Name != "aapcs" && Name != "darwinpcs")
4533 return false;
4534
4535 ABI = Name;
4536 return true;
4537 }
4538
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004539 virtual bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004540 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004541 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004542 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004543 .Case("cyclone", true)
4544 .Default(false);
4545 return CPUKnown;
4546 }
4547
4548 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004549 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004550 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004551 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004552
4553 // Target properties.
4554 Builder.defineMacro("_LP64");
4555 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004556
4557 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4558 Builder.defineMacro("__ARM_ACLE", "200");
4559 Builder.defineMacro("__ARM_ARCH", "8");
4560 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4561
4562 Builder.defineMacro("__ARM_64BIT_STATE");
4563 Builder.defineMacro("__ARM_PCS_AAPCS64");
4564 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4565
4566 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4567 Builder.defineMacro("__ARM_FEATURE_CLZ");
4568 Builder.defineMacro("__ARM_FEATURE_FMA");
4569 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004570 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4571 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4572 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4573 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004574
4575 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4576
4577 // 0xe implies support for half, single and double precision operations.
4578 Builder.defineMacro("__ARM_FP", "0xe");
4579
4580 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4581 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4582 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4583
4584 if (Opts.FastMath || Opts.FiniteMathOnly)
4585 Builder.defineMacro("__ARM_FP_FAST");
4586
Richard Smithab506ad2014-10-20 23:26:58 +00004587 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004588 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4589
4590 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4591
4592 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4593 Opts.ShortEnums ? "1" : "4");
4594
James Molloy75f5f9e2014-04-16 15:33:48 +00004595 if (FPU == NeonMode) {
4596 Builder.defineMacro("__ARM_NEON");
4597 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004598 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004599 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004600
Bradley Smith418c5932014-05-02 15:17:51 +00004601 if (CRC)
4602 Builder.defineMacro("__ARM_FEATURE_CRC32");
4603
James Molloy75f5f9e2014-04-16 15:33:48 +00004604 if (Crypto)
4605 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004606 }
4607
4608 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004609 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004610 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004611 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004612 }
4613
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004614 virtual bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004615 return Feature == "aarch64" ||
4616 Feature == "arm64" ||
4617 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004618 }
4619
James Molloy5e73df52014-04-16 15:06:20 +00004620 bool handleTargetFeatures(std::vector<std::string> &Features,
4621 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004622 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004623 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004624 Crypto = 0;
4625 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4626 if (Features[i] == "+neon")
4627 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004628 if (Features[i] == "+crc")
4629 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004630 if (Features[i] == "+crypto")
4631 Crypto = 1;
4632 }
4633
James Molloy5e73df52014-04-16 15:06:20 +00004634 setDescriptionString();
4635
4636 return true;
4637 }
4638
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004639 virtual bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004640
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004641 virtual BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004642 return TargetInfo::AArch64ABIBuiltinVaList;
4643 }
4644
4645 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004646 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004647 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004648 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004649
4650 virtual bool validateAsmConstraint(const char *&Name,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004651 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004652 switch (*Name) {
4653 default:
4654 return false;
4655 case 'w': // Floating point and SIMD registers (V0-V31)
4656 Info.setAllowsRegister();
4657 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004658 case 'I': // Constant that can be used with an ADD instruction
4659 case 'J': // Constant that can be used with a SUB instruction
4660 case 'K': // Constant that can be used with a 32-bit logical instruction
4661 case 'L': // Constant that can be used with a 64-bit logical instruction
4662 case 'M': // Constant that can be used as a 32-bit MOV immediate
4663 case 'N': // Constant that can be used as a 64-bit MOV immediate
4664 case 'Y': // Floating point constant zero
4665 case 'Z': // Integer constant zero
4666 return true;
4667 case 'Q': // A memory reference with base register and no offset
4668 Info.setAllowsMemory();
4669 return true;
4670 case 'S': // A symbolic address
4671 Info.setAllowsRegister();
4672 return true;
4673 case 'U':
4674 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
4675 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
4676 // Usa: An absolute symbolic address
4677 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
4678 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
Tim Northovera2ee4332014-03-29 15:09:45 +00004679 case 'z': // Zero register, wzr or xzr
4680 Info.setAllowsRegister();
4681 return true;
4682 case 'x': // Floating point and SIMD registers (V0-V15)
4683 Info.setAllowsRegister();
4684 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004685 }
4686 return false;
4687 }
4688
Akira Hatanaka987f1862014-08-22 06:05:21 +00004689 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004690 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004691 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004692 // Strip off constraint modifiers.
4693 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4694 Constraint = Constraint.substr(1);
4695
4696 switch (Constraint[0]) {
4697 default:
4698 return true;
4699 case 'z':
4700 case 'r': {
4701 switch (Modifier) {
4702 case 'x':
4703 case 'w':
4704 // For now assume that the person knows what they're
4705 // doing with the modifier.
4706 return true;
4707 default:
4708 // By default an 'r' constraint will be in the 'x'
4709 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004710 if (Size == 64)
4711 return true;
4712
4713 SuggestedModifier = "w";
4714 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004715 }
4716 }
4717 }
4718 }
4719
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004720 virtual const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004721
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004722 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004723 if (RegNo == 0)
4724 return 0;
4725 if (RegNo == 1)
4726 return 1;
4727 return -1;
4728 }
4729};
4730
Tim Northover573cbee2014-05-24 12:52:07 +00004731const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004732 // 32-bit Integer registers
4733 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4734 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4735 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4736
4737 // 64-bit Integer registers
4738 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4739 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4740 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4741
4742 // 32-bit floating point regsisters
4743 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4744 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4745 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4746
4747 // 64-bit floating point regsisters
4748 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4749 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4750 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4751
4752 // Vector registers
4753 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4754 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4755 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4756};
4757
Tim Northover573cbee2014-05-24 12:52:07 +00004758void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004759 unsigned &NumNames) const {
4760 Names = GCCRegNames;
4761 NumNames = llvm::array_lengthof(GCCRegNames);
4762}
4763
Tim Northover573cbee2014-05-24 12:52:07 +00004764const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004765 { { "w31" }, "wsp" },
4766 { { "x29" }, "fp" },
4767 { { "x30" }, "lr" },
4768 { { "x31" }, "sp" },
4769 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4770 // don't want to substitute one of these for a different-sized one.
4771};
4772
Tim Northover573cbee2014-05-24 12:52:07 +00004773void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004774 unsigned &NumAliases) const {
4775 Aliases = GCCRegAliases;
4776 NumAliases = llvm::array_lengthof(GCCRegAliases);
4777}
4778
Tim Northover573cbee2014-05-24 12:52:07 +00004779const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004780#define BUILTIN(ID, TYPE, ATTRS) \
4781 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4782#include "clang/Basic/BuiltinsNEON.def"
4783
4784#define BUILTIN(ID, TYPE, ATTRS) \
4785 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004786#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004787};
James Molloy5e73df52014-04-16 15:06:20 +00004788
Tim Northover573cbee2014-05-24 12:52:07 +00004789class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004790 void setDescriptionString() override {
4791 if (getTriple().isOSBinFormatMachO())
4792 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4793 else
4794 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4795 }
4796
4797public:
Tim Northover573cbee2014-05-24 12:52:07 +00004798 AArch64leTargetInfo(const llvm::Triple &Triple)
4799 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004800 BigEndian = false;
4801 }
4802 void getTargetDefines(const LangOptions &Opts,
4803 MacroBuilder &Builder) const override {
4804 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004805 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004806 }
4807};
4808
Tim Northover573cbee2014-05-24 12:52:07 +00004809class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004810 void setDescriptionString() override {
4811 assert(!getTriple().isOSBinFormatMachO());
4812 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4813 }
4814
4815public:
Tim Northover573cbee2014-05-24 12:52:07 +00004816 AArch64beTargetInfo(const llvm::Triple &Triple)
4817 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004818 void getTargetDefines(const LangOptions &Opts,
4819 MacroBuilder &Builder) const override {
4820 Builder.defineMacro("__AARCH64EB__");
4821 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4822 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004823 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004824 }
4825};
Tim Northovera2ee4332014-03-29 15:09:45 +00004826} // end anonymous namespace.
4827
4828namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004829class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004830protected:
4831 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4832 MacroBuilder &Builder) const override {
4833 Builder.defineMacro("__AARCH64_SIMD__");
4834 Builder.defineMacro("__ARM64_ARCH_8__");
4835 Builder.defineMacro("__ARM_NEON__");
4836 Builder.defineMacro("__LITTLE_ENDIAN__");
4837 Builder.defineMacro("__REGISTER_PREFIX__", "");
4838 Builder.defineMacro("__arm64", "1");
4839 Builder.defineMacro("__arm64__", "1");
4840
4841 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4842 }
4843
Tim Northovera2ee4332014-03-29 15:09:45 +00004844public:
Tim Northover573cbee2014-05-24 12:52:07 +00004845 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4846 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004847 Int64Type = SignedLongLong;
4848 WCharType = SignedInt;
4849 UseSignedCharForObjCBool = false;
4850
4851 LongDoubleWidth = LongDoubleAlign = 64;
4852 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4853
4854 TheCXXABI.set(TargetCXXABI::iOS64);
4855 }
4856
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004857 virtual BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004858 return TargetInfo::CharPtrBuiltinVaList;
4859 }
4860};
4861} // end anonymous namespace
4862
4863namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004864// Hexagon abstract base class
4865class HexagonTargetInfo : public TargetInfo {
4866 static const Builtin::Info BuiltinInfo[];
4867 static const char * const GCCRegNames[];
4868 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4869 std::string CPU;
4870public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004871 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004872 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004873 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004874
4875 // {} in inline assembly are packet specifiers, not assembly variant
4876 // specifiers.
4877 NoAsmVariants = true;
4878 }
4879
Craig Topper3164f332014-03-11 03:39:26 +00004880 void getTargetBuiltins(const Builtin::Info *&Records,
4881 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004882 Records = BuiltinInfo;
4883 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4884 }
4885
Craig Topper3164f332014-03-11 03:39:26 +00004886 bool validateAsmConstraint(const char *&Name,
4887 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004888 return true;
4889 }
4890
Craig Topper3164f332014-03-11 03:39:26 +00004891 void getTargetDefines(const LangOptions &Opts,
4892 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004893
Craig Topper3164f332014-03-11 03:39:26 +00004894 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004895 return Feature == "hexagon";
4896 }
Craig Topper3164f332014-03-11 03:39:26 +00004897
4898 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004899 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004900 }
Craig Topper3164f332014-03-11 03:39:26 +00004901 void getGCCRegNames(const char * const *&Names,
4902 unsigned &NumNames) const override;
4903 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4904 unsigned &NumAliases) const override;
4905 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004906 return "";
4907 }
Sebastian Pop86500282012-01-13 20:37:10 +00004908
4909 static const char *getHexagonCPUSuffix(StringRef Name) {
4910 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004911 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004912 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00004913 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00004914 }
4915
Craig Topper3164f332014-03-11 03:39:26 +00004916 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004917 if (!getHexagonCPUSuffix(Name))
4918 return false;
4919
Tony Linthicum76329bf2011-12-12 21:14:55 +00004920 CPU = Name;
4921 return true;
4922 }
4923};
4924
4925void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4926 MacroBuilder &Builder) const {
4927 Builder.defineMacro("qdsp6");
4928 Builder.defineMacro("__qdsp6", "1");
4929 Builder.defineMacro("__qdsp6__", "1");
4930
4931 Builder.defineMacro("hexagon");
4932 Builder.defineMacro("__hexagon", "1");
4933 Builder.defineMacro("__hexagon__", "1");
4934
4935 if(CPU == "hexagonv1") {
4936 Builder.defineMacro("__HEXAGON_V1__");
4937 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4938 if(Opts.HexagonQdsp6Compat) {
4939 Builder.defineMacro("__QDSP6_V1__");
4940 Builder.defineMacro("__QDSP6_ARCH__", "1");
4941 }
4942 }
4943 else if(CPU == "hexagonv2") {
4944 Builder.defineMacro("__HEXAGON_V2__");
4945 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4946 if(Opts.HexagonQdsp6Compat) {
4947 Builder.defineMacro("__QDSP6_V2__");
4948 Builder.defineMacro("__QDSP6_ARCH__", "2");
4949 }
4950 }
4951 else if(CPU == "hexagonv3") {
4952 Builder.defineMacro("__HEXAGON_V3__");
4953 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4954 if(Opts.HexagonQdsp6Compat) {
4955 Builder.defineMacro("__QDSP6_V3__");
4956 Builder.defineMacro("__QDSP6_ARCH__", "3");
4957 }
4958 }
4959 else if(CPU == "hexagonv4") {
4960 Builder.defineMacro("__HEXAGON_V4__");
4961 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4962 if(Opts.HexagonQdsp6Compat) {
4963 Builder.defineMacro("__QDSP6_V4__");
4964 Builder.defineMacro("__QDSP6_ARCH__", "4");
4965 }
4966 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004967 else if(CPU == "hexagonv5") {
4968 Builder.defineMacro("__HEXAGON_V5__");
4969 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4970 if(Opts.HexagonQdsp6Compat) {
4971 Builder.defineMacro("__QDSP6_V5__");
4972 Builder.defineMacro("__QDSP6_ARCH__", "5");
4973 }
4974 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004975}
4976
4977const char * const HexagonTargetInfo::GCCRegNames[] = {
4978 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4979 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
4980 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
4981 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
4982 "p0", "p1", "p2", "p3",
4983 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
4984};
4985
4986void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
4987 unsigned &NumNames) const {
4988 Names = GCCRegNames;
4989 NumNames = llvm::array_lengthof(GCCRegNames);
4990}
4991
4992
4993const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
4994 { { "sp" }, "r29" },
4995 { { "fp" }, "r30" },
4996 { { "lr" }, "r31" },
4997 };
4998
4999void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5000 unsigned &NumAliases) const {
5001 Aliases = GCCRegAliases;
5002 NumAliases = llvm::array_lengthof(GCCRegAliases);
5003}
5004
5005
5006const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5007#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5008#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5009 ALL_LANGUAGES },
5010#include "clang/Basic/BuiltinsHexagon.def"
5011};
5012}
5013
5014
Chris Lattner5ba61f02006-10-14 07:39:34 +00005015namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005016// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5017class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005018 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5019 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005020 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005021public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005022 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005023
Craig Topper3164f332014-03-11 03:39:26 +00005024 bool handleTargetFeatures(std::vector<std::string> &Features,
5025 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005026 SoftFloat = false;
5027 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5028 if (Features[i] == "+soft-float")
5029 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005030 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005031 }
Craig Topper3164f332014-03-11 03:39:26 +00005032 void getTargetDefines(const LangOptions &Opts,
5033 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005034 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005035 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005036
5037 if (SoftFloat)
5038 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005039 }
Craig Topper3164f332014-03-11 03:39:26 +00005040
5041 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005042 return llvm::StringSwitch<bool>(Feature)
5043 .Case("softfloat", SoftFloat)
5044 .Case("sparc", true)
5045 .Default(false);
5046 }
Craig Topper3164f332014-03-11 03:39:26 +00005047
5048 void getTargetBuiltins(const Builtin::Info *&Records,
5049 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005050 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005051 }
Craig Topper3164f332014-03-11 03:39:26 +00005052 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005053 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005054 }
Craig Topper3164f332014-03-11 03:39:26 +00005055 void getGCCRegNames(const char * const *&Names,
5056 unsigned &NumNames) const override;
5057 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5058 unsigned &NumAliases) const override;
5059 bool validateAsmConstraint(const char *&Name,
5060 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005061 // FIXME: Implement!
5062 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005063 }
Craig Topper3164f332014-03-11 03:39:26 +00005064 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005065 // FIXME: Implement!
5066 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005067 }
5068};
5069
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005070const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005071 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5072 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5073 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5074 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5075};
5076
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005077void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5078 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005079 Names = GCCRegNames;
5080 NumNames = llvm::array_lengthof(GCCRegNames);
5081}
5082
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005083const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005084 { { "g0" }, "r0" },
5085 { { "g1" }, "r1" },
5086 { { "g2" }, "r2" },
5087 { { "g3" }, "r3" },
5088 { { "g4" }, "r4" },
5089 { { "g5" }, "r5" },
5090 { { "g6" }, "r6" },
5091 { { "g7" }, "r7" },
5092 { { "o0" }, "r8" },
5093 { { "o1" }, "r9" },
5094 { { "o2" }, "r10" },
5095 { { "o3" }, "r11" },
5096 { { "o4" }, "r12" },
5097 { { "o5" }, "r13" },
5098 { { "o6", "sp" }, "r14" },
5099 { { "o7" }, "r15" },
5100 { { "l0" }, "r16" },
5101 { { "l1" }, "r17" },
5102 { { "l2" }, "r18" },
5103 { { "l3" }, "r19" },
5104 { { "l4" }, "r20" },
5105 { { "l5" }, "r21" },
5106 { { "l6" }, "r22" },
5107 { { "l7" }, "r23" },
5108 { { "i0" }, "r24" },
5109 { { "i1" }, "r25" },
5110 { { "i2" }, "r26" },
5111 { { "i3" }, "r27" },
5112 { { "i4" }, "r28" },
5113 { { "i5" }, "r29" },
5114 { { "i6", "fp" }, "r30" },
5115 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005116};
5117
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005118void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5119 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005120 Aliases = GCCRegAliases;
5121 NumAliases = llvm::array_lengthof(GCCRegAliases);
5122}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005123
5124// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5125class SparcV8TargetInfo : public SparcTargetInfo {
5126public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005127 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005128 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005129 }
5130
Craig Topper3164f332014-03-11 03:39:26 +00005131 void getTargetDefines(const LangOptions &Opts,
5132 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005133 SparcTargetInfo::getTargetDefines(Opts, Builder);
5134 Builder.defineMacro("__sparcv8");
5135 }
5136};
5137
5138// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5139class SparcV9TargetInfo : public SparcTargetInfo {
5140public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005141 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005142 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005143 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005144 // This is an LP64 platform.
5145 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005146
5147 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005148 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005149 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005150 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005151 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005152 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005153
5154 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5155 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5156 LongDoubleWidth = 128;
5157 LongDoubleAlign = 128;
5158 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005159 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005160 }
5161
Craig Topper3164f332014-03-11 03:39:26 +00005162 void getTargetDefines(const LangOptions &Opts,
5163 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005164 SparcTargetInfo::getTargetDefines(Opts, Builder);
5165 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005166 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005167 // Solaris doesn't need these variants, but the BSDs do.
5168 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005169 Builder.defineMacro("__sparc64__");
5170 Builder.defineMacro("__sparc_v9__");
5171 Builder.defineMacro("__sparcv9__");
5172 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005173 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005174
Craig Topper3164f332014-03-11 03:39:26 +00005175 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005176 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5177 .Case("v9", true)
5178 .Case("ultrasparc", true)
5179 .Case("ultrasparc3", true)
5180 .Case("niagara", true)
5181 .Case("niagara2", true)
5182 .Case("niagara3", true)
5183 .Case("niagara4", true)
5184 .Default(false);
5185
5186 // No need to store the CPU yet. There aren't any CPU-specific
5187 // macros to define.
5188 return CPUKnown;
5189 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005190};
5191
Gabor Greif49991682008-02-21 16:29:08 +00005192} // end anonymous namespace.
5193
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005194namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005195class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005196public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005197 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5198 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005199 SizeType = UnsignedInt;
5200 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005201 }
5202};
5203} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005204
Chris Lattnerb781dc792008-05-08 05:58:21 +00005205namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005206class SystemZTargetInfo : public TargetInfo {
5207 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005208
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005209public:
5210 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5211 TLSSupported = true;
5212 IntWidth = IntAlign = 32;
5213 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5214 PointerWidth = PointerAlign = 64;
5215 LongDoubleWidth = 128;
5216 LongDoubleAlign = 64;
5217 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5218 MinGlobalAlign = 16;
5219 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5220 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5221 }
5222 void getTargetDefines(const LangOptions &Opts,
5223 MacroBuilder &Builder) const override {
5224 Builder.defineMacro("__s390__");
5225 Builder.defineMacro("__s390x__");
5226 Builder.defineMacro("__zarch__");
5227 Builder.defineMacro("__LONG_DOUBLE_128__");
5228 }
5229 void getTargetBuiltins(const Builtin::Info *&Records,
5230 unsigned &NumRecords) const override {
5231 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005232 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005233 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005234 }
5235
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005236 void getGCCRegNames(const char *const *&Names,
5237 unsigned &NumNames) const override;
5238 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5239 unsigned &NumAliases) const override {
5240 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005241 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005242 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005243 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005244 bool validateAsmConstraint(const char *&Name,
5245 TargetInfo::ConstraintInfo &info) const override;
5246 const char *getClobbers() const override {
5247 // FIXME: Is this really right?
5248 return "";
5249 }
5250 BuiltinVaListKind getBuiltinVaListKind() const override {
5251 return TargetInfo::SystemZBuiltinVaList;
5252 }
5253 bool setCPU(const std::string &Name) override {
5254 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5255 .Case("z10", true)
5256 .Case("z196", true)
5257 .Case("zEC12", true)
5258 .Default(false);
5259
5260 // No need to store the CPU yet. There aren't any CPU-specific
5261 // macros to define.
5262 return CPUKnown;
5263 }
5264};
5265
5266const char *const SystemZTargetInfo::GCCRegNames[] = {
5267 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5268 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5269 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5270 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5271};
5272
5273void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5274 unsigned &NumNames) const {
5275 Names = GCCRegNames;
5276 NumNames = llvm::array_lengthof(GCCRegNames);
5277}
5278
5279bool SystemZTargetInfo::
5280validateAsmConstraint(const char *&Name,
5281 TargetInfo::ConstraintInfo &Info) const {
5282 switch (*Name) {
5283 default:
5284 return false;
5285
5286 case 'a': // Address register
5287 case 'd': // Data register (equivalent to 'r')
5288 case 'f': // Floating-point register
5289 Info.setAllowsRegister();
5290 return true;
5291
5292 case 'I': // Unsigned 8-bit constant
5293 case 'J': // Unsigned 12-bit constant
5294 case 'K': // Signed 16-bit constant
5295 case 'L': // Signed 20-bit displacement (on all targets we support)
5296 case 'M': // 0x7fffffff
5297 return true;
5298
5299 case 'Q': // Memory with base and unsigned 12-bit displacement
5300 case 'R': // Likewise, plus an index
5301 case 'S': // Memory with base and signed 20-bit displacement
5302 case 'T': // Likewise, plus an index
5303 Info.setAllowsMemory();
5304 return true;
5305 }
5306}
Ulrich Weigand47445072013-05-06 16:26:41 +00005307}
5308
5309namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005310 class MSP430TargetInfo : public TargetInfo {
5311 static const char * const GCCRegNames[];
5312 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005313 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005314 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005315 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005316 IntWidth = 16; IntAlign = 16;
5317 LongWidth = 32; LongLongWidth = 64;
5318 LongAlign = LongLongAlign = 16;
5319 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005320 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005321 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005322 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005323 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005324 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005325 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005326 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005327 }
5328 void getTargetDefines(const LangOptions &Opts,
5329 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005330 Builder.defineMacro("MSP430");
5331 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005332 // FIXME: defines for different 'flavours' of MCU
5333 }
Craig Topper3164f332014-03-11 03:39:26 +00005334 void getTargetBuiltins(const Builtin::Info *&Records,
5335 unsigned &NumRecords) const override {
5336 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005337 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005338 NumRecords = 0;
5339 }
Craig Topper3164f332014-03-11 03:39:26 +00005340 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005341 return Feature == "msp430";
5342 }
Craig Topper3164f332014-03-11 03:39:26 +00005343 void getGCCRegNames(const char * const *&Names,
5344 unsigned &NumNames) const override;
5345 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5346 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005347 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005348 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005349 NumAliases = 0;
5350 }
Craig Topper3164f332014-03-11 03:39:26 +00005351 bool validateAsmConstraint(const char *&Name,
5352 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005353 // No target constraints for now.
5354 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005355 }
Craig Topper3164f332014-03-11 03:39:26 +00005356 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005357 // FIXME: Is this really right?
5358 return "";
5359 }
Craig Topper3164f332014-03-11 03:39:26 +00005360 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005361 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005362 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005363 }
5364 };
5365
5366 const char * const MSP430TargetInfo::GCCRegNames[] = {
5367 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5368 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5369 };
5370
5371 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5372 unsigned &NumNames) const {
5373 Names = GCCRegNames;
5374 NumNames = llvm::array_lengthof(GCCRegNames);
5375 }
5376}
5377
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005378namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005379
Mike Stump11289f42009-09-09 15:08:12 +00005380 // LLVM and Clang cannot be used directly to output native binaries for
5381 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005382 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005383 //
5384 // TCE uses the llvm bitcode as input and uses it for generating customized
5385 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005386 // publicly available in http://tce.cs.tut.fi
5387
Eli Friedman1f191002011-10-07 19:51:42 +00005388 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5389 3, // opencl_global
5390 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005391 5, // opencl_constant
5392 0, // cuda_device
5393 0, // cuda_constant
5394 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005395 };
5396
Eli Friedmana9c3d712009-08-19 20:47:07 +00005397 class TCETargetInfo : public TargetInfo{
5398 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005399 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005400 TLSSupported = false;
5401 IntWidth = 32;
5402 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005403 PointerWidth = 32;
5404 IntAlign = 32;
5405 LongAlign = LongLongAlign = 32;
5406 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005407 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005408 SizeType = UnsignedInt;
5409 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005410 IntPtrType = SignedInt;
5411 PtrDiffType = SignedInt;
5412 FloatWidth = 32;
5413 FloatAlign = 32;
5414 DoubleWidth = 32;
5415 DoubleAlign = 32;
5416 LongDoubleWidth = 32;
5417 LongDoubleAlign = 32;
5418 FloatFormat = &llvm::APFloat::IEEEsingle;
5419 DoubleFormat = &llvm::APFloat::IEEEsingle;
5420 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005421 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5422 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005423 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005424 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005425 }
5426
Craig Topper3164f332014-03-11 03:39:26 +00005427 void getTargetDefines(const LangOptions &Opts,
5428 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005429 DefineStd(Builder, "tce", Opts);
5430 Builder.defineMacro("__TCE__");
5431 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005432 }
Craig Topper3164f332014-03-11 03:39:26 +00005433 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005434 return Feature == "tce";
5435 }
Craig Topper3164f332014-03-11 03:39:26 +00005436
5437 void getTargetBuiltins(const Builtin::Info *&Records,
5438 unsigned &NumRecords) const override {}
5439 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005440 return "";
5441 }
Craig Topper3164f332014-03-11 03:39:26 +00005442 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005443 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005444 }
Craig Topper3164f332014-03-11 03:39:26 +00005445 void getGCCRegNames(const char * const *&Names,
5446 unsigned &NumNames) const override {}
5447 bool validateAsmConstraint(const char *&Name,
5448 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005449 return true;
5450 }
Craig Topper3164f332014-03-11 03:39:26 +00005451 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5452 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005453 };
5454}
5455
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005456namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005457class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005458 virtual void setDescriptionString() = 0;
5459
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005460 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005461 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005462 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005463 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005464 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005465 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005466 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005467 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005468 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005469 enum DspRevEnum {
5470 NoDSP, DSP1, DSP2
5471 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005472 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005473
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005474protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005475 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005476 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005477
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005478public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005479 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5480 const std::string &CPUStr)
5481 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005482 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005483 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005484
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005485 bool isNaN2008Default() const {
5486 return CPU == "mips32r6" || CPU == "mips64r6";
5487 }
5488
5489 bool isFP64Default() const {
5490 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5491 }
5492
Alp Toker4925ba72014-06-07 23:30:42 +00005493 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005494 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005495 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5496 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005497 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005498 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005499 .Case("mips1", IsMips32)
5500 .Case("mips2", IsMips32)
5501 .Case("mips3", true)
5502 .Case("mips4", true)
5503 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005504 .Case("mips32", IsMips32)
5505 .Case("mips32r2", IsMips32)
5506 .Case("mips32r6", IsMips32)
5507 .Case("mips64", true)
5508 .Case("mips64r2", true)
5509 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005510 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005511 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005512 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005513 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005514 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005515 // The backend enables certain ABI's by default according to the
5516 // architecture.
5517 // Disable both possible defaults so that we don't end up with multiple
5518 // ABI's selected and trigger an assertion.
5519 Features["o32"] = false;
5520 Features["n64"] = false;
5521
Eric Christopher0b26a612010-03-02 02:41:08 +00005522 Features[ABI] = true;
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005523 if (CPU == "octeon")
5524 Features["mips64r2"] = Features["cnmips"] = true;
5525 else
5526 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005527 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005528
Craig Topper3164f332014-03-11 03:39:26 +00005529 void getTargetDefines(const LangOptions &Opts,
5530 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005531 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005532 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005533 if (Opts.GNUMode)
5534 Builder.defineMacro("mips");
5535
Simon Atanasyan683535b2012-08-29 19:14:58 +00005536 Builder.defineMacro("__REGISTER_PREFIX__", "");
5537
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005538 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005539 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005540 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005541 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005542 case SoftFloat:
5543 Builder.defineMacro("__mips_soft_float", Twine(1));
5544 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005545 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005546
Simon Atanasyan16071912013-04-14 14:07:30 +00005547 if (IsSingleFloat)
5548 Builder.defineMacro("__mips_single_float", Twine(1));
5549
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005550 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5551 Builder.defineMacro("_MIPS_FPSET",
5552 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5553
Simon Atanasyan72244b62012-07-05 16:06:06 +00005554 if (IsMips16)
5555 Builder.defineMacro("__mips16", Twine(1));
5556
Simon Atanasyan60777612013-04-14 14:07:51 +00005557 if (IsMicromips)
5558 Builder.defineMacro("__mips_micromips", Twine(1));
5559
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005560 if (IsNan2008)
5561 Builder.defineMacro("__mips_nan2008", Twine(1));
5562
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005563 switch (DspRev) {
5564 default:
5565 break;
5566 case DSP1:
5567 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5568 Builder.defineMacro("__mips_dsp", Twine(1));
5569 break;
5570 case DSP2:
5571 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5572 Builder.defineMacro("__mips_dspr2", Twine(1));
5573 Builder.defineMacro("__mips_dsp", Twine(1));
5574 break;
5575 }
5576
Jack Carter44ff1e52013-08-12 17:20:29 +00005577 if (HasMSA)
5578 Builder.defineMacro("__mips_msa", Twine(1));
5579
Simon Atanasyan26f19672012-04-05 19:28:31 +00005580 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5581 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5582 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005583
5584 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5585 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005586 }
5587
Craig Topper3164f332014-03-11 03:39:26 +00005588 void getTargetBuiltins(const Builtin::Info *&Records,
5589 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005590 Records = BuiltinInfo;
5591 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005592 }
Craig Topper3164f332014-03-11 03:39:26 +00005593 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005594 return llvm::StringSwitch<bool>(Feature)
5595 .Case("mips", true)
5596 .Case("fp64", HasFP64)
5597 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005598 }
Craig Topper3164f332014-03-11 03:39:26 +00005599 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005600 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005601 }
Craig Topper3164f332014-03-11 03:39:26 +00005602 void getGCCRegNames(const char * const *&Names,
5603 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005604 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005605 // CPU register names
5606 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005607 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5608 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5609 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005610 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5611 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005612 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5613 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5614 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5615 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005616 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005617 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005618 "$fcc5","$fcc6","$fcc7",
5619 // MSA register names
5620 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5621 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5622 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5623 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5624 // MSA control register names
5625 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5626 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005627 };
5628 Names = GCCRegNames;
5629 NumNames = llvm::array_lengthof(GCCRegNames);
5630 }
Craig Topper3164f332014-03-11 03:39:26 +00005631 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5632 unsigned &NumAliases) const override = 0;
5633 bool validateAsmConstraint(const char *&Name,
5634 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005635 switch (*Name) {
5636 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005637 return false;
5638
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005639 case 'r': // CPU registers.
5640 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005641 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005642 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005643 case 'c': // $25 for indirect jumps
5644 case 'l': // lo register
5645 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005646 Info.setAllowsRegister();
5647 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005648 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005649 Info.setAllowsMemory();
5650 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005651 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005652 }
5653
Craig Topper3164f332014-03-11 03:39:26 +00005654 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005655 // FIXME: Implement!
5656 return "";
5657 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005658
Craig Topper3164f332014-03-11 03:39:26 +00005659 bool handleTargetFeatures(std::vector<std::string> &Features,
5660 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005661 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005662 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005663 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005664 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005665 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005666 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005667 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005668
5669 for (std::vector<std::string>::iterator it = Features.begin(),
5670 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005671 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005672 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005673 else if (*it == "+soft-float")
5674 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005675 else if (*it == "+mips16")
5676 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005677 else if (*it == "+micromips")
5678 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005679 else if (*it == "+dsp")
5680 DspRev = std::max(DspRev, DSP1);
5681 else if (*it == "+dspr2")
5682 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005683 else if (*it == "+msa")
5684 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005685 else if (*it == "+fp64")
5686 HasFP64 = true;
5687 else if (*it == "-fp64")
5688 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005689 else if (*it == "+nan2008")
5690 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005691 else if (*it == "-nan2008")
5692 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005693 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005694
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005695 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005696 std::vector<std::string>::iterator it =
5697 std::find(Features.begin(), Features.end(), "+soft-float");
5698 if (it != Features.end())
5699 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005700
Akira Hatanaka9064e362013-10-29 18:30:33 +00005701 setDescriptionString();
5702
Rafael Espindolaeb265472013-08-21 21:59:03 +00005703 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005704 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005705
Craig Topper3164f332014-03-11 03:39:26 +00005706 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005707 if (RegNo == 0) return 4;
5708 if (RegNo == 1) return 5;
5709 return -1;
5710 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005711
5712 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005713};
5714
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005715const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5716#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5717#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5718 ALL_LANGUAGES },
5719#include "clang/Basic/BuiltinsMips.def"
5720};
5721
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005722class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005723public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005724 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005725 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005726 SizeType = UnsignedInt;
5727 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005728 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005729 }
Craig Topper3164f332014-03-11 03:39:26 +00005730 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005731 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005732 ABI = Name;
5733 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005734 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005735 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005736 }
Craig Topper3164f332014-03-11 03:39:26 +00005737 void getTargetDefines(const LangOptions &Opts,
5738 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005739 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005740
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005741 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005742 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5743
5744 const std::string& CPUStr = getCPU();
5745 if (CPUStr == "mips32")
5746 Builder.defineMacro("__mips_isa_rev", "1");
5747 else if (CPUStr == "mips32r2")
5748 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005749
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005750 if (ABI == "o32") {
5751 Builder.defineMacro("__mips_o32");
5752 Builder.defineMacro("_ABIO32", "1");
5753 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5754 }
5755 else if (ABI == "eabi")
5756 Builder.defineMacro("__mips_eabi");
5757 else
David Blaikie83d382b2011-09-23 05:06:16 +00005758 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005759 }
Craig Topper3164f332014-03-11 03:39:26 +00005760 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5761 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005762 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5763 { { "at" }, "$1" },
5764 { { "v0" }, "$2" },
5765 { { "v1" }, "$3" },
5766 { { "a0" }, "$4" },
5767 { { "a1" }, "$5" },
5768 { { "a2" }, "$6" },
5769 { { "a3" }, "$7" },
5770 { { "t0" }, "$8" },
5771 { { "t1" }, "$9" },
5772 { { "t2" }, "$10" },
5773 { { "t3" }, "$11" },
5774 { { "t4" }, "$12" },
5775 { { "t5" }, "$13" },
5776 { { "t6" }, "$14" },
5777 { { "t7" }, "$15" },
5778 { { "s0" }, "$16" },
5779 { { "s1" }, "$17" },
5780 { { "s2" }, "$18" },
5781 { { "s3" }, "$19" },
5782 { { "s4" }, "$20" },
5783 { { "s5" }, "$21" },
5784 { { "s6" }, "$22" },
5785 { { "s7" }, "$23" },
5786 { { "t8" }, "$24" },
5787 { { "t9" }, "$25" },
5788 { { "k0" }, "$26" },
5789 { { "k1" }, "$27" },
5790 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005791 { { "sp","$sp" }, "$29" },
5792 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005793 { { "ra" }, "$31" }
5794 };
5795 Aliases = GCCRegAliases;
5796 NumAliases = llvm::array_lengthof(GCCRegAliases);
5797 }
5798};
5799
5800class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005801 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005802 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005803 }
5804
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005805public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005806 Mips32EBTargetInfo(const llvm::Triple &Triple)
5807 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005808 }
Craig Topper3164f332014-03-11 03:39:26 +00005809 void getTargetDefines(const LangOptions &Opts,
5810 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005811 DefineStd(Builder, "MIPSEB", Opts);
5812 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005813 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005814 }
5815};
5816
5817class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005818 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005819 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005820 }
5821
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005822public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005823 Mips32ELTargetInfo(const llvm::Triple &Triple)
5824 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005825 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005826 }
Craig Topper3164f332014-03-11 03:39:26 +00005827 void getTargetDefines(const LangOptions &Opts,
5828 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005829 DefineStd(Builder, "MIPSEL", Opts);
5830 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005831 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005832 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005833};
Akira Hatanakabef17452011-09-20 19:21:49 +00005834
5835class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005836public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005837 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005838 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005839 LongDoubleWidth = LongDoubleAlign = 128;
5840 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005841 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5842 LongDoubleWidth = LongDoubleAlign = 64;
5843 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5844 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005845 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005846 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005847 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005848 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005849
5850 void setN64ABITypes() {
5851 LongWidth = LongAlign = 64;
5852 PointerWidth = PointerAlign = 64;
5853 SizeType = UnsignedLong;
5854 PtrDiffType = SignedLong;
5855 }
5856
5857 void setN32ABITypes() {
5858 LongWidth = LongAlign = 32;
5859 PointerWidth = PointerAlign = 32;
5860 SizeType = UnsignedInt;
5861 PtrDiffType = SignedInt;
5862 }
5863
Craig Topper3164f332014-03-11 03:39:26 +00005864 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005865 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005866 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005867 ABI = Name;
5868 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005869 }
Simon Atanasyanad805952014-07-01 10:59:09 +00005870 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005871 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00005872 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005873 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005874 }
5875 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005876 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005877
Craig Topper3164f332014-03-11 03:39:26 +00005878 void getTargetDefines(const LangOptions &Opts,
5879 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005880 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005881
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005882 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005883 Builder.defineMacro("__mips64");
5884 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005885 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
5886
5887 const std::string& CPUStr = getCPU();
5888 if (CPUStr == "mips64")
5889 Builder.defineMacro("__mips_isa_rev", "1");
5890 else if (CPUStr == "mips64r2")
5891 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005892
Akira Hatanakabef17452011-09-20 19:21:49 +00005893 if (ABI == "n32") {
5894 Builder.defineMacro("__mips_n32");
5895 Builder.defineMacro("_ABIN32", "2");
5896 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5897 }
5898 else if (ABI == "n64") {
5899 Builder.defineMacro("__mips_n64");
5900 Builder.defineMacro("_ABI64", "3");
5901 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5902 }
5903 else
David Blaikie83d382b2011-09-23 05:06:16 +00005904 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005905 }
Craig Topper3164f332014-03-11 03:39:26 +00005906 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5907 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005908 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5909 { { "at" }, "$1" },
5910 { { "v0" }, "$2" },
5911 { { "v1" }, "$3" },
5912 { { "a0" }, "$4" },
5913 { { "a1" }, "$5" },
5914 { { "a2" }, "$6" },
5915 { { "a3" }, "$7" },
5916 { { "a4" }, "$8" },
5917 { { "a5" }, "$9" },
5918 { { "a6" }, "$10" },
5919 { { "a7" }, "$11" },
5920 { { "t0" }, "$12" },
5921 { { "t1" }, "$13" },
5922 { { "t2" }, "$14" },
5923 { { "t3" }, "$15" },
5924 { { "s0" }, "$16" },
5925 { { "s1" }, "$17" },
5926 { { "s2" }, "$18" },
5927 { { "s3" }, "$19" },
5928 { { "s4" }, "$20" },
5929 { { "s5" }, "$21" },
5930 { { "s6" }, "$22" },
5931 { { "s7" }, "$23" },
5932 { { "t8" }, "$24" },
5933 { { "t9" }, "$25" },
5934 { { "k0" }, "$26" },
5935 { { "k1" }, "$27" },
5936 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005937 { { "sp","$sp" }, "$29" },
5938 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005939 { { "ra" }, "$31" }
5940 };
5941 Aliases = GCCRegAliases;
5942 NumAliases = llvm::array_lengthof(GCCRegAliases);
5943 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00005944
5945 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00005946};
5947
5948class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005949 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005950 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005951 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 +00005952 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005953 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005954
Akira Hatanakabef17452011-09-20 19:21:49 +00005955 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005956
Akira Hatanakabef17452011-09-20 19:21:49 +00005957public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005958 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005959 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005960 void getTargetDefines(const LangOptions &Opts,
5961 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005962 DefineStd(Builder, "MIPSEB", Opts);
5963 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005964 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005965 }
5966};
5967
5968class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005969 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005970 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005971 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 +00005972 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005973 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005974 }
5975public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005976 Mips64ELTargetInfo(const llvm::Triple &Triple)
5977 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005978 // Default ABI is n64.
5979 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005980 }
Craig Topper3164f332014-03-11 03:39:26 +00005981 void getTargetDefines(const LangOptions &Opts,
5982 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005983 DefineStd(Builder, "MIPSEL", Opts);
5984 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005985 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005986 }
5987};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005988} // end anonymous namespace.
5989
Ivan Krasindd7403e2011-08-24 20:22:22 +00005990namespace {
5991class PNaClTargetInfo : public TargetInfo {
5992public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005993 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005994 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00005995 this->UserLabelPrefix = "";
5996 this->LongAlign = 32;
5997 this->LongWidth = 32;
5998 this->PointerAlign = 32;
5999 this->PointerWidth = 32;
6000 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006001 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006002 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006003 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006004 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006005 this->SizeType = TargetInfo::UnsignedInt;
6006 this->PtrDiffType = TargetInfo::SignedInt;
6007 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006008 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006009 }
6010
Craig Topper3164f332014-03-11 03:39:26 +00006011 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006012 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006013 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006014 Builder.defineMacro("__le32__");
6015 Builder.defineMacro("__pnacl__");
6016 }
Craig Topper3164f332014-03-11 03:39:26 +00006017 void getTargetDefines(const LangOptions &Opts,
6018 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006019 getArchDefines(Opts, Builder);
6020 }
Craig Topper3164f332014-03-11 03:39:26 +00006021 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006022 return Feature == "pnacl";
6023 }
Craig Topper3164f332014-03-11 03:39:26 +00006024 void getTargetBuiltins(const Builtin::Info *&Records,
6025 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006026 }
Craig Topper3164f332014-03-11 03:39:26 +00006027 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006028 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006029 }
Craig Topper3164f332014-03-11 03:39:26 +00006030 void getGCCRegNames(const char * const *&Names,
6031 unsigned &NumNames) const override;
6032 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6033 unsigned &NumAliases) const override;
6034 bool validateAsmConstraint(const char *&Name,
6035 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006036 return false;
6037 }
6038
Craig Topper3164f332014-03-11 03:39:26 +00006039 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006040 return "";
6041 }
6042};
6043
6044void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6045 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006046 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006047 NumNames = 0;
6048}
6049
6050void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6051 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006052 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006053 NumAliases = 0;
6054}
6055} // end anonymous namespace.
6056
Guy Benyeib798fc92012-12-11 21:38:14 +00006057namespace {
JF Bastien643817d2014-09-12 17:52:47 +00006058class Le64TargetInfo : public TargetInfo {
6059 static const Builtin::Info BuiltinInfo[];
6060
6061public:
6062 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6063 BigEndian = false;
6064 NoAsmVariants = true;
6065 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6066 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6067 DescriptionString =
6068 "e-S128-p:64:64-v16:16-v32:32-v64:64-v96:32-v128:32-m:e-n8:16:32:64";
6069 }
6070
6071 void getTargetDefines(const LangOptions &Opts,
6072 MacroBuilder &Builder) const override {
6073 DefineStd(Builder, "unix", Opts);
6074 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6075 Builder.defineMacro("__ELF__");
6076 }
6077 void getTargetBuiltins(const Builtin::Info *&Records,
6078 unsigned &NumRecords) const override {
6079 Records = BuiltinInfo;
6080 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6081 }
6082 BuiltinVaListKind getBuiltinVaListKind() const override {
6083 return TargetInfo::PNaClABIBuiltinVaList;
6084 }
6085 const char *getClobbers() const override { return ""; }
6086 void getGCCRegNames(const char *const *&Names,
6087 unsigned &NumNames) const override {
6088 Names = nullptr;
6089 NumNames = 0;
6090 }
6091 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6092 unsigned &NumAliases) const override {
6093 Aliases = nullptr;
6094 NumAliases = 0;
6095 }
6096 bool validateAsmConstraint(const char *&Name,
6097 TargetInfo::ConstraintInfo &Info) const override {
6098 return false;
6099 }
6100
6101 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006102};
6103} // end anonymous namespace.
6104
6105const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6106#define BUILTIN(ID, TYPE, ATTRS) \
6107 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6108#include "clang/Basic/BuiltinsLe64.def"
6109};
6110
6111namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006112 static const unsigned SPIRAddrSpaceMap[] = {
6113 1, // opencl_global
6114 3, // opencl_local
6115 2, // opencl_constant
6116 0, // cuda_device
6117 0, // cuda_constant
6118 0 // cuda_shared
6119 };
6120 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006121 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006122 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006123 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6124 "SPIR target must use unknown OS");
6125 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6126 "SPIR target must use unknown environment type");
6127 BigEndian = false;
6128 TLSSupported = false;
6129 LongWidth = LongAlign = 64;
6130 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006131 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006132 // Define available target features
6133 // These must be defined in sorted order!
6134 NoAsmVariants = true;
6135 }
Craig Topper3164f332014-03-11 03:39:26 +00006136 void getTargetDefines(const LangOptions &Opts,
6137 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006138 DefineStd(Builder, "SPIR", Opts);
6139 }
Craig Topper3164f332014-03-11 03:39:26 +00006140 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006141 return Feature == "spir";
6142 }
Craig Topper3164f332014-03-11 03:39:26 +00006143
6144 void getTargetBuiltins(const Builtin::Info *&Records,
6145 unsigned &NumRecords) const override {}
6146 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006147 return "";
6148 }
Craig Topper3164f332014-03-11 03:39:26 +00006149 void getGCCRegNames(const char * const *&Names,
6150 unsigned &NumNames) const override {}
6151 bool validateAsmConstraint(const char *&Name,
6152 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006153 return true;
6154 }
Craig Topper3164f332014-03-11 03:39:26 +00006155 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6156 unsigned &NumAliases) const override {}
6157 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006158 return TargetInfo::VoidPtrBuiltinVaList;
6159 }
6160 };
6161
6162
6163 class SPIR32TargetInfo : public SPIRTargetInfo {
6164 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006165 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006166 PointerWidth = PointerAlign = 32;
6167 SizeType = TargetInfo::UnsignedInt;
6168 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6169 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006170 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6171 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006172 }
Craig Topper3164f332014-03-11 03:39:26 +00006173 void getTargetDefines(const LangOptions &Opts,
6174 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006175 DefineStd(Builder, "SPIR32", Opts);
6176 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006177 };
6178
6179 class SPIR64TargetInfo : public SPIRTargetInfo {
6180 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006181 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006182 PointerWidth = PointerAlign = 64;
6183 SizeType = TargetInfo::UnsignedLong;
6184 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006185 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6186 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006187 }
Craig Topper3164f332014-03-11 03:39:26 +00006188 void getTargetDefines(const LangOptions &Opts,
6189 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006190 DefineStd(Builder, "SPIR64", Opts);
6191 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006192 };
6193}
6194
Robert Lytton0e076492013-08-13 09:43:10 +00006195namespace {
6196class XCoreTargetInfo : public TargetInfo {
6197 static const Builtin::Info BuiltinInfo[];
6198public:
6199 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6200 BigEndian = false;
6201 NoAsmVariants = true;
6202 LongLongAlign = 32;
6203 SuitableAlign = 32;
6204 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006205 SizeType = UnsignedInt;
6206 PtrDiffType = SignedInt;
6207 IntPtrType = SignedInt;
6208 WCharType = UnsignedChar;
6209 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006210 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006211 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 +00006212 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006213 }
Craig Topper3164f332014-03-11 03:39:26 +00006214 void getTargetDefines(const LangOptions &Opts,
6215 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006216 Builder.defineMacro("__XS1B__");
6217 }
Craig Topper3164f332014-03-11 03:39:26 +00006218 void getTargetBuiltins(const Builtin::Info *&Records,
6219 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006220 Records = BuiltinInfo;
6221 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6222 }
Craig Topper3164f332014-03-11 03:39:26 +00006223 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006224 return TargetInfo::VoidPtrBuiltinVaList;
6225 }
Craig Topper3164f332014-03-11 03:39:26 +00006226 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006227 return "";
6228 }
Craig Topper3164f332014-03-11 03:39:26 +00006229 void getGCCRegNames(const char * const *&Names,
6230 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006231 static const char * const GCCRegNames[] = {
6232 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6233 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6234 };
6235 Names = GCCRegNames;
6236 NumNames = llvm::array_lengthof(GCCRegNames);
6237 }
Craig Topper3164f332014-03-11 03:39:26 +00006238 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6239 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006240 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006241 NumAliases = 0;
6242 }
Craig Topper3164f332014-03-11 03:39:26 +00006243 bool validateAsmConstraint(const char *&Name,
6244 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006245 return false;
6246 }
Craig Topper3164f332014-03-11 03:39:26 +00006247 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006248 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6249 return (RegNo < 2)? RegNo : -1;
6250 }
Robert Lytton0e076492013-08-13 09:43:10 +00006251};
6252
6253const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6254#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6255#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6256 ALL_LANGUAGES },
6257#include "clang/Basic/BuiltinsXCore.def"
6258};
6259} // end anonymous namespace.
6260
Ivan Krasindd7403e2011-08-24 20:22:22 +00006261
Chris Lattner5ba61f02006-10-14 07:39:34 +00006262//===----------------------------------------------------------------------===//
6263// Driver code
6264//===----------------------------------------------------------------------===//
6265
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006266static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006267 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006268
Daniel Dunbar52322032009-08-18 05:47:58 +00006269 switch (Triple.getArch()) {
6270 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006271 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006272
Tim Northover2a0783d2014-05-30 14:14:07 +00006273 case llvm::Triple::xcore:
6274 return new XCoreTargetInfo(Triple);
6275
6276 case llvm::Triple::hexagon:
6277 return new HexagonTargetInfo(Triple);
6278
6279 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006280 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006281 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006282
6283 switch (os) {
6284 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006285 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006286 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006287 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006288 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006289 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006290 }
6291
Christian Pirker9b019ae2014-02-25 13:51:00 +00006292 case llvm::Triple::aarch64_be:
6293 switch (os) {
6294 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006295 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006296 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006297 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006298 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006299 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006300 }
6301
Daniel Dunbar52322032009-08-18 05:47:58 +00006302 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006303 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006304 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006305 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006306
Daniel Dunbar52322032009-08-18 05:47:58 +00006307 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006308 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006309 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006310 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006311 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006312 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006313 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006314 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006315 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006316 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006317 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006318 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006319 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006320 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006321 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006322 case llvm::Triple::Win32:
6323 switch (Triple.getEnvironment()) {
6324 default:
6325 return new ARMleTargetInfo(Triple);
6326 case llvm::Triple::Itanium:
6327 return new ItaniumWindowsARMleTargetInfo(Triple);
6328 case llvm::Triple::MSVC:
6329 return new MicrosoftARMleTargetInfo(Triple);
6330 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006331 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006332 return new ARMleTargetInfo(Triple);
6333 }
6334
6335 case llvm::Triple::armeb:
6336 case llvm::Triple::thumbeb:
6337 if (Triple.isOSDarwin())
6338 return new DarwinARMTargetInfo(Triple);
6339
6340 switch (os) {
6341 case llvm::Triple::Linux:
6342 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6343 case llvm::Triple::FreeBSD:
6344 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6345 case llvm::Triple::NetBSD:
6346 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6347 case llvm::Triple::OpenBSD:
6348 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6349 case llvm::Triple::Bitrig:
6350 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6351 case llvm::Triple::RTEMS:
6352 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6353 case llvm::Triple::NaCl:
6354 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6355 default:
6356 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006357 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006358
Daniel Dunbar52322032009-08-18 05:47:58 +00006359 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006360 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006361
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006362 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006363 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006364 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006365 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006366 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006367 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006368 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006369 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006370 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006371 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006372 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006373 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006374 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006375
6376 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006377 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006378 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006379 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006380 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006381 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006382 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006383 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006384 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006385 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006386 case llvm::Triple::NaCl:
6387 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006388 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006389 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006390 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006391
Akira Hatanakabef17452011-09-20 19:21:49 +00006392 case llvm::Triple::mips64:
6393 switch (os) {
6394 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006395 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006396 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006397 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006398 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006399 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006400 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006401 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006402 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006403 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006404 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006405 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006406 }
6407
6408 case llvm::Triple::mips64el:
6409 switch (os) {
6410 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006411 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006412 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006413 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006414 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006415 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006416 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006417 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006418 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006419 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006420 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006421 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006422 }
6423
Ivan Krasindd7403e2011-08-24 20:22:22 +00006424 case llvm::Triple::le32:
6425 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006426 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006427 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006428 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006429 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006430 }
6431
JF Bastien643817d2014-09-12 17:52:47 +00006432 case llvm::Triple::le64:
6433 return new Le64TargetInfo(Triple);
6434
Daniel Dunbar52322032009-08-18 05:47:58 +00006435 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006436 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006437 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006438 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006439 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006440 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006441 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006442 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006443 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006444 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006445 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006446 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006447 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006448 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006449 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006450 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006451 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006452
6453 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006454 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006455 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006456 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006457 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006458 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006459 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006460 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006461 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006462 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006463 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006464 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006465 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006466 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006467 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006468
Bill Schmidt778d3872013-07-26 01:36:11 +00006469 case llvm::Triple::ppc64le:
6470 switch (os) {
6471 case llvm::Triple::Linux:
6472 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6473 default:
6474 return new PPC64TargetInfo(Triple);
6475 }
6476
Peter Collingbournec947aae2012-05-20 23:28:41 +00006477 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006478 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006479 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006480 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006481
Eli Friedmand13b41e2012-10-12 23:32:00 +00006482 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006483 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006484
Daniel Dunbar52322032009-08-18 05:47:58 +00006485 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006486 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006487 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006488 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006489 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006490 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006491 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006492 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006493 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006494 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006495 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006496 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006497 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006498 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006499 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006500
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006501 case llvm::Triple::sparcv9:
6502 switch (os) {
6503 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006504 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006505 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006506 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006507 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006508 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006509 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006510 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006511 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006512 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006513 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006514 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006515 }
6516
Ulrich Weigand47445072013-05-06 16:26:41 +00006517 case llvm::Triple::systemz:
6518 switch (os) {
6519 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006520 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006521 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006522 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006523 }
6524
Eli Friedmana9c3d712009-08-19 20:47:07 +00006525 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006526 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006527
Daniel Dunbar52322032009-08-18 05:47:58 +00006528 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006529 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006530 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006531
Daniel Dunbar52322032009-08-18 05:47:58 +00006532 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006533 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006534 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006535 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006536 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006537 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006538 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006539 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006540 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006541 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006542 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006543 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006544 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006545 case llvm::Triple::KFreeBSD:
6546 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006547 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006548 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006549 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006550 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006551 case llvm::Triple::Win32: {
6552 switch (Triple.getEnvironment()) {
6553 default:
6554 return new X86_32TargetInfo(Triple);
6555 case llvm::Triple::Cygnus:
6556 return new CygwinX86_32TargetInfo(Triple);
6557 case llvm::Triple::GNU:
6558 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006559 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006560 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006561 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006562 }
6563 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006564 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006565 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006566 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006567 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006568 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006569 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006570 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006571 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006572 }
6573
6574 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006575 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006576 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006577
Daniel Dunbar52322032009-08-18 05:47:58 +00006578 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006579 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006580 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006581 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006582 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006583 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006584 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006585 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006586 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006587 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006588 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006589 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006590 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006591 case llvm::Triple::KFreeBSD:
6592 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006593 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006594 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006595 case llvm::Triple::Win32: {
6596 switch (Triple.getEnvironment()) {
6597 default:
6598 return new X86_64TargetInfo(Triple);
6599 case llvm::Triple::GNU:
6600 return new MinGWX86_64TargetInfo(Triple);
6601 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006602 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006603 }
6604 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006605 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006606 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006607 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006608 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006609 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006610
6611 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006612 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006613 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006614 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006615 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006616 }
6617 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006618 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006619 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006620 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006621 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006622 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006623 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006624}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006625
6626/// CreateTargetInfo - Return the target info object for the specified target
6627/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006628TargetInfo *
6629TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6630 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006631 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006632
6633 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006634 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006635 if (!Target) {
6636 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006637 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006638 }
Alp Toker80758082014-07-06 05:26:44 +00006639 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006640
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006641 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006642 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6643 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006644 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006645 }
6646
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006647 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006648 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6649 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006650 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006651 }
6652
Rafael Espindolaeb265472013-08-21 21:59:03 +00006653 // Set the fp math unit.
6654 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6655 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006656 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006657 }
6658
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006659 // Compute the default target features, we need the target to handle this
6660 // because features may have dependencies on one another.
6661 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006662 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006663
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006664 // Apply the user specified deltas.
6665 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6666 I < N; ++I) {
6667 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006668 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006669 bool Enabled = Name[0] == '+';
6670 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006671 }
6672
6673 // Add the features to the compile options.
6674 //
6675 // FIXME: If we are completely confident that we have the right set, we only
6676 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006677 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006678 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6679 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006680 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006681 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006682 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006683
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006684 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006685}