blob: 8bdc7a53385efc535c16fc5c01a894ac7be9fc7c [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 {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001139 return llvm::StringSwitch<bool>(Feature)
1140 .Case("powerpc", true)
1141 .Case("vsx", HasVSX)
1142 .Case("power8-vector", HasP8Vector)
1143 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001144}
Chris Lattner17df24e2008-04-21 18:56:49 +00001145
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001146
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001147const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001148 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1149 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1150 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1151 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1152 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1153 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1154 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1155 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001156 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001157 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001158 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001159 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1160 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1161 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1162 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001163 "vrsave", "vscr",
1164 "spe_acc", "spefscr",
1165 "sfp"
1166};
Chris Lattner10a5b382007-01-29 05:24:35 +00001167
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001168void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001169 unsigned &NumNames) const {
1170 Names = GCCRegNames;
1171 NumNames = llvm::array_lengthof(GCCRegNames);
1172}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001173
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001174const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1175 // While some of these aliases do map to different registers
1176 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001177 { { "0" }, "r0" },
1178 { { "1"}, "r1" },
1179 { { "2" }, "r2" },
1180 { { "3" }, "r3" },
1181 { { "4" }, "r4" },
1182 { { "5" }, "r5" },
1183 { { "6" }, "r6" },
1184 { { "7" }, "r7" },
1185 { { "8" }, "r8" },
1186 { { "9" }, "r9" },
1187 { { "10" }, "r10" },
1188 { { "11" }, "r11" },
1189 { { "12" }, "r12" },
1190 { { "13" }, "r13" },
1191 { { "14" }, "r14" },
1192 { { "15" }, "r15" },
1193 { { "16" }, "r16" },
1194 { { "17" }, "r17" },
1195 { { "18" }, "r18" },
1196 { { "19" }, "r19" },
1197 { { "20" }, "r20" },
1198 { { "21" }, "r21" },
1199 { { "22" }, "r22" },
1200 { { "23" }, "r23" },
1201 { { "24" }, "r24" },
1202 { { "25" }, "r25" },
1203 { { "26" }, "r26" },
1204 { { "27" }, "r27" },
1205 { { "28" }, "r28" },
1206 { { "29" }, "r29" },
1207 { { "30" }, "r30" },
1208 { { "31" }, "r31" },
1209 { { "fr0" }, "f0" },
1210 { { "fr1" }, "f1" },
1211 { { "fr2" }, "f2" },
1212 { { "fr3" }, "f3" },
1213 { { "fr4" }, "f4" },
1214 { { "fr5" }, "f5" },
1215 { { "fr6" }, "f6" },
1216 { { "fr7" }, "f7" },
1217 { { "fr8" }, "f8" },
1218 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001219 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001220 { { "fr11" }, "f11" },
1221 { { "fr12" }, "f12" },
1222 { { "fr13" }, "f13" },
1223 { { "fr14" }, "f14" },
1224 { { "fr15" }, "f15" },
1225 { { "fr16" }, "f16" },
1226 { { "fr17" }, "f17" },
1227 { { "fr18" }, "f18" },
1228 { { "fr19" }, "f19" },
1229 { { "fr20" }, "f20" },
1230 { { "fr21" }, "f21" },
1231 { { "fr22" }, "f22" },
1232 { { "fr23" }, "f23" },
1233 { { "fr24" }, "f24" },
1234 { { "fr25" }, "f25" },
1235 { { "fr26" }, "f26" },
1236 { { "fr27" }, "f27" },
1237 { { "fr28" }, "f28" },
1238 { { "fr29" }, "f29" },
1239 { { "fr30" }, "f30" },
1240 { { "fr31" }, "f31" },
1241 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001242};
1243
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001244void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001245 unsigned &NumAliases) const {
1246 Aliases = GCCRegAliases;
1247 NumAliases = llvm::array_lengthof(GCCRegAliases);
1248}
1249} // end anonymous namespace.
Chris Lattner02dffbd2006-10-14 07:50:21 +00001250
Chris Lattner5ba61f02006-10-14 07:39:34 +00001251namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001252class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001253public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001254 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00001255 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001256
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001257 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001258 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001259 case llvm::Triple::FreeBSD:
1260 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001261 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001262 PtrDiffType = SignedInt;
1263 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001264 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001265 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001266 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001267 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001268
Roman Divacky3ffe7462012-03-13 19:20:17 +00001269 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1270 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001271 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001272 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001273
1274 // PPC32 supports atomics up to 4 bytes.
1275 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001276 }
1277
Craig Topper3164f332014-03-11 03:39:26 +00001278 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001279 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001280 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001281 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001282};
1283} // end anonymous namespace.
1284
Bill Schmidt778d3872013-07-26 01:36:11 +00001285// Note: ABI differences may eventually require us to have a separate
1286// TargetInfo for little endian.
Chris Lattner5ba61f02006-10-14 07:39:34 +00001287namespace {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001288class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001289public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001290 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001291 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001292 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001293 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001294
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001295 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1296 DescriptionString = "e-m:e-i64:64-n32:64";
1297 ABI = "elfv2";
1298 } else {
1299 DescriptionString = "E-m:e-i64:64-n32:64";
1300 ABI = "elfv1";
1301 }
1302
1303 switch (getTriple().getOS()) {
1304 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001305 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001306 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001307 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001308 case llvm::Triple::NetBSD:
1309 IntMaxType = SignedLongLong;
1310 Int64Type = SignedLongLong;
1311 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001312 default:
1313 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001314 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001315
1316 // PPC64 supports atomics up to 8 bytes.
1317 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001318 }
Craig Topper3164f332014-03-11 03:39:26 +00001319 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001320 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001321 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001322 // PPC64 Linux-specifc ABI options.
1323 bool setABI(const std::string &Name) override {
1324 if (Name == "elfv1" || Name == "elfv2") {
1325 ABI = Name;
1326 return true;
1327 }
1328 return false;
1329 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001330};
1331} // end anonymous namespace.
1332
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001333
1334namespace {
Roman Divacky965b0b72011-01-06 08:27:10 +00001335class DarwinPPC32TargetInfo :
1336 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001337public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001338 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1339 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001340 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001341 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopherc04fe092013-10-16 21:19:19 +00001342 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001343 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001344 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001345 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001346 }
Craig Topper3164f332014-03-11 03:39:26 +00001347 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001348 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001349 }
1350};
1351
1352class DarwinPPC64TargetInfo :
1353 public DarwinTargetInfo<PPC64TargetInfo> {
1354public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001355 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1356 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001357 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001358 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00001359 DescriptionString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001360 }
1361};
1362} // end anonymous namespace.
1363
Chris Lattner5ba61f02006-10-14 07:39:34 +00001364namespace {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001365 static const unsigned NVPTXAddrSpaceMap[] = {
1366 1, // opencl_global
1367 3, // opencl_local
1368 4, // opencl_constant
1369 1, // cuda_device
1370 4, // cuda_constant
1371 3, // cuda_shared
1372 };
1373 class NVPTXTargetInfo : public TargetInfo {
1374 static const char * const GCCRegNames[];
Justin Holewinski83e96682012-05-24 17:43:12 +00001375 static const Builtin::Info BuiltinInfo[];
Peter Collingbournec947aae2012-05-20 23:28:41 +00001376 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001377 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001378 BigEndian = false;
1379 TLSSupported = false;
1380 LongWidth = LongAlign = 64;
1381 AddrSpaceMap = &NVPTXAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001382 UseAddrSpaceMapMangling = true;
Justin Holewinski83e96682012-05-24 17:43:12 +00001383 // Define available target features
1384 // These must be defined in sorted order!
Justin Holewinski5fafdd92012-07-11 15:34:55 +00001385 NoAsmVariants = true;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001386 }
Craig Topper3164f332014-03-11 03:39:26 +00001387 void getTargetDefines(const LangOptions &Opts,
1388 MacroBuilder &Builder) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001389 Builder.defineMacro("__PTX__");
Justin Holewinski83e96682012-05-24 17:43:12 +00001390 Builder.defineMacro("__NVPTX__");
Peter Collingbournec947aae2012-05-20 23:28:41 +00001391 }
Craig Topper3164f332014-03-11 03:39:26 +00001392 void getTargetBuiltins(const Builtin::Info *&Records,
1393 unsigned &NumRecords) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001394 Records = BuiltinInfo;
1395 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001396 }
Craig Topper3164f332014-03-11 03:39:26 +00001397 bool hasFeature(StringRef Feature) const override {
Justin Holewinski83e96682012-05-24 17:43:12 +00001398 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001399 }
Craig Topper3164f332014-03-11 03:39:26 +00001400
1401 void getGCCRegNames(const char * const *&Names,
1402 unsigned &NumNames) const override;
1403 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1404 unsigned &NumAliases) const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001405 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00001406 Aliases = nullptr;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001407 NumAliases = 0;
1408 }
Craig Topper3164f332014-03-11 03:39:26 +00001409 bool validateAsmConstraint(const char *&Name,
1410 TargetInfo::ConstraintInfo &Info) const override {
Justin Holewinski7ceab3a892013-06-21 18:51:24 +00001411 switch (*Name) {
1412 default: return false;
1413 case 'c':
1414 case 'h':
1415 case 'r':
1416 case 'l':
1417 case 'f':
1418 case 'd':
1419 Info.setAllowsRegister();
1420 return true;
1421 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001422 }
Craig Topper3164f332014-03-11 03:39:26 +00001423 const char *getClobbers() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001424 // FIXME: Is this really right?
1425 return "";
1426 }
Craig Topper3164f332014-03-11 03:39:26 +00001427 BuiltinVaListKind getBuiltinVaListKind() const override {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001428 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00001429 return TargetInfo::CharPtrBuiltinVaList;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001430 }
Craig Topper3164f332014-03-11 03:39:26 +00001431 bool setCPU(const std::string &Name) override {
Justin Holewinski91203e82013-03-30 14:38:26 +00001432 bool Valid = llvm::StringSwitch<bool>(Name)
1433 .Case("sm_20", true)
1434 .Case("sm_21", true)
1435 .Case("sm_30", true)
1436 .Case("sm_35", true)
1437 .Default(false);
1438
1439 return Valid;
Peter Collingbournec947aae2012-05-20 23:28:41 +00001440 }
Justin Holewinski83e96682012-05-24 17:43:12 +00001441 };
1442
1443 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1444#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1445#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1446 ALL_LANGUAGES },
1447#include "clang/Basic/BuiltinsNVPTX.def"
Peter Collingbournec947aae2012-05-20 23:28:41 +00001448 };
1449
1450 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1451 "r0"
1452 };
1453
1454 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1455 unsigned &NumNames) const {
1456 Names = GCCRegNames;
1457 NumNames = llvm::array_lengthof(GCCRegNames);
1458 }
1459
1460 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1461 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001462 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001463 PointerWidth = PointerAlign = 32;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001464 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1465 IntPtrType = TargetInfo::SignedInt;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001466 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001467 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001468 };
1469
1470 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1471 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001472 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Peter Collingbournec947aae2012-05-20 23:28:41 +00001473 PointerWidth = PointerAlign = 64;
Joerg Sonnenberger3809a7a2014-07-14 20:40:56 +00001474 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1475 IntPtrType = TargetInfo::SignedLongLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00001476 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
Justin Holewinski83e96682012-05-24 17:43:12 +00001477 }
Peter Collingbournec947aae2012-05-20 23:28:41 +00001478 };
1479}
1480
1481namespace {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001482
1483static const unsigned R600AddrSpaceMap[] = {
1484 1, // opencl_global
1485 3, // opencl_local
1486 2, // opencl_constant
1487 1, // cuda_device
1488 2, // cuda_constant
1489 3 // cuda_shared
1490};
1491
Tom Stellarda96344b2014-08-21 13:58:40 +00001492// If you edit the description strings, make sure you update
1493// getPointerWidthV().
1494
Tom Stellardc74b1e02013-03-04 17:40:53 +00001495static const char *DescriptionStringR600 =
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 *DescriptionStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001500 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1501 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001502
1503static const char *DescriptionStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001504 "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 +00001505 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1506 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001507
Eli Friedmand13b41e2012-10-12 23:32:00 +00001508class R600TargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001509 static const Builtin::Info BuiltinInfo[];
1510
Tom Stellardc74b1e02013-03-04 17:40:53 +00001511 /// \brief The GPU profiles supported by the R600 target.
1512 enum GPUKind {
1513 GK_NONE,
1514 GK_R600,
1515 GK_R600_DOUBLE_OPS,
1516 GK_R700,
1517 GK_R700_DOUBLE_OPS,
1518 GK_EVERGREEN,
1519 GK_EVERGREEN_DOUBLE_OPS,
1520 GK_NORTHERN_ISLANDS,
1521 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001522 GK_SOUTHERN_ISLANDS,
1523 GK_SEA_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001524 } GPU;
1525
Eli Friedmand13b41e2012-10-12 23:32:00 +00001526public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001527 R600TargetInfo(const llvm::Triple &Triple)
1528 : TargetInfo(Triple), GPU(GK_R600) {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001529 DescriptionString = DescriptionStringR600;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001530 AddrSpaceMap = &R600AddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001531 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001532 }
1533
Tom Stellarda96344b2014-08-21 13:58:40 +00001534 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1535 if (GPU <= GK_CAYMAN)
1536 return 32;
1537
1538 switch(AddrSpace) {
1539 default:
1540 return 64;
1541 case 0:
1542 case 3:
1543 case 5:
1544 return 32;
1545 }
1546 }
1547
Craig Topper3164f332014-03-11 03:39:26 +00001548 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001549 return "";
1550 }
1551
Craig Topper3164f332014-03-11 03:39:26 +00001552 void getGCCRegNames(const char * const *&Names,
1553 unsigned &numNames) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001554 Names = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001555 numNames = 0;
1556 }
1557
Craig Topper3164f332014-03-11 03:39:26 +00001558 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1559 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001560 Aliases = nullptr;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001561 NumAliases = 0;
1562 }
1563
Craig Topper3164f332014-03-11 03:39:26 +00001564 bool validateAsmConstraint(const char *&Name,
1565 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001566 return true;
1567 }
1568
Craig Topper3164f332014-03-11 03:39:26 +00001569 void getTargetBuiltins(const Builtin::Info *&Records,
1570 unsigned &NumRecords) const override {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001571 Records = BuiltinInfo;
1572 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001573 }
1574
Craig Topper3164f332014-03-11 03:39:26 +00001575 void getTargetDefines(const LangOptions &Opts,
1576 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001577 Builder.defineMacro("__R600__");
1578 }
1579
Craig Topper3164f332014-03-11 03:39:26 +00001580 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001581 return TargetInfo::CharPtrBuiltinVaList;
1582 }
1583
Craig Topper3164f332014-03-11 03:39:26 +00001584 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001585 GPU = llvm::StringSwitch<GPUKind>(Name)
1586 .Case("r600" , GK_R600)
1587 .Case("rv610", GK_R600)
1588 .Case("rv620", GK_R600)
1589 .Case("rv630", GK_R600)
1590 .Case("rv635", GK_R600)
1591 .Case("rs780", GK_R600)
1592 .Case("rs880", GK_R600)
1593 .Case("rv670", GK_R600_DOUBLE_OPS)
1594 .Case("rv710", GK_R700)
1595 .Case("rv730", GK_R700)
1596 .Case("rv740", GK_R700_DOUBLE_OPS)
1597 .Case("rv770", GK_R700_DOUBLE_OPS)
1598 .Case("palm", GK_EVERGREEN)
1599 .Case("cedar", GK_EVERGREEN)
1600 .Case("sumo", GK_EVERGREEN)
1601 .Case("sumo2", GK_EVERGREEN)
1602 .Case("redwood", GK_EVERGREEN)
1603 .Case("juniper", GK_EVERGREEN)
1604 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1605 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1606 .Case("barts", GK_NORTHERN_ISLANDS)
1607 .Case("turks", GK_NORTHERN_ISLANDS)
1608 .Case("caicos", GK_NORTHERN_ISLANDS)
1609 .Case("cayman", GK_CAYMAN)
1610 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001611 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001612 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1613 .Case("verde", GK_SOUTHERN_ISLANDS)
1614 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001615 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001616 .Case("bonaire", GK_SEA_ISLANDS)
1617 .Case("kabini", GK_SEA_ISLANDS)
1618 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001619 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001620 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001621 .Default(GK_NONE);
1622
1623 if (GPU == GK_NONE) {
1624 return false;
1625 }
1626
1627 // Set the correct data layout
1628 switch (GPU) {
1629 case GK_NONE:
1630 case GK_R600:
1631 case GK_R700:
1632 case GK_EVERGREEN:
1633 case GK_NORTHERN_ISLANDS:
1634 DescriptionString = DescriptionStringR600;
1635 break;
1636 case GK_R600_DOUBLE_OPS:
1637 case GK_R700_DOUBLE_OPS:
1638 case GK_EVERGREEN_DOUBLE_OPS:
1639 case GK_CAYMAN:
1640 DescriptionString = DescriptionStringR600DoubleOps;
1641 break;
1642 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001643 case GK_SEA_ISLANDS:
Tom Stellardc74b1e02013-03-04 17:40:53 +00001644 DescriptionString = DescriptionStringSI;
1645 break;
1646 }
1647
1648 return true;
1649 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001650};
1651
Matt Arsenault56f008d2014-06-24 20:45:01 +00001652const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1653#define BUILTIN(ID, TYPE, ATTRS) \
1654 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1655#include "clang/Basic/BuiltinsR600.def"
1656};
1657
Eli Friedmand13b41e2012-10-12 23:32:00 +00001658} // end anonymous namespace
1659
1660namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001661// Namespace for x86 abstract base class
1662const Builtin::Info BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001663#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00001664#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00001665 ALL_LANGUAGES },
Chris Lattner5abdec72009-06-14 01:05:48 +00001666#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00001667};
Eli Friedmanb5366062008-05-20 14:21:01 +00001668
Nuno Lopescfca1f02009-12-23 17:49:57 +00001669static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001670 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1671 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00001672 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001673 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1674 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1675 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00001676 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00001677 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1678 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00001679};
1680
Eric Christophercdd36352011-06-21 00:05:20 +00001681const TargetInfo::AddlRegName AddlRegNames[] = {
1682 { { "al", "ah", "eax", "rax" }, 0 },
1683 { { "bl", "bh", "ebx", "rbx" }, 3 },
1684 { { "cl", "ch", "ecx", "rcx" }, 2 },
1685 { { "dl", "dh", "edx", "rdx" }, 1 },
1686 { { "esi", "rsi" }, 4 },
1687 { { "edi", "rdi" }, 5 },
1688 { { "esp", "rsp" }, 7 },
1689 { { "ebp", "rbp" }, 6 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00001690};
1691
1692// X86 target abstract base class; x86-32 and x86-64 are very close, so
1693// most of the implementation can be shared.
1694class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00001695 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00001696 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Chris Lattner96e43572009-03-02 22:40:39 +00001697 } SSELevel;
Eli Friedman33465822011-07-08 23:31:17 +00001698 enum MMX3DNowEnum {
1699 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1700 } MMX3DNowLevel;
Rafael Espindolae62e2792013-08-20 13:44:29 +00001701 enum XOPEnum {
1702 NoXOP,
1703 SSE4A,
1704 FMA4,
1705 XOP
1706 } XOPLevel;
Anders Carlssone437c682010-01-27 03:47:49 +00001707
Eric Christophere1ddaf92010-04-02 23:50:19 +00001708 bool HasAES;
Craig Topper3f122a72012-05-31 05:18:48 +00001709 bool HasPCLMUL;
Craig Topper22967d42011-12-25 05:06:45 +00001710 bool HasLZCNT;
Benjamin Kramer1e250392012-07-07 09:39:18 +00001711 bool HasRDRND;
Craig Topper8c7f2512014-11-03 06:51:41 +00001712 bool HasFSGSBASE;
Craig Topper22967d42011-12-25 05:06:45 +00001713 bool HasBMI;
1714 bool HasBMI2;
Craig Topper1de83482011-12-29 16:10:46 +00001715 bool HasPOPCNT;
Michael Liao625a8752012-11-10 05:17:46 +00001716 bool HasRTM;
Michael Liao74f4eaf2013-03-26 17:52:08 +00001717 bool HasPRFCHW;
Michael Liaoffaae352013-03-29 05:17:55 +00001718 bool HasRDSEED;
Robert Khasanov50e6f582014-09-19 09:53:48 +00001719 bool HasADX;
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00001720 bool HasTBM;
Craig Topperbba778b2012-06-03 21:46:30 +00001721 bool HasFMA;
Manman Rena45358c2012-10-11 00:59:55 +00001722 bool HasF16C;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001723 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW, HasAVX512VL;
Ben Langmuir58078d02013-09-19 13:22:04 +00001724 bool HasSHA;
Nick Lewycky50e8f482013-10-05 20:14:27 +00001725 bool HasCX16;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00001726
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001727 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1728 ///
1729 /// Each enumeration represents a particular CPU supported by Clang. These
1730 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1731 enum CPUKind {
1732 CK_Generic,
1733
1734 /// \name i386
1735 /// i386-generation processors.
1736 //@{
1737 CK_i386,
1738 //@}
1739
1740 /// \name i486
1741 /// i486-generation processors.
1742 //@{
1743 CK_i486,
1744 CK_WinChipC6,
1745 CK_WinChip2,
1746 CK_C3,
1747 //@}
1748
1749 /// \name i586
1750 /// i586-generation processors, P5 microarchitecture based.
1751 //@{
1752 CK_i586,
1753 CK_Pentium,
1754 CK_PentiumMMX,
1755 //@}
1756
1757 /// \name i686
1758 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1759 //@{
1760 CK_i686,
1761 CK_PentiumPro,
1762 CK_Pentium2,
1763 CK_Pentium3,
1764 CK_Pentium3M,
1765 CK_PentiumM,
1766 CK_C3_2,
1767
1768 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1769 /// Clang however has some logic to suport this.
1770 // FIXME: Warn, deprecate, and potentially remove this.
1771 CK_Yonah,
1772 //@}
1773
1774 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00001775 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001776 //@{
1777 CK_Pentium4,
1778 CK_Pentium4M,
1779 CK_Prescott,
1780 CK_Nocona,
1781 //@}
1782
1783 /// \name Core
1784 /// Core microarchitecture based processors.
1785 //@{
1786 CK_Core2,
1787
1788 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1789 /// codename which GCC no longer accepts as an option to -march, but Clang
1790 /// has some logic for recognizing it.
1791 // FIXME: Warn, deprecate, and potentially remove this.
1792 CK_Penryn,
1793 //@}
1794
1795 /// \name Atom
1796 /// Atom processors
1797 //@{
1798 CK_Atom,
Preston Gurda3c58c02013-09-13 19:27:17 +00001799 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001800 //@}
1801
1802 /// \name Nehalem
1803 /// Nehalem microarchitecture based processors.
1804 //@{
1805 CK_Corei7,
1806 CK_Corei7AVX,
Chandler Carruth212334f2011-09-28 08:55:37 +00001807 CK_CoreAVXi,
Craig Topper865fff52011-12-17 19:55:21 +00001808 CK_CoreAVX2,
Robert Khasanov50e6f582014-09-19 09:53:48 +00001809 CK_Broadwell,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001810 //@}
1811
Craig Topper449314e2013-08-20 07:09:39 +00001812 /// \name Knights Landing
1813 /// Knights Landing processor.
1814 CK_KNL,
1815
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001816 /// \name Skylake Server
1817 /// Skylake server processor.
1818 CK_SKX,
1819
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001820 /// \name K6
1821 /// K6 architecture processors.
1822 //@{
1823 CK_K6,
1824 CK_K6_2,
1825 CK_K6_3,
1826 //@}
1827
1828 /// \name K7
1829 /// K7 architecture processors.
1830 //@{
1831 CK_Athlon,
1832 CK_AthlonThunderbird,
1833 CK_Athlon4,
1834 CK_AthlonXP,
1835 CK_AthlonMP,
1836 //@}
1837
1838 /// \name K8
1839 /// K8 architecture processors.
1840 //@{
1841 CK_Athlon64,
1842 CK_Athlon64SSE3,
1843 CK_AthlonFX,
1844 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00001845 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001846 CK_Opteron,
1847 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00001848 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001849 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001850
Benjamin Kramer569f2152012-01-10 11:50:18 +00001851 /// \name Bobcat
1852 /// Bobcat architecture processors.
1853 //@{
1854 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00001855 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001856 //@}
1857
1858 /// \name Bulldozer
1859 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001860 //@{
1861 CK_BDVER1,
1862 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00001863 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00001864 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00001865 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00001866
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001867 /// This specification is deprecated and will be removed in the future.
1868 /// Users should prefer \see CK_K8.
1869 // FIXME: Warn on this when the CPU is set to it.
1870 CK_x86_64,
1871 //@}
1872
1873 /// \name Geode
1874 /// Geode processors.
1875 //@{
1876 CK_Geode
1877 //@}
Chandler Carruth212334f2011-09-28 08:55:37 +00001878 } CPU;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00001879
Rafael Espindolaeb265472013-08-21 21:59:03 +00001880 enum FPMathKind {
1881 FP_Default,
1882 FP_SSE,
1883 FP_387
1884 } FPMath;
1885
Eli Friedman3fd920a2008-08-20 02:34:37 +00001886public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001887 X86TargetInfo(const llvm::Triple &Triple)
1888 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
Rafael Espindolae62e2792013-08-20 13:44:29 +00001889 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
Craig Topper8c7f2512014-11-03 06:51:41 +00001890 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
1891 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
1892 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
1893 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
1894 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1895 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
Eli Friedman803acb32011-12-22 03:51:45 +00001896 BigEndian = false;
Eli Friedman3fd920a2008-08-20 02:34:37 +00001897 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00001898 }
Craig Topper3164f332014-03-11 03:39:26 +00001899 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00001900 // X87 evaluates with 80 bits "long double" precision.
1901 return SSELevel == NoSSE ? 2 : 0;
1902 }
Craig Topper3164f332014-03-11 03:39:26 +00001903 void getTargetBuiltins(const Builtin::Info *&Records,
1904 unsigned &NumRecords) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001905 Records = BuiltinInfo;
1906 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner10a5b382007-01-29 05:24:35 +00001907 }
Craig Topper3164f332014-03-11 03:39:26 +00001908 void getGCCRegNames(const char * const *&Names,
1909 unsigned &NumNames) const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001910 Names = GCCRegNames;
1911 NumNames = llvm::array_lengthof(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00001912 }
Craig Topper3164f332014-03-11 03:39:26 +00001913 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1914 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00001915 Aliases = nullptr;
Eric Christophercdd36352011-06-21 00:05:20 +00001916 NumAliases = 0;
1917 }
Craig Topper3164f332014-03-11 03:39:26 +00001918 void getGCCAddlRegNames(const AddlRegName *&Names,
1919 unsigned &NumNames) const override {
Eric Christophercdd36352011-06-21 00:05:20 +00001920 Names = AddlRegNames;
1921 NumNames = llvm::array_lengthof(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00001922 }
Craig Topper3164f332014-03-11 03:39:26 +00001923 bool validateAsmConstraint(const char *&Name,
1924 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00001925
Akira Hatanaka974131e2014-09-18 18:17:18 +00001926 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
1927
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00001928 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
1929
Akira Hatanaka974131e2014-09-18 18:17:18 +00001930 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
1931
Craig Topper3164f332014-03-11 03:39:26 +00001932 std::string convertConstraint(const char *&Constraint) const override;
1933 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00001934 return "~{dirflag},~{fpsr},~{flags}";
1935 }
Craig Topper3164f332014-03-11 03:39:26 +00001936 void getTargetDefines(const LangOptions &Opts,
1937 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00001938 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
1939 bool Enabled);
1940 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
1941 bool Enabled);
1942 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
1943 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001944 void setFeatureEnabled(llvm::StringMap<bool> &Features,
1945 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00001946 setFeatureEnabledImpl(Features, Name, Enabled);
1947 }
1948 // This exists purely to cut down on the number of virtual calls in
1949 // getDefaultFeatures which calls this repeatedly.
1950 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
1951 StringRef Name, bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00001952 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
1953 bool hasFeature(StringRef Feature) const override;
1954 bool handleTargetFeatures(std::vector<std::string> &Features,
1955 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00001956 StringRef getABI() const override {
Derek Schuffc7dd7222012-10-11 15:52:22 +00001957 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001958 return "avx";
Derek Schuffc7dd7222012-10-11 15:52:22 +00001959 else if (getTriple().getArch() == llvm::Triple::x86 &&
1960 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00001961 return "no-mmx";
1962 return "";
Eli Friedman33465822011-07-08 23:31:17 +00001963 }
Craig Topper3164f332014-03-11 03:39:26 +00001964 bool setCPU(const std::string &Name) override {
Chandler Carruth212334f2011-09-28 08:55:37 +00001965 CPU = llvm::StringSwitch<CPUKind>(Name)
1966 .Case("i386", CK_i386)
1967 .Case("i486", CK_i486)
1968 .Case("winchip-c6", CK_WinChipC6)
1969 .Case("winchip2", CK_WinChip2)
1970 .Case("c3", CK_C3)
1971 .Case("i586", CK_i586)
1972 .Case("pentium", CK_Pentium)
1973 .Case("pentium-mmx", CK_PentiumMMX)
1974 .Case("i686", CK_i686)
1975 .Case("pentiumpro", CK_PentiumPro)
1976 .Case("pentium2", CK_Pentium2)
1977 .Case("pentium3", CK_Pentium3)
1978 .Case("pentium3m", CK_Pentium3M)
1979 .Case("pentium-m", CK_PentiumM)
1980 .Case("c3-2", CK_C3_2)
1981 .Case("yonah", CK_Yonah)
1982 .Case("pentium4", CK_Pentium4)
1983 .Case("pentium4m", CK_Pentium4M)
1984 .Case("prescott", CK_Prescott)
1985 .Case("nocona", CK_Nocona)
1986 .Case("core2", CK_Core2)
1987 .Case("penryn", CK_Penryn)
1988 .Case("atom", CK_Atom)
Preston Gurda3c58c02013-09-13 19:27:17 +00001989 .Case("slm", CK_Silvermont)
Chandler Carruth212334f2011-09-28 08:55:37 +00001990 .Case("corei7", CK_Corei7)
1991 .Case("corei7-avx", CK_Corei7AVX)
1992 .Case("core-avx-i", CK_CoreAVXi)
Craig Topper865fff52011-12-17 19:55:21 +00001993 .Case("core-avx2", CK_CoreAVX2)
Robert Khasanov50e6f582014-09-19 09:53:48 +00001994 .Case("broadwell", CK_Broadwell)
Craig Topper449314e2013-08-20 07:09:39 +00001995 .Case("knl", CK_KNL)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00001996 .Case("skx", CK_SKX)
Chandler Carruth212334f2011-09-28 08:55:37 +00001997 .Case("k6", CK_K6)
1998 .Case("k6-2", CK_K6_2)
1999 .Case("k6-3", CK_K6_3)
2000 .Case("athlon", CK_Athlon)
2001 .Case("athlon-tbird", CK_AthlonThunderbird)
2002 .Case("athlon-4", CK_Athlon4)
2003 .Case("athlon-xp", CK_AthlonXP)
2004 .Case("athlon-mp", CK_AthlonMP)
2005 .Case("athlon64", CK_Athlon64)
2006 .Case("athlon64-sse3", CK_Athlon64SSE3)
2007 .Case("athlon-fx", CK_AthlonFX)
2008 .Case("k8", CK_K8)
2009 .Case("k8-sse3", CK_K8SSE3)
2010 .Case("opteron", CK_Opteron)
2011 .Case("opteron-sse3", CK_OpteronSSE3)
Roman Divacky43eb6f82011-10-30 07:48:46 +00002012 .Case("amdfam10", CK_AMDFAM10)
Benjamin Kramer569f2152012-01-10 11:50:18 +00002013 .Case("btver1", CK_BTVER1)
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002014 .Case("btver2", CK_BTVER2)
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002015 .Case("bdver1", CK_BDVER1)
2016 .Case("bdver2", CK_BDVER2)
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002017 .Case("bdver3", CK_BDVER3)
Benjamin Kramer56c58222014-05-02 15:47:51 +00002018 .Case("bdver4", CK_BDVER4)
Chandler Carruth212334f2011-09-28 08:55:37 +00002019 .Case("x86-64", CK_x86_64)
2020 .Case("geode", CK_Geode)
2021 .Default(CK_Generic);
2022
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002023 // Perform any per-CPU checks necessary to determine if this CPU is
2024 // acceptable.
2025 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2026 // invalid without explaining *why*.
2027 switch (CPU) {
2028 case CK_Generic:
2029 // No processor selected!
2030 return false;
2031
2032 case CK_i386:
2033 case CK_i486:
2034 case CK_WinChipC6:
2035 case CK_WinChip2:
2036 case CK_C3:
2037 case CK_i586:
2038 case CK_Pentium:
2039 case CK_PentiumMMX:
2040 case CK_i686:
2041 case CK_PentiumPro:
2042 case CK_Pentium2:
2043 case CK_Pentium3:
2044 case CK_Pentium3M:
2045 case CK_PentiumM:
2046 case CK_Yonah:
2047 case CK_C3_2:
2048 case CK_Pentium4:
2049 case CK_Pentium4M:
2050 case CK_Prescott:
2051 case CK_K6:
2052 case CK_K6_2:
2053 case CK_K6_3:
2054 case CK_Athlon:
2055 case CK_AthlonThunderbird:
2056 case CK_Athlon4:
2057 case CK_AthlonXP:
2058 case CK_AthlonMP:
2059 case CK_Geode:
2060 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002061 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002062 return false;
2063
2064 // Fallthrough
2065 case CK_Nocona:
2066 case CK_Core2:
2067 case CK_Penryn:
2068 case CK_Atom:
Preston Gurda3c58c02013-09-13 19:27:17 +00002069 case CK_Silvermont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002070 case CK_Corei7:
2071 case CK_Corei7AVX:
2072 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002073 case CK_CoreAVX2:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002074 case CK_Broadwell:
Craig Topper449314e2013-08-20 07:09:39 +00002075 case CK_KNL:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002076 case CK_SKX:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002077 case CK_Athlon64:
2078 case CK_Athlon64SSE3:
2079 case CK_AthlonFX:
2080 case CK_K8:
2081 case CK_K8SSE3:
2082 case CK_Opteron:
2083 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002084 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002085 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002086 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002087 case CK_BDVER1:
2088 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002089 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002090 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002091 case CK_x86_64:
2092 return true;
2093 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002094 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002095 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002096
Craig Topper3164f332014-03-11 03:39:26 +00002097 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002098
Craig Topper3164f332014-03-11 03:39:26 +00002099 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002100 // We accept all non-ARM calling conventions
2101 return (CC == CC_X86ThisCall ||
2102 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002103 CC == CC_X86StdCall ||
2104 CC == CC_X86VectorCall ||
2105 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002106 CC == CC_X86Pascal ||
2107 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002108 }
2109
Craig Topper3164f332014-03-11 03:39:26 +00002110 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002111 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002112 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002113};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002114
Rafael Espindolaeb265472013-08-21 21:59:03 +00002115bool X86TargetInfo::setFPMath(StringRef Name) {
2116 if (Name == "387") {
2117 FPMath = FP_387;
2118 return true;
2119 }
2120 if (Name == "sse") {
2121 FPMath = FP_SSE;
2122 return true;
2123 }
2124 return false;
2125}
2126
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00002127void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002128 // FIXME: This *really* should not be here.
2129
2130 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002131 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002132 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002133
Chandler Carruth212334f2011-09-28 08:55:37 +00002134 switch (CPU) {
2135 case CK_Generic:
2136 case CK_i386:
2137 case CK_i486:
2138 case CK_i586:
2139 case CK_Pentium:
2140 case CK_i686:
2141 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002142 break;
2143 case CK_PentiumMMX:
2144 case CK_Pentium2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002145 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002146 break;
2147 case CK_Pentium3:
2148 case CK_Pentium3M:
Craig Topper86d79ef2013-09-17 04:51:29 +00002149 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002150 break;
2151 case CK_PentiumM:
2152 case CK_Pentium4:
2153 case CK_Pentium4M:
2154 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002155 setFeatureEnabledImpl(Features, "sse2", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002156 break;
2157 case CK_Yonah:
2158 case CK_Prescott:
2159 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002160 setFeatureEnabledImpl(Features, "sse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002161 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002162 break;
2163 case CK_Core2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002164 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002165 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002166 break;
2167 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002168 setFeatureEnabledImpl(Features, "sse4.1", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002169 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002170 break;
2171 case CK_Atom:
Craig Topper86d79ef2013-09-17 04:51:29 +00002172 setFeatureEnabledImpl(Features, "ssse3", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002173 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002174 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002175 case CK_Silvermont:
Craig Topper86d79ef2013-09-17 04:51:29 +00002176 setFeatureEnabledImpl(Features, "sse4.2", true);
2177 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002178 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002179 setFeatureEnabledImpl(Features, "pclmul", true);
Preston Gurda3c58c02013-09-13 19:27:17 +00002180 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002181 case CK_Corei7:
Craig Topper86d79ef2013-09-17 04:51:29 +00002182 setFeatureEnabledImpl(Features, "sse4.2", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002183 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002184 break;
2185 case CK_Corei7AVX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002186 setFeatureEnabledImpl(Features, "avx", true);
2187 setFeatureEnabledImpl(Features, "aes", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002188 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002189 setFeatureEnabledImpl(Features, "pclmul", true);
Benjamin Kramer1e250392012-07-07 09:39:18 +00002190 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002191 case CK_CoreAVXi:
Craig Topper86d79ef2013-09-17 04:51:29 +00002192 setFeatureEnabledImpl(Features, "avx", true);
2193 setFeatureEnabledImpl(Features, "aes", true);
2194 setFeatureEnabledImpl(Features, "pclmul", true);
2195 setFeatureEnabledImpl(Features, "rdrnd", true);
2196 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002197 setFeatureEnabledImpl(Features, "fsgsbase", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002198 break;
Craig Topper865fff52011-12-17 19:55:21 +00002199 case CK_CoreAVX2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002200 setFeatureEnabledImpl(Features, "avx2", true);
2201 setFeatureEnabledImpl(Features, "aes", true);
2202 setFeatureEnabledImpl(Features, "pclmul", true);
2203 setFeatureEnabledImpl(Features, "lzcnt", true);
2204 setFeatureEnabledImpl(Features, "rdrnd", true);
2205 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002206 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002207 setFeatureEnabledImpl(Features, "bmi", true);
2208 setFeatureEnabledImpl(Features, "bmi2", true);
2209 setFeatureEnabledImpl(Features, "rtm", true);
2210 setFeatureEnabledImpl(Features, "fma", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002211 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper865fff52011-12-17 19:55:21 +00002212 break;
Robert Khasanov50e6f582014-09-19 09:53:48 +00002213 case CK_Broadwell:
2214 setFeatureEnabledImpl(Features, "avx2", true);
2215 setFeatureEnabledImpl(Features, "aes", true);
2216 setFeatureEnabledImpl(Features, "pclmul", true);
2217 setFeatureEnabledImpl(Features, "lzcnt", true);
2218 setFeatureEnabledImpl(Features, "rdrnd", true);
2219 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002220 setFeatureEnabledImpl(Features, "fsgsbase", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002221 setFeatureEnabledImpl(Features, "bmi", true);
2222 setFeatureEnabledImpl(Features, "bmi2", true);
2223 setFeatureEnabledImpl(Features, "rtm", true);
2224 setFeatureEnabledImpl(Features, "fma", true);
2225 setFeatureEnabledImpl(Features, "cx16", true);
2226 setFeatureEnabledImpl(Features, "rdseed", true);
2227 setFeatureEnabledImpl(Features, "adx", true);
2228 break;
Craig Topper449314e2013-08-20 07:09:39 +00002229 case CK_KNL:
Craig Topper86d79ef2013-09-17 04:51:29 +00002230 setFeatureEnabledImpl(Features, "avx512f", true);
2231 setFeatureEnabledImpl(Features, "avx512cd", true);
2232 setFeatureEnabledImpl(Features, "avx512er", true);
2233 setFeatureEnabledImpl(Features, "avx512pf", true);
2234 setFeatureEnabledImpl(Features, "aes", true);
2235 setFeatureEnabledImpl(Features, "pclmul", true);
2236 setFeatureEnabledImpl(Features, "lzcnt", true);
2237 setFeatureEnabledImpl(Features, "rdrnd", true);
2238 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002239 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002240 setFeatureEnabledImpl(Features, "bmi", true);
2241 setFeatureEnabledImpl(Features, "bmi2", true);
2242 setFeatureEnabledImpl(Features, "rtm", true);
2243 setFeatureEnabledImpl(Features, "fma", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002244 setFeatureEnabledImpl(Features, "rdseed", true);
2245 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper449314e2013-08-20 07:09:39 +00002246 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002247 case CK_SKX:
2248 setFeatureEnabledImpl(Features, "avx512f", true);
2249 setFeatureEnabledImpl(Features, "avx512cd", true);
2250 setFeatureEnabledImpl(Features, "avx512dq", true);
2251 setFeatureEnabledImpl(Features, "avx512bw", true);
2252 setFeatureEnabledImpl(Features, "avx512vl", true);
2253 setFeatureEnabledImpl(Features, "aes", true);
2254 setFeatureEnabledImpl(Features, "pclmul", true);
2255 setFeatureEnabledImpl(Features, "lzcnt", true);
2256 setFeatureEnabledImpl(Features, "rdrnd", true);
2257 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002258 setFeatureEnabledImpl(Features, "fsgsbase", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002259 setFeatureEnabledImpl(Features, "bmi", true);
2260 setFeatureEnabledImpl(Features, "bmi2", true);
2261 setFeatureEnabledImpl(Features, "rtm", true);
2262 setFeatureEnabledImpl(Features, "fma", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002263 setFeatureEnabledImpl(Features, "rdseed", true);
2264 setFeatureEnabledImpl(Features, "adx", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002265 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002266 case CK_K6:
2267 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002268 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002269 break;
2270 case CK_K6_2:
2271 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002272 case CK_WinChip2:
2273 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002274 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002275 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002276 case CK_Athlon:
2277 case CK_AthlonThunderbird:
2278 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002279 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002280 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002281 case CK_Athlon4:
2282 case CK_AthlonXP:
2283 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002284 setFeatureEnabledImpl(Features, "sse", true);
2285 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002286 break;
2287 case CK_K8:
2288 case CK_Opteron:
2289 case CK_Athlon64:
2290 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002291 setFeatureEnabledImpl(Features, "sse2", true);
2292 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002293 break;
2294 case CK_K8SSE3:
2295 case CK_OpteronSSE3:
2296 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002297 setFeatureEnabledImpl(Features, "sse3", true);
2298 setFeatureEnabledImpl(Features, "3dnowa", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002299 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002300 case CK_AMDFAM10:
Craig Topper86d79ef2013-09-17 04:51:29 +00002301 setFeatureEnabledImpl(Features, "sse3", true);
2302 setFeatureEnabledImpl(Features, "sse4a", true);
2303 setFeatureEnabledImpl(Features, "3dnowa", true);
2304 setFeatureEnabledImpl(Features, "lzcnt", true);
2305 setFeatureEnabledImpl(Features, "popcnt", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002306 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002307 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002308 setFeatureEnabledImpl(Features, "ssse3", true);
2309 setFeatureEnabledImpl(Features, "sse4a", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002310 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002311 setFeatureEnabledImpl(Features, "lzcnt", true);
2312 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002313 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper9ee12502012-05-30 05:54:54 +00002314 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002315 case CK_BTVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002316 setFeatureEnabledImpl(Features, "avx", true);
2317 setFeatureEnabledImpl(Features, "sse4a", true);
2318 setFeatureEnabledImpl(Features, "lzcnt", true);
2319 setFeatureEnabledImpl(Features, "aes", true);
2320 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002321 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002322 setFeatureEnabledImpl(Features, "bmi", true);
2323 setFeatureEnabledImpl(Features, "f16c", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002324 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002325 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002326 case CK_BDVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002327 setFeatureEnabledImpl(Features, "xop", true);
2328 setFeatureEnabledImpl(Features, "lzcnt", true);
2329 setFeatureEnabledImpl(Features, "aes", true);
2330 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002331 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002332 setFeatureEnabledImpl(Features, "cx16", true);
Eli Friedman102dc4e2012-11-26 21:57:28 +00002333 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002334 case CK_BDVER4:
2335 setFeatureEnabledImpl(Features, "avx2", true);
2336 setFeatureEnabledImpl(Features, "bmi2", true);
2337 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002338 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002339 setFeatureEnabledImpl(Features, "fsgsbase", true);
2340 // FALLTHROUGH
2341 case CK_BDVER2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002342 setFeatureEnabledImpl(Features, "xop", true);
2343 setFeatureEnabledImpl(Features, "lzcnt", true);
2344 setFeatureEnabledImpl(Features, "aes", true);
2345 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002346 setFeatureEnabledImpl(Features, "prfchw", true);
Craig Topper86d79ef2013-09-17 04:51:29 +00002347 setFeatureEnabledImpl(Features, "bmi", true);
2348 setFeatureEnabledImpl(Features, "fma", true);
2349 setFeatureEnabledImpl(Features, "f16c", true);
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002350 setFeatureEnabledImpl(Features, "tbm", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002351 setFeatureEnabledImpl(Features, "cx16", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002352 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002353 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002354 setFeatureEnabledImpl(Features, "sse", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002355 break;
Eli Friedman33465822011-07-08 23:31:17 +00002356 }
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002357}
2358
Rafael Espindolae62e2792013-08-20 13:44:29 +00002359void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002360 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002361 if (Enabled) {
2362 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002363 case AVX512F:
2364 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002365 case AVX2:
2366 Features["avx2"] = true;
2367 case AVX:
2368 Features["avx"] = true;
2369 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002370 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002371 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002372 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002373 case SSSE3:
2374 Features["ssse3"] = true;
2375 case SSE3:
2376 Features["sse3"] = true;
2377 case SSE2:
2378 Features["sse2"] = true;
2379 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002380 Features["sse"] = true;
2381 case NoSSE:
2382 break;
2383 }
2384 return;
2385 }
2386
2387 switch (Level) {
2388 case NoSSE:
2389 case SSE1:
2390 Features["sse"] = false;
2391 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002392 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2393 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002394 case SSE3:
2395 Features["sse3"] = false;
2396 setXOPLevel(Features, NoXOP, false);
2397 case SSSE3:
2398 Features["ssse3"] = false;
2399 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002400 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002401 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002402 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002403 case AVX:
Craig Topper31db3a22013-09-16 04:54:13 +00002404 Features["fma"] = Features["avx"] = Features["f16c"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002405 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002406 case AVX2:
2407 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002408 case AVX512F:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002409 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] = Features["avx512pf"] =
2410 Features["avx512dq"] = Features["avx512bw"] = Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002411 }
2412}
2413
2414void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002415 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002416 if (Enabled) {
2417 switch (Level) {
2418 case AMD3DNowAthlon:
2419 Features["3dnowa"] = true;
2420 case AMD3DNow:
2421 Features["3dnow"] = true;
2422 case MMX:
2423 Features["mmx"] = true;
2424 case NoMMX3DNow:
2425 break;
2426 }
2427 return;
2428 }
2429
2430 switch (Level) {
2431 case NoMMX3DNow:
2432 case MMX:
2433 Features["mmx"] = false;
2434 case AMD3DNow:
2435 Features["3dnow"] = false;
2436 case AMD3DNowAthlon:
2437 Features["3dnowa"] = false;
2438 }
2439}
2440
2441void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002442 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002443 if (Enabled) {
2444 switch (Level) {
2445 case XOP:
2446 Features["xop"] = true;
2447 case FMA4:
2448 Features["fma4"] = true;
2449 setSSELevel(Features, AVX, true);
2450 case SSE4A:
2451 Features["sse4a"] = true;
2452 setSSELevel(Features, SSE3, true);
2453 case NoXOP:
2454 break;
2455 }
2456 return;
2457 }
2458
2459 switch (Level) {
2460 case NoXOP:
2461 case SSE4A:
2462 Features["sse4a"] = false;
2463 case FMA4:
2464 Features["fma4"] = false;
2465 case XOP:
2466 Features["xop"] = false;
2467 }
2468}
2469
Craig Topper86d79ef2013-09-17 04:51:29 +00002470void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2471 StringRef Name, bool Enabled) {
Eric Christopher399ffa52010-03-04 02:26:37 +00002472 // FIXME: This *really* should not be here. We need some way of translating
2473 // options into llvm subtarget features.
Rafael Espindola89049822013-08-23 20:21:37 +00002474 if (Name == "sse4")
2475 Name = "sse4.2";
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002476
Rafael Espindolae62e2792013-08-20 13:44:29 +00002477 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002478
Craig Topper29561122013-09-19 01:13:07 +00002479 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002480 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002481 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002482 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002483 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002484 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002485 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002486 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002487 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002488 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002489 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002490 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002491 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002492 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002493 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002494 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002495 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002496 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002497 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002498 if (Enabled)
2499 setSSELevel(Features, SSE2, Enabled);
2500 } else if (Name == "pclmul") {
2501 if (Enabled)
2502 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002503 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002504 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002505 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002506 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002507 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002508 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002509 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2510 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002511 if (Enabled)
2512 setSSELevel(Features, AVX512F, Enabled);
2513 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002514 if (Enabled)
2515 setSSELevel(Features, AVX, Enabled);
2516 } else if (Name == "fma4") {
2517 setXOPLevel(Features, FMA4, Enabled);
2518 } else if (Name == "xop") {
2519 setXOPLevel(Features, XOP, Enabled);
2520 } else if (Name == "sse4a") {
2521 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002522 } else if (Name == "f16c") {
2523 if (Enabled)
2524 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002525 } else if (Name == "sha") {
2526 if (Enabled)
2527 setSSELevel(Features, SSE2, Enabled);
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002528 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002529}
2530
Eric Christopher3ff21b32013-10-16 21:26:26 +00002531/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002532/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002533bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002534 DiagnosticsEngine &Diags) {
Daniel Dunbar979586e2009-11-11 09:38:56 +00002535 // Remember the maximum enabled sselevel.
2536 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2537 // Ignore disabled features.
2538 if (Features[i][0] == '-')
2539 continue;
2540
Benjamin Kramer27402c62012-03-05 15:10:44 +00002541 StringRef Feature = StringRef(Features[i]).substr(1);
2542
2543 if (Feature == "aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002544 HasAES = true;
2545 continue;
2546 }
2547
Craig Topper3f122a72012-05-31 05:18:48 +00002548 if (Feature == "pclmul") {
2549 HasPCLMUL = true;
2550 continue;
2551 }
2552
Benjamin Kramer27402c62012-03-05 15:10:44 +00002553 if (Feature == "lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002554 HasLZCNT = true;
2555 continue;
2556 }
2557
Rafael Espindola89049822013-08-23 20:21:37 +00002558 if (Feature == "rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002559 HasRDRND = true;
2560 continue;
2561 }
2562
Craig Topper8c7f2512014-11-03 06:51:41 +00002563 if (Feature == "fsgsbase") {
2564 HasFSGSBASE = true;
2565 continue;
2566 }
2567
Benjamin Kramer27402c62012-03-05 15:10:44 +00002568 if (Feature == "bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002569 HasBMI = true;
2570 continue;
2571 }
2572
Benjamin Kramer27402c62012-03-05 15:10:44 +00002573 if (Feature == "bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00002574 HasBMI2 = true;
2575 continue;
2576 }
2577
Benjamin Kramer27402c62012-03-05 15:10:44 +00002578 if (Feature == "popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00002579 HasPOPCNT = true;
2580 continue;
2581 }
2582
Michael Liao625a8752012-11-10 05:17:46 +00002583 if (Feature == "rtm") {
2584 HasRTM = true;
2585 continue;
2586 }
2587
Michael Liao74f4eaf2013-03-26 17:52:08 +00002588 if (Feature == "prfchw") {
2589 HasPRFCHW = true;
2590 continue;
2591 }
2592
Michael Liaoffaae352013-03-29 05:17:55 +00002593 if (Feature == "rdseed") {
2594 HasRDSEED = true;
2595 continue;
2596 }
2597
Robert Khasanov50e6f582014-09-19 09:53:48 +00002598 if (Feature == "adx") {
2599 HasADX = true;
2600 continue;
2601 }
2602
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002603 if (Feature == "tbm") {
2604 HasTBM = true;
2605 continue;
2606 }
2607
Craig Topperbba778b2012-06-03 21:46:30 +00002608 if (Feature == "fma") {
2609 HasFMA = true;
2610 continue;
2611 }
2612
Manman Rena45358c2012-10-11 00:59:55 +00002613 if (Feature == "f16c") {
2614 HasF16C = true;
2615 continue;
2616 }
2617
Craig Topper679b53a2013-08-21 05:29:10 +00002618 if (Feature == "avx512cd") {
2619 HasAVX512CD = true;
2620 continue;
2621 }
2622
2623 if (Feature == "avx512er") {
2624 HasAVX512ER = true;
2625 continue;
2626 }
2627
2628 if (Feature == "avx512pf") {
2629 HasAVX512PF = true;
2630 continue;
2631 }
2632
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002633 if (Feature == "avx512dq") {
2634 HasAVX512DQ = true;
2635 continue;
2636 }
2637
2638 if (Feature == "avx512bw") {
2639 HasAVX512BW = true;
2640 continue;
2641 }
2642
2643 if (Feature == "avx512vl") {
2644 HasAVX512VL = true;
2645 continue;
2646 }
2647
Ben Langmuir58078d02013-09-19 13:22:04 +00002648 if (Feature == "sha") {
2649 HasSHA = true;
2650 continue;
2651 }
2652
Nick Lewycky50e8f482013-10-05 20:14:27 +00002653 if (Feature == "cx16") {
2654 HasCX16 = true;
2655 continue;
2656 }
2657
Daniel Dunbar979586e2009-11-11 09:38:56 +00002658 assert(Features[i][0] == '+' && "Invalid target feature!");
Benjamin Kramer27402c62012-03-05 15:10:44 +00002659 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Craig Topper679b53a2013-08-21 05:29:10 +00002660 .Case("avx512f", AVX512F)
Craig Topper23b92192012-01-09 09:19:09 +00002661 .Case("avx2", AVX2)
2662 .Case("avx", AVX)
Rafael Espindola89049822013-08-23 20:21:37 +00002663 .Case("sse4.2", SSE42)
2664 .Case("sse4.1", SSE41)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002665 .Case("ssse3", SSSE3)
Nuno Lopes4cbc8bd2010-03-12 10:20:09 +00002666 .Case("sse3", SSE3)
Daniel Dunbar979586e2009-11-11 09:38:56 +00002667 .Case("sse2", SSE2)
2668 .Case("sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00002669 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002670 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00002671
Eli Friedman33465822011-07-08 23:31:17 +00002672 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00002673 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Anders Carlssone437c682010-01-27 03:47:49 +00002674 .Case("3dnowa", AMD3DNowAthlon)
2675 .Case("3dnow", AMD3DNow)
Eli Friedman33465822011-07-08 23:31:17 +00002676 .Case("mmx", MMX)
2677 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00002678 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002679
2680 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2681 .Case("xop", XOP)
2682 .Case("fma4", FMA4)
2683 .Case("sse4a", SSE4A)
2684 .Default(NoXOP);
2685 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00002686 }
Eli Friedman33465822011-07-08 23:31:17 +00002687
Craig Topper7481d8a2013-09-10 06:55:47 +00002688 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2689 // Can't do this earlier because we need to be able to explicitly enable
2690 // popcnt and still disable sse4.2.
2691 if (!HasPOPCNT && SSELevel >= SSE42 &&
2692 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2693 HasPOPCNT = true;
2694 Features.push_back("+popcnt");
2695 }
2696
Yunzhong Gao61089362013-10-16 19:07:02 +00002697 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2698 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2699 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2700 HasPRFCHW = true;
2701 Features.push_back("+prfchw");
2702 }
2703
Rafael Espindolaeb265472013-08-21 21:59:03 +00002704 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2705 // matches the selected sse level.
2706 if (FPMath == FP_SSE && SSELevel < SSE1) {
2707 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2708 return false;
2709 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2710 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2711 return false;
2712 }
2713
Eli Friedman33465822011-07-08 23:31:17 +00002714 // Don't tell the backend if we're turning off mmx; it will end up disabling
2715 // SSE, which we don't want.
Craig Topperc0070a42013-09-11 06:48:53 +00002716 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2717 // then enable MMX.
Eli Friedman33465822011-07-08 23:31:17 +00002718 std::vector<std::string>::iterator it;
2719 it = std::find(Features.begin(), Features.end(), "-mmx");
2720 if (it != Features.end())
2721 Features.erase(it);
Craig Topperc0070a42013-09-11 06:48:53 +00002722 else if (SSELevel > NoSSE)
2723 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
Rafael Espindolaeb265472013-08-21 21:59:03 +00002724 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002725}
Chris Lattnerecd49032009-03-02 22:27:17 +00002726
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002727/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2728/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00002729void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002730 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00002731 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002732 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002733 Builder.defineMacro("__amd64__");
2734 Builder.defineMacro("__amd64");
2735 Builder.defineMacro("__x86_64");
2736 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00002737 if (getTriple().getArchName() == "x86_64h") {
2738 Builder.defineMacro("__x86_64h");
2739 Builder.defineMacro("__x86_64h__");
2740 }
Chris Lattnerecd49032009-03-02 22:27:17 +00002741 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002742 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00002743 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002744
Chris Lattnerecd49032009-03-02 22:27:17 +00002745 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002746 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2747 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00002748 switch (CPU) {
2749 case CK_Generic:
2750 break;
2751 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002752 // The rest are coming from the i386 define above.
2753 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002754 break;
2755 case CK_i486:
2756 case CK_WinChipC6:
2757 case CK_WinChip2:
2758 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002759 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00002760 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002761 case CK_PentiumMMX:
2762 Builder.defineMacro("__pentium_mmx__");
2763 Builder.defineMacro("__tune_pentium_mmx__");
2764 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002765 case CK_i586:
2766 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002767 defineCPUMacros(Builder, "i586");
2768 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00002769 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002770 case CK_Pentium3:
2771 case CK_Pentium3M:
2772 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002773 Builder.defineMacro("__tune_pentium3__");
2774 // Fallthrough
2775 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00002776 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002777 Builder.defineMacro("__tune_pentium2__");
2778 // Fallthrough
2779 case CK_PentiumPro:
2780 Builder.defineMacro("__tune_i686__");
2781 Builder.defineMacro("__tune_pentiumpro__");
2782 // Fallthrough
2783 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002784 Builder.defineMacro("__i686");
2785 Builder.defineMacro("__i686__");
2786 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2787 Builder.defineMacro("__pentiumpro");
2788 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00002789 break;
2790 case CK_Pentium4:
2791 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002792 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00002793 break;
2794 case CK_Yonah:
2795 case CK_Prescott:
2796 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002797 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00002798 break;
2799 case CK_Core2:
2800 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002801 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00002802 break;
2803 case CK_Atom:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002804 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00002805 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00002806 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00002807 defineCPUMacros(Builder, "slm");
2808 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002809 case CK_Corei7:
2810 case CK_Corei7AVX:
2811 case CK_CoreAVXi:
Craig Topper865fff52011-12-17 19:55:21 +00002812 case CK_CoreAVX2:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002813 case CK_Broadwell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002814 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00002815 break;
Craig Topper449314e2013-08-20 07:09:39 +00002816 case CK_KNL:
2817 defineCPUMacros(Builder, "knl");
2818 break;
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002819 case CK_SKX:
2820 defineCPUMacros(Builder, "skx");
2821 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002822 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002823 Builder.defineMacro("__k6_2__");
2824 Builder.defineMacro("__tune_k6_2__");
2825 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00002826 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002827 if (CPU != CK_K6_2) { // In case of fallthrough
2828 // FIXME: GCC may be enabling these in cases where some other k6
2829 // architecture is specified but -m3dnow is explicitly provided. The
2830 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002831 Builder.defineMacro("__k6_3__");
2832 Builder.defineMacro("__tune_k6_3__");
2833 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00002834 // Fallthrough
2835 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002836 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00002837 break;
2838 case CK_Athlon:
2839 case CK_AthlonThunderbird:
2840 case CK_Athlon4:
2841 case CK_AthlonXP:
2842 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002843 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002844 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002845 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00002846 Builder.defineMacro("__tune_athlon_sse__");
2847 }
Chandler Carruth212334f2011-09-28 08:55:37 +00002848 break;
2849 case CK_K8:
2850 case CK_K8SSE3:
2851 case CK_x86_64:
2852 case CK_Opteron:
2853 case CK_OpteronSSE3:
2854 case CK_Athlon64:
2855 case CK_Athlon64SSE3:
2856 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002857 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00002858 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00002859 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002860 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00002861 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00002862 case CK_BTVER1:
2863 defineCPUMacros(Builder, "btver1");
2864 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002865 case CK_BTVER2:
2866 defineCPUMacros(Builder, "btver2");
2867 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002868 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002869 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002870 break;
2871 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002872 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002873 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002874 case CK_BDVER3:
2875 defineCPUMacros(Builder, "bdver3");
2876 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002877 case CK_BDVER4:
2878 defineCPUMacros(Builder, "bdver4");
2879 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002880 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00002881 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00002882 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002883 }
Chris Lattner96e43572009-03-02 22:40:39 +00002884
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002885 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002886 Builder.defineMacro("__REGISTER_PREFIX__", "");
2887
Chris Lattner6df41af2009-04-19 17:32:33 +00002888 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2889 // functions in glibc header files that use FP Stack inline asm which the
2890 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002891 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00002892
Chandler Carruth3f7ed952011-09-28 09:54:07 +00002893 if (HasAES)
2894 Builder.defineMacro("__AES__");
2895
Craig Topper3f122a72012-05-31 05:18:48 +00002896 if (HasPCLMUL)
2897 Builder.defineMacro("__PCLMUL__");
2898
Craig Topper22967d42011-12-25 05:06:45 +00002899 if (HasLZCNT)
2900 Builder.defineMacro("__LZCNT__");
2901
Benjamin Kramer1e250392012-07-07 09:39:18 +00002902 if (HasRDRND)
2903 Builder.defineMacro("__RDRND__");
2904
Craig Topper8c7f2512014-11-03 06:51:41 +00002905 if (HasFSGSBASE)
2906 Builder.defineMacro("__FSGSBASE__");
2907
Craig Topper22967d42011-12-25 05:06:45 +00002908 if (HasBMI)
2909 Builder.defineMacro("__BMI__");
2910
2911 if (HasBMI2)
2912 Builder.defineMacro("__BMI2__");
2913
Craig Topper1de83482011-12-29 16:10:46 +00002914 if (HasPOPCNT)
2915 Builder.defineMacro("__POPCNT__");
2916
Michael Liao625a8752012-11-10 05:17:46 +00002917 if (HasRTM)
2918 Builder.defineMacro("__RTM__");
2919
Michael Liao74f4eaf2013-03-26 17:52:08 +00002920 if (HasPRFCHW)
2921 Builder.defineMacro("__PRFCHW__");
2922
Michael Liaoffaae352013-03-29 05:17:55 +00002923 if (HasRDSEED)
2924 Builder.defineMacro("__RDSEED__");
2925
Robert Khasanov50e6f582014-09-19 09:53:48 +00002926 if (HasADX)
2927 Builder.defineMacro("__ADX__");
2928
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00002929 if (HasTBM)
2930 Builder.defineMacro("__TBM__");
2931
Rafael Espindolae62e2792013-08-20 13:44:29 +00002932 switch (XOPLevel) {
2933 case XOP:
2934 Builder.defineMacro("__XOP__");
2935 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00002936 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00002937 case SSE4A:
2938 Builder.defineMacro("__SSE4A__");
2939 case NoXOP:
2940 break;
2941 }
Craig Topperffdb46c2011-12-30 07:33:42 +00002942
Craig Topperbba778b2012-06-03 21:46:30 +00002943 if (HasFMA)
2944 Builder.defineMacro("__FMA__");
2945
Manman Rena45358c2012-10-11 00:59:55 +00002946 if (HasF16C)
2947 Builder.defineMacro("__F16C__");
2948
Craig Topper679b53a2013-08-21 05:29:10 +00002949 if (HasAVX512CD)
2950 Builder.defineMacro("__AVX512CD__");
2951 if (HasAVX512ER)
2952 Builder.defineMacro("__AVX512ER__");
2953 if (HasAVX512PF)
2954 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002955 if (HasAVX512DQ)
2956 Builder.defineMacro("__AVX512DQ__");
2957 if (HasAVX512BW)
2958 Builder.defineMacro("__AVX512BW__");
2959 if (HasAVX512VL)
2960 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00002961
Ben Langmuir58078d02013-09-19 13:22:04 +00002962 if (HasSHA)
2963 Builder.defineMacro("__SHA__");
2964
Nick Lewycky50e8f482013-10-05 20:14:27 +00002965 if (HasCX16)
2966 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2967
Chris Lattner96e43572009-03-02 22:40:39 +00002968 // Each case falls through to the previous one here.
2969 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002970 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00002971 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00002972 case AVX2:
2973 Builder.defineMacro("__AVX2__");
2974 case AVX:
2975 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00002976 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002977 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00002978 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002979 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00002980 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002981 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002982 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002983 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00002984 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002985 Builder.defineMacro("__SSE2__");
2986 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00002987 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00002988 Builder.defineMacro("__SSE__");
2989 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00002990 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00002991 break;
2992 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00002993
Derek Schuffc7dd7222012-10-11 15:52:22 +00002994 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00002995 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002996 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00002997 case AVX2:
2998 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00002999 case SSE42:
3000 case SSE41:
3001 case SSSE3:
3002 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003003 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003004 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003005 break;
3006 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003007 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003008 break;
3009 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003010 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003011 }
3012 }
3013
Anders Carlssone437c682010-01-27 03:47:49 +00003014 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003015 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003016 case AMD3DNowAthlon:
3017 Builder.defineMacro("__3dNOW_A__");
3018 case AMD3DNow:
3019 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003020 case MMX:
3021 Builder.defineMacro("__MMX__");
3022 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003023 break;
3024 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003025
3026 if (CPU >= CK_i486) {
3027 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3028 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3029 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3030 }
3031 if (CPU >= CK_i586)
3032 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003033}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003034
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003035bool X86TargetInfo::hasFeature(StringRef Feature) const {
3036 return llvm::StringSwitch<bool>(Feature)
3037 .Case("aes", HasAES)
3038 .Case("avx", SSELevel >= AVX)
3039 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003040 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003041 .Case("avx512cd", HasAVX512CD)
3042 .Case("avx512er", HasAVX512ER)
3043 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003044 .Case("avx512dq", HasAVX512DQ)
3045 .Case("avx512bw", HasAVX512BW)
3046 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003047 .Case("bmi", HasBMI)
3048 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003049 .Case("cx16", HasCX16)
3050 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003051 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003052 .Case("fma4", XOPLevel >= FMA4)
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003053 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003054 .Case("lzcnt", HasLZCNT)
Benjamin Kramer1e250392012-07-07 09:39:18 +00003055 .Case("rdrnd", HasRDRND)
Craig Topper8c7f2512014-11-03 06:51:41 +00003056 .Case("fsgsbase", HasFSGSBASE)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003057 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3058 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3059 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003060 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003061 .Case("popcnt", HasPOPCNT)
Michael Liao625a8752012-11-10 05:17:46 +00003062 .Case("rtm", HasRTM)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003063 .Case("prfchw", HasPRFCHW)
Michael Liaoffaae352013-03-29 05:17:55 +00003064 .Case("rdseed", HasRDSEED)
Ben Langmuir58078d02013-09-19 13:22:04 +00003065 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003066 .Case("sse", SSELevel >= SSE1)
3067 .Case("sse2", SSELevel >= SSE2)
3068 .Case("sse3", SSELevel >= SSE3)
3069 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003070 .Case("sse4.1", SSELevel >= SSE41)
3071 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003072 .Case("sse4a", XOPLevel >= SSE4A)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003073 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003074 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3075 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003076 .Case("xop", XOPLevel >= XOP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003077 .Default(false);
3078}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003079
Eli Friedman3fd920a2008-08-20 02:34:37 +00003080bool
Anders Carlsson58436352009-02-28 17:11:49 +00003081X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003082 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003083 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003084 default: return false;
Dale Johannesen46742a42010-08-24 22:33:12 +00003085 case 'Y': // first letter of a pair:
3086 switch (*(Name+1)) {
3087 default: return false;
3088 case '0': // First SSE register.
3089 case 't': // Any SSE register, when SSE2 is enabled.
3090 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3091 case 'm': // any MMX register, when inter-unit moves enabled.
3092 break; // falls through to setAllowsRegister.
3093 }
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003094 case 'f': // any x87 floating point stack register.
3095 // Constraint 'f' cannot be used for output operands.
3096 if (Info.ConstraintStr[0] == '=')
3097 return false;
3098
3099 Info.setAllowsRegister();
3100 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003101 case 'a': // eax.
3102 case 'b': // ebx.
3103 case 'c': // ecx.
3104 case 'd': // edx.
3105 case 'S': // esi.
3106 case 'D': // edi.
3107 case 'A': // edx:eax.
3108 case 't': // top of floating point stack.
3109 case 'u': // second from top of floating point stack.
3110 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003111 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003112 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003113 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003114 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3115 case 'l': // "Index" registers: any general register that can be used as an
3116 // index in a base+index memory access.
3117 Info.setAllowsRegister();
3118 return true;
3119 case 'C': // SSE floating point constant.
3120 case 'G': // x87 floating point constant.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003121 case 'e': // 32-bit signed integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003122 // x86_64 instructions.
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003123 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
Anders Carlssona0b89212009-01-24 18:03:09 +00003124 // x86_64 instructions.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003125 return true;
3126 }
3127}
3128
Akira Hatanaka974131e2014-09-18 18:17:18 +00003129bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3130 unsigned Size) const {
3131 // Strip off constraint modifiers.
3132 while (Constraint[0] == '=' ||
3133 Constraint[0] == '+' ||
3134 Constraint[0] == '&')
3135 Constraint = Constraint.substr(1);
3136
3137 return validateOperandSize(Constraint, Size);
3138}
3139
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003140bool X86TargetInfo::validateInputSize(StringRef Constraint,
3141 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003142 return validateOperandSize(Constraint, Size);
3143}
3144
3145bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3146 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003147 switch (Constraint[0]) {
3148 default: break;
3149 case 'y':
3150 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003151 case 'f':
3152 case 't':
3153 case 'u':
3154 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003155 case 'x':
Akira Hatanakae867e422014-09-18 21:58:54 +00003156 // 256-bit ymm registers can be used if target supports AVX.
Aaron Ballmanc1953dc2014-09-19 12:21:56 +00003157 return Size <= (SSELevel >= AVX ? 256U : 128U);
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003158 }
3159
3160 return true;
3161}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003162
Eli Friedman3fd920a2008-08-20 02:34:37 +00003163std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003164X86TargetInfo::convertConstraint(const char *&Constraint) const {
3165 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003166 case 'a': return std::string("{ax}");
3167 case 'b': return std::string("{bx}");
3168 case 'c': return std::string("{cx}");
3169 case 'd': return std::string("{dx}");
3170 case 'S': return std::string("{si}");
3171 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003172 case 'p': // address
3173 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003174 case 't': // top of floating point stack.
3175 return std::string("{st}");
3176 case 'u': // second from top of floating point stack.
3177 return std::string("{st(1)}"); // second from top of floating point stack.
3178 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003179 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003180 }
3181}
Eli Friedman3fd920a2008-08-20 02:34:37 +00003182} // end anonymous namespace
Chris Lattner5ba61f02006-10-14 07:39:34 +00003183
3184namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003185// X86-32 generic target
3186class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003187public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003188 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003189 DoubleAlign = LongLongAlign = 32;
3190 LongDoubleWidth = 96;
3191 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003192 SuitableAlign = 128;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003193 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003194 SizeType = UnsignedInt;
3195 PtrDiffType = SignedInt;
3196 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003197 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003198
3199 // Use fpret for all types.
3200 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3201 (1 << TargetInfo::Double) |
3202 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003203
3204 // x86-32 has atomics up to 8 bytes
3205 // FIXME: Check that we actually have cmpxchg8b before setting
3206 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3207 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003208 }
Craig Topper3164f332014-03-11 03:39:26 +00003209 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003210 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003211 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003212
Craig Topper3164f332014-03-11 03:39:26 +00003213 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003214 if (RegNo == 0) return 0;
3215 if (RegNo == 1) return 2;
3216 return -1;
3217 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003218 bool validateOperandSize(StringRef Constraint,
3219 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003220 switch (Constraint[0]) {
3221 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003222 case 'R':
3223 case 'q':
3224 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003225 case 'a':
3226 case 'b':
3227 case 'c':
3228 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003229 case 'S':
3230 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003231 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003232 case 'A':
3233 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003234 }
3235
Akira Hatanaka974131e2014-09-18 18:17:18 +00003236 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003237 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003238};
3239} // end anonymous namespace
3240
3241namespace {
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003242class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3243public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003244 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3245 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003246
Craig Topper3164f332014-03-11 03:39:26 +00003247 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003248 unsigned Major, Minor, Micro;
3249 getTriple().getOSVersion(Major, Minor, Micro);
3250 // New NetBSD uses the default rounding mode.
3251 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3252 return X86_32TargetInfo::getFloatEvalMethod();
3253 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003254 return 1;
3255 }
3256};
3257} // end anonymous namespace
3258
3259namespace {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003260class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3261public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003262 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3263 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003264 SizeType = UnsignedLong;
3265 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003266 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003267 }
3268};
3269} // end anonymous namespace
3270
3271namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003272class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3273public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003274 BitrigI386TargetInfo(const llvm::Triple &Triple)
3275 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003276 SizeType = UnsignedLong;
3277 IntPtrType = SignedLong;
3278 PtrDiffType = SignedLong;
3279 }
3280};
3281} // end anonymous namespace
3282
3283namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00003284class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003285public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003286 DarwinI386TargetInfo(const llvm::Triple &Triple)
3287 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003288 LongDoubleWidth = 128;
3289 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003290 SuitableAlign = 128;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003291 MaxVectorAlign = 256;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003292 SizeType = UnsignedLong;
3293 IntPtrType = SignedLong;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003294 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003295 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003296 }
3297
Eli Friedman3fd920a2008-08-20 02:34:37 +00003298};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003299} // end anonymous namespace
3300
3301namespace {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003302// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003303class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003304public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003305 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3306 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003307 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003308 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003309 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003310 }
Craig Topper3164f332014-03-11 03:39:26 +00003311 void getTargetDefines(const LangOptions &Opts,
3312 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003313 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3314 }
3315};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003316
3317// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003318class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003319public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003320 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003321 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003322 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003323 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3324 }
Craig Topper3164f332014-03-11 03:39:26 +00003325 void getTargetDefines(const LangOptions &Opts,
3326 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003327 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3328 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3329 // The value of the following reflects processor type.
3330 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3331 // We lost the original triple, so we use the default.
3332 Builder.defineMacro("_M_IX86", "600");
3333 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003334};
3335} // end anonymous namespace
3336
Reid Kleckner47606832014-04-21 20:58:00 +00003337static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3338 Builder.defineMacro("__MSVCRT__");
3339 Builder.defineMacro("__MINGW32__");
3340
3341 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3342 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3343 // macro anyway for pre-processor compatibility.
3344 if (Opts.MicrosoftExt)
3345 Builder.defineMacro("__declspec", "__declspec");
3346 else
3347 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3348
3349 if (!Opts.MicrosoftExt) {
3350 // Provide macros for all the calling convention keywords. Provide both
3351 // single and double underscore prefixed variants. These are available on
3352 // x64 as well as x86, even though they have no effect.
3353 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3354 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003355 std::string GCCSpelling = "__attribute__((__";
3356 GCCSpelling += CC;
3357 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003358 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3359 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3360 }
3361 }
3362}
3363
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003364namespace {
3365// x86-32 MinGW target
3366class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3367public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003368 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3369 : WindowsX86_32TargetInfo(Triple) {}
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 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003373 DefineStd(Builder, "WIN32", Opts);
3374 DefineStd(Builder, "WINNT", Opts);
3375 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003376 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003377 }
3378};
3379} // end anonymous namespace
3380
3381namespace {
3382// x86-32 Cygwin target
3383class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3384public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003385 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3386 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003387 TLSSupported = false;
3388 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003389 DoubleAlign = LongLongAlign = 64;
Rafael Espindola26d0f7c2014-01-10 13:42:17 +00003390 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003391 }
Craig Topper3164f332014-03-11 03:39:26 +00003392 void getTargetDefines(const LangOptions &Opts,
3393 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003394 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003395 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003396 Builder.defineMacro("__CYGWIN__");
3397 Builder.defineMacro("__CYGWIN32__");
3398 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003399 if (Opts.CPlusPlus)
3400 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003401 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003402};
3403} // end anonymous namespace
3404
3405namespace {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003406// x86-32 Haiku target
3407class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3408public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003409 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003410 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003411 IntPtrType = SignedLong;
3412 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003413 ProcessIDType = SignedLong;
Rafael Espindolac55be6d2010-11-09 16:41:02 +00003414 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003415 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003416 }
Craig Topper3164f332014-03-11 03:39:26 +00003417 void getTargetDefines(const LangOptions &Opts,
3418 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003419 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3420 Builder.defineMacro("__INTEL__");
3421 Builder.defineMacro("__HAIKU__");
3422 }
3423};
3424} // end anonymous namespace
3425
Douglas Gregor9fabd852011-07-01 22:41:14 +00003426// RTEMS Target
3427template<typename Target>
3428class RTEMSTargetInfo : public OSTargetInfo<Target> {
3429protected:
Craig Topper3164f332014-03-11 03:39:26 +00003430 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3431 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003432 // RTEMS defines; list based off of gcc output
3433
Douglas Gregor9fabd852011-07-01 22:41:14 +00003434 Builder.defineMacro("__rtems__");
3435 Builder.defineMacro("__ELF__");
3436 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003437
Douglas Gregor9fabd852011-07-01 22:41:14 +00003438public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003439 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3440 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003441
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003442 switch (Triple.getArch()) {
3443 default:
3444 case llvm::Triple::x86:
3445 // this->MCountName = ".mcount";
3446 break;
3447 case llvm::Triple::mips:
3448 case llvm::Triple::mipsel:
3449 case llvm::Triple::ppc:
3450 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003451 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003452 // this->MCountName = "_mcount";
3453 break;
3454 case llvm::Triple::arm:
3455 // this->MCountName = "__mcount";
3456 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003457 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003458 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003459};
3460
3461namespace {
3462// x86-32 RTEMS target
3463class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3464public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003465 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003466 SizeType = UnsignedLong;
3467 IntPtrType = SignedLong;
3468 PtrDiffType = SignedLong;
3469 this->UserLabelPrefix = "";
3470 }
Craig Topper3164f332014-03-11 03:39:26 +00003471 void getTargetDefines(const LangOptions &Opts,
3472 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003473 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3474 Builder.defineMacro("__INTEL__");
3475 Builder.defineMacro("__rtems__");
3476 }
3477};
3478} // end anonymous namespace
3479
Chris Lattnerb986aba2010-04-11 19:29:39 +00003480namespace {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003481// x86-64 generic target
3482class X86_64TargetInfo : public X86TargetInfo {
3483public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003484 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003485 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
Zinovy Nis1db95732014-07-10 15:27:19 +00003486 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003487 LongDoubleWidth = 128;
3488 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003489 LargeArrayMinWidth = 128;
3490 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003491 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003492 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3493 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3494 IntPtrType = IsX32 ? SignedInt : SignedLong;
3495 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003496 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003497 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003498
Zinovy Nis1db95732014-07-10 15:27:19 +00003499 DescriptionString = (IsX32)
3500 ? "e-m:e-" "p:32:32-" "i64:64-f80:128-n8:16:32:64-S128"
3501 : "e-m:e-" "i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003502
3503 // Use fpret only for long double.
3504 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003505
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003506 // Use fp2ret for _Complex long double.
3507 ComplexLongDoubleUsesFP2Ret = true;
3508
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003509 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003510 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00003511 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00003512 }
Craig Topper3164f332014-03-11 03:39:26 +00003513 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003514 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00003515 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003516
Craig Topper3164f332014-03-11 03:39:26 +00003517 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003518 if (RegNo == 0) return 0;
3519 if (RegNo == 1) return 1;
3520 return -1;
3521 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003522
Craig Topper3164f332014-03-11 03:39:26 +00003523 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003524 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003525 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003526 CC == CC_IntelOclBicc ||
3527 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003528 }
3529
Craig Topper3164f332014-03-11 03:39:26 +00003530 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003531 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003532 }
3533
Pavel Chupinfd223e12014-08-04 12:39:43 +00003534 // for x32 we need it here explicitly
3535 bool hasInt128Type() const override { return true; }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003536};
3537} // end anonymous namespace
3538
3539namespace {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003540// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003541class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003542public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003543 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3544 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003545 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00003546 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003547 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003548 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00003549 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00003550 SizeType = UnsignedLongLong;
3551 PtrDiffType = SignedLongLong;
3552 IntPtrType = SignedLongLong;
NAKAMURA Takumif7c30222011-01-17 22:56:08 +00003553 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003554 }
Craig Topper3164f332014-03-11 03:39:26 +00003555 void getTargetDefines(const LangOptions &Opts,
3556 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003557 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003558 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003559 }
Craig Topper3164f332014-03-11 03:39:26 +00003560 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003561 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00003562 }
Craig Topper3164f332014-03-11 03:39:26 +00003563 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00003564 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00003565 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00003566 CC == CC_IntelOclBicc ||
3567 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3568 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003569};
3570} // end anonymous namespace
3571
3572namespace {
3573// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003574class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003575public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003576 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003577 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003578 LongDoubleWidth = LongDoubleAlign = 64;
3579 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003580 }
Craig Topper3164f332014-03-11 03:39:26 +00003581 void getTargetDefines(const LangOptions &Opts,
3582 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003583 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3584 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003585 Builder.defineMacro("_M_X64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003586 Builder.defineMacro("_M_AMD64");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003587 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003588};
3589} // end anonymous namespace
3590
3591namespace {
3592// x86-64 MinGW target
3593class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3594public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003595 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3596 : WindowsX86_64TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003597 void getTargetDefines(const LangOptions &Opts,
3598 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003599 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003600 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003601 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00003602 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003603 }
3604};
3605} // end anonymous namespace
3606
3607namespace {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003608class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3609public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003610 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3611 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00003612 Int64Type = SignedLongLong;
Chad Rosiercc40ea72012-07-13 23:57:43 +00003613 MaxVectorAlign = 256;
Tim Northovera2ee4332014-03-29 15:09:45 +00003614 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3615 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00003616 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00003617 UseSignedCharForObjCBool = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003618 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00003619 }
3620};
3621} // end anonymous namespace
3622
3623namespace {
Eli Friedman245f2292009-07-05 22:31:18 +00003624class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3625public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003626 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3627 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00003628 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003629 Int64Type = SignedLongLong;
3630 }
3631};
3632} // end anonymous namespace
3633
3634namespace {
Eli Friedman9fa28852012-08-08 23:57:20 +00003635class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3636public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003637 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3638 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3639 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003640 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00003641 }
3642};
Tim Northover9bb857a2013-01-31 12:13:10 +00003643}
3644
Eli Friedman9fa28852012-08-08 23:57:20 +00003645
3646namespace {
Eli Friedmanf05b7722008-08-20 07:44:10 +00003647class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003648 // Possible FPU choices.
3649 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003650 VFP2FPU = (1 << 0),
3651 VFP3FPU = (1 << 1),
3652 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00003653 NeonFPU = (1 << 3),
3654 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003655 };
3656
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003657 // Possible HWDiv features.
3658 enum HWDivMode {
3659 HWDivThumb = (1 << 0),
3660 HWDivARM = (1 << 1)
3661 };
3662
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003663 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003664 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003665 }
3666
3667 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3668 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00003669
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003670 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003671
Rafael Espindolaeb265472013-08-21 21:59:03 +00003672 enum {
3673 FP_Default,
3674 FP_VFP,
3675 FP_Neon
3676 } FPMath;
3677
Bernard Ogdenda13af32013-10-24 18:32:51 +00003678 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003679
Logan Chien57086ce2012-10-10 06:56:20 +00003680 unsigned IsAAPCS : 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003681 unsigned IsThumb : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003682 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003683
3684 // Initialized via features.
3685 unsigned SoftFloat : 1;
3686 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003687
Bernard Ogden18b57012013-10-29 09:47:51 +00003688 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00003689 unsigned Crypto : 1;
Bernard Ogden18b57012013-10-29 09:47:51 +00003690
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003691 // ACLE 6.5.1 Hardware floating point
3692 enum {
3693 HW_FP_HP = (1 << 1), /// half (16-bit)
3694 HW_FP_SP = (1 << 2), /// single (32-bit)
3695 HW_FP_DP = (1 << 3), /// double (64-bit)
3696 };
3697 uint32_t HW_FP;
3698
Chris Lattner5cc15e02010-03-03 19:03:45 +00003699 static const Builtin::Info BuiltinInfo[];
3700
Rafael Espindola101d5b92013-05-13 20:09:47 +00003701 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
Rafael Espindola101d5b92013-05-13 20:09:47 +00003702 StringRef ArchName = T.getArchName();
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003703 if (T.getArch() == llvm::Triple::arm ||
3704 T.getArch() == llvm::Triple::armeb) {
3705 StringRef VersionStr;
3706 if (ArchName.startswith("armv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003707 VersionStr = ArchName.substr(4, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003708 else if (ArchName.startswith("armebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003709 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003710 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003711 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003712 unsigned Version;
3713 if (VersionStr.getAsInteger(10, Version))
3714 return false;
3715 return Version >= 6;
3716 }
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003717 assert(T.getArch() == llvm::Triple::thumb ||
3718 T.getArch() == llvm::Triple::thumbeb);
3719 StringRef VersionStr;
3720 if (ArchName.startswith("thumbv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003721 VersionStr = ArchName.substr(6, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003722 else if (ArchName.startswith("thumbebv"))
Tim Northovere8c37212014-07-09 09:24:43 +00003723 VersionStr = ArchName.substr(8, 1);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003724 else
Rafael Espindola92dbc312013-05-14 00:44:24 +00003725 return false;
Rafael Espindola92dbc312013-05-14 00:44:24 +00003726 unsigned Version;
3727 if (VersionStr.getAsInteger(10, Version))
3728 return false;
3729 return Version >= 7;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003730 }
3731
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003732 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003733 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003734
3735 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00003736 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003737
Tim Northover00853e52014-08-05 11:07:26 +00003738 // size_t is unsigned long on MachO-derived environments and NetBSD.
3739 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003740 SizeType = UnsignedLong;
3741 else
3742 SizeType = UnsignedInt;
3743
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003744 switch (T.getOS()) {
3745 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003746 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003747 break;
3748 case llvm::Triple::Win32:
3749 WCharType = UnsignedShort;
3750 break;
3751 case llvm::Triple::Linux:
3752 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003753 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3754 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00003755 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003756 }
3757
3758 UseBitFieldTypeAlignment = true;
3759
3760 ZeroLengthBitfieldBoundary = 0;
3761
Tim Northover147cd2f2014-10-14 22:12:21 +00003762 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3763 // so set preferred for small types to 32.
3764 if (T.isOSBinFormatMachO()) {
3765 DescriptionString =
3766 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3767 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3768 } else if (T.isOSWindows()) {
3769 // FIXME: this is invalid for WindowsCE
3770 assert(!BigEndian && "Windows on ARM does not support big endian");
3771 DescriptionString = "e"
3772 "-m:e"
3773 "-p:32:32"
3774 "-i64:64"
3775 "-v128:64:128"
3776 "-a:0:32"
3777 "-n32"
3778 "-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003779 } else {
Tim Northover147cd2f2014-10-14 22:12:21 +00003780 DescriptionString =
3781 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3782 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003783 }
3784
3785 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003786 }
3787
3788 void setABIAPCS() {
Rafael Espindolac418ae92014-01-03 19:22:05 +00003789 const llvm::Triple &T = getTriple();
3790
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003791 IsAAPCS = false;
3792
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003793 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003794
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003795 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00003796 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003797 SizeType = UnsignedInt;
3798 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003799 SizeType = UnsignedLong;
3800
3801 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3802 WCharType = SignedInt;
3803
3804 // Do not respect the alignment of bit-field types when laying out
3805 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3806 UseBitFieldTypeAlignment = false;
3807
3808 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3809 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3810 /// gcc.
3811 ZeroLengthBitfieldBoundary = 32;
3812
Tim Northover147cd2f2014-10-14 22:12:21 +00003813 if (T.isOSBinFormatMachO())
3814 DescriptionString =
3815 BigEndian
3816 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3817 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3818 else
3819 DescriptionString =
3820 BigEndian
3821 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3822 : "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 +00003823
3824 // FIXME: Override "preferred align" for double and long long.
3825 }
3826
Chris Lattner17df24e2008-04-21 18:56:49 +00003827public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003828 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003829 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003830 IsAAPCS(true), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003831 BigEndian = IsBigEndian;
3832
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003833 switch (getTriple().getOS()) {
3834 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003835 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003836 break;
3837 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00003838 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00003839 break;
3840 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00003841
Chris Lattner1a8f3942010-04-23 16:29:58 +00003842 // {} in inline assembly are neon specifiers, not assembly variant
3843 // specifiers.
3844 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003845
Daniel Dunbaracde99e2009-12-18 18:42:37 +00003846 // FIXME: Should we just treat this as a feature?
Daniel Dunbarc454ecf2009-12-18 19:57:13 +00003847 IsThumb = getTriple().getArchName().startswith("thumb");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00003848
3849 setABI("aapcs-linux");
John McCall86353412010-08-21 22:46:04 +00003850
3851 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00003852 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003853
3854 // ARM has atomics up to 8 bytes
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003855 MaxAtomicPromoteWidth = 64;
Rafael Espindola101d5b92013-05-13 20:09:47 +00003856 if (shouldUseInlineAtomic(getTriple()))
3857 MaxAtomicInlineWidth = 64;
James Molloya7139222012-03-12 09:14:10 +00003858
3859 // Do force alignment of members that follow zero length bitfields. If
3860 // the alignment of the zero-length bitfield is greater than the member
3861 // that follows it, `bar', `bar' will be aligned as the type of the
3862 // zero length bitfield.
3863 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00003864 }
Alp Toker4925ba72014-06-07 23:30:42 +00003865 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00003866 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00003867 ABI = Name;
3868
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003869 // The defaults (above) are for AAPCS, check if we need to change them.
3870 //
3871 // FIXME: We need support for -meabi... we could just mangle it into the
3872 // name.
3873 if (Name == "apcs-gnu") {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00003874 setABIAPCS();
3875 return true;
3876 }
3877 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3878 setABIAAPCS();
3879 return true;
3880 }
3881 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00003882 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003883
Craig Topper3164f332014-03-11 03:39:26 +00003884 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Rafael Espindolad8da90b2014-01-02 13:57:18 +00003885 if (IsAAPCS)
3886 Features["aapcs"] = true;
3887 else
3888 Features["apcs"] = true;
3889
Silviu Barangae5690462013-10-21 10:59:33 +00003890 StringRef ArchName = getTriple().getArchName();
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003891 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3892 Features["vfp2"] = true;
Renato Golineefb5772013-09-13 17:02:45 +00003893 else if (CPU == "cortex-a8" || CPU == "cortex-a9" ||
3894 CPU == "cortex-a9-mp") {
3895 Features["vfp3"] = true;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003896 Features["neon"] = true;
Silviu Barangae5690462013-10-21 10:59:33 +00003897 }
3898 else if (CPU == "cortex-a5") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003899 Features["vfp4"] = true;
3900 Features["neon"] = true;
Ana Pazosdd6068d2013-12-06 22:43:17 +00003901 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3902 CPU == "cortex-a12" || CPU == "cortex-a15" ||
Renato Golin5886bc32014-10-13 10:22:48 +00003903 CPU == "cortex-a17" || CPU == "krait") {
Silviu Barangae5690462013-10-21 10:59:33 +00003904 Features["vfp4"] = true;
3905 Features["neon"] = true;
3906 Features["hwdiv"] = true;
3907 Features["hwdiv-arm"] = true;
Tim Northovera2ee4332014-03-29 15:09:45 +00003908 } else if (CPU == "cyclone") {
3909 Features["v8fp"] = true;
3910 Features["neon"] = true;
3911 Features["hwdiv"] = true;
3912 Features["hwdiv-arm"] = true;
Bernard Ogdenda13af32013-10-24 18:32:51 +00003913 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3914 Features["fp-armv8"] = true;
3915 Features["neon"] = true;
3916 Features["hwdiv"] = true;
3917 Features["hwdiv-arm"] = true;
Bernard Ogden18b57012013-10-29 09:47:51 +00003918 Features["crc"] = true;
Tim Northover02e38602014-02-03 17:28:04 +00003919 Features["crypto"] = true;
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003920 } else if (CPU == "cortex-r5" ||
Silviu Barangae5690462013-10-21 10:59:33 +00003921 // Enable the hwdiv extension for all v8a AArch32 cores by
3922 // default.
3923 ArchName == "armv8a" || ArchName == "armv8" ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003924 ArchName == "armebv8a" || ArchName == "armebv8" ||
3925 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
3926 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
Silviu Barangae5690462013-10-21 10:59:33 +00003927 Features["hwdiv"] = true;
3928 Features["hwdiv-arm"] = true;
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00003929 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7") {
Artyom Skrobove72a6f72014-01-29 09:43:07 +00003930 Features["hwdiv"] = true;
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003931 }
Daniel Dunbar0def3d12009-12-21 23:28:17 +00003932 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003933
Craig Topper3164f332014-03-11 03:39:26 +00003934 bool handleTargetFeatures(std::vector<std::string> &Features,
3935 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003936 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00003937 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00003938 Crypto = 0;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003939 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003940 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00003941
3942 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003943 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00003944 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003945 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00003946 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003947 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003948 FPU |= VFP2FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003949 HW_FP = HW_FP_SP | HW_FP_DP;
3950 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003951 FPU |= VFP3FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003952 HW_FP = HW_FP_SP | HW_FP_DP;
3953 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003954 FPU |= VFP4FPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003955 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
3956 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00003957 FPU |= FPARMV8;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003958 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
3959 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00003960 FPU |= NeonFPU;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003961 HW_FP = HW_FP_SP | HW_FP_DP;
3962 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003963 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003964 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00003965 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003966 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00003967 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003968 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00003969 Crypto = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00003970 } else if (Feature == "+fp-only-sp") {
3971 HW_FP &= ~HW_FP_DP;
3972 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00003973 }
3974
Rafael Espindolaeb265472013-08-21 21:59:03 +00003975 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
3976 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
3977 return false;
3978 }
3979
3980 if (FPMath == FP_Neon)
3981 Features.push_back("+neonfp");
3982 else if (FPMath == FP_VFP)
3983 Features.push_back("-neonfp");
3984
Daniel Dunbar893d4752009-12-19 04:15:38 +00003985 // Remove front-end specific options which the backend handles differently.
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00003986 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
3987 for (const auto &FEFeature : FrontEndFeatures) {
3988 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
3989 if (Feature != Features.end())
3990 Features.erase(Feature);
3991 }
3992
Rafael Espindolaeb265472013-08-21 21:59:03 +00003993 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00003994 }
3995
Craig Topper3164f332014-03-11 03:39:26 +00003996 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003997 return llvm::StringSwitch<bool>(Feature)
3998 .Case("arm", true)
3999 .Case("softfloat", SoftFloat)
4000 .Case("thumb", IsThumb)
Amara Emerson8c3de542013-09-16 18:07:35 +00004001 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004002 .Case("hwdiv", HWDiv & HWDivThumb)
4003 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004004 .Default(false);
4005 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004006 // FIXME: Should we actually have some table instead of these switches?
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004007 static const char *getCPUDefineSuffix(StringRef Name) {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004008 return llvm::StringSwitch<const char*>(Name)
4009 .Cases("arm8", "arm810", "4")
4010 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110", "4")
4011 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4012 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4013 .Case("ep9312", "4T")
4014 .Cases("arm10tdmi", "arm1020t", "5T")
4015 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4016 .Case("arm926ej-s", "5TEJ")
4017 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4018 .Cases("xscale", "iwmmxt", "5TE")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004019 .Case("arm1136j-s", "6J")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004020 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004021 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004022 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
Bob Wilsonb767d152014-01-15 21:43:40 +00004023 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "7A")
Renato Golin5886bc32014-10-13 10:22:48 +00004024 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "7A")
Renato Golin1a04f222013-09-13 17:02:54 +00004025 .Cases("cortex-r4", "cortex-r5", "7R")
Bob Wilsond7cf1042012-09-29 23:52:50 +00004026 .Case("swift", "7S")
Tim Northovera2ee4332014-03-29 15:09:45 +00004027 .Case("cyclone", "8A")
Jim Grosbachbe83cb82014-06-26 17:24:16 +00004028 .Case("cortex-m3", "7M")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00004029 .Cases("cortex-m4", "cortex-m7", "7EM")
Bob Wilson87ba1d32011-03-21 21:55:25 +00004030 .Case("cortex-m0", "6M")
Bernard Ogden021d7da2013-10-24 18:32:36 +00004031 .Cases("cortex-a53", "cortex-a57", "8A")
Craig Topperf1186c52014-05-08 06:41:40 +00004032 .Default(nullptr);
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004033 }
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004034 static const char *getCPUProfile(StringRef Name) {
4035 return llvm::StringSwitch<const char*>(Name)
Renato Golin1a04f222013-09-13 17:02:54 +00004036 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
Renato Golin5886bc32014-10-13 10:22:48 +00004037 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait", "A")
Bernard Ogden021d7da2013-10-24 18:32:36 +00004038 .Cases("cortex-a53", "cortex-a57", "A")
Oliver Stannardbfd3ea32014-10-01 09:03:02 +00004039 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m7", "M")
Renato Golin1a04f222013-09-13 17:02:54 +00004040 .Cases("cortex-r4", "cortex-r5", "R")
Anton Korobeynikov26b13882012-09-08 08:22:13 +00004041 .Default("");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004042 }
Craig Topper3164f332014-03-11 03:39:26 +00004043 bool setCPU(const std::string &Name) override {
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004044 if (!getCPUDefineSuffix(Name))
4045 return false;
4046
Tim Northovere8c37212014-07-09 09:24:43 +00004047 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4048 StringRef Profile = getCPUProfile(Name);
4049 if (Profile == "M" && MaxAtomicInlineWidth) {
4050 MaxAtomicPromoteWidth = 32;
4051 MaxAtomicInlineWidth = 32;
4052 }
4053
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004054 CPU = Name;
4055 return true;
4056 }
Craig Topper3164f332014-03-11 03:39:26 +00004057 bool setFPMath(StringRef Name) override;
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004058 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4059 unsigned CPUArchVer) const {
4060 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4061 (CPUArch.find('M') != StringRef::npos);
4062 }
4063 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4064 unsigned CPUArchVer) const {
4065 // We check both CPUArchVer and ArchName because when only triple is
4066 // specified, the default CPU is arm1136j-s.
4067 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4068 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4069 }
Craig Topper3164f332014-03-11 03:39:26 +00004070 void getTargetDefines(const LangOptions &Opts,
4071 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004072 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004073 Builder.defineMacro("__arm");
4074 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004075
Chris Lattnerecd49032009-03-02 22:27:17 +00004076 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004077 Builder.defineMacro("__REGISTER_PREFIX__", "");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004078
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004079 StringRef CPUArch = getCPUDefineSuffix(CPU);
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004080 unsigned int CPUArchVer;
Saleem Abdulrasool820e9272014-09-17 14:50:19 +00004081 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004082 llvm_unreachable("Invalid char for architecture version number");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004083 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004084
4085 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004086 StringRef CPUProfile = getCPUProfile(CPU);
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004087 StringRef ArchName = getTriple().getArchName();
4088
4089 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4090 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
James Molloy0ffb0932014-09-15 11:25:38 +00004091 if (CPUArch[0] >= '8') {
4092 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4093 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
4094 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004095
4096 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4097 // is not defined for the M-profile.
4098 // NOTE that the deffault profile is assumed to be 'A'
4099 if (CPUProfile.empty() || CPUProfile != "M")
4100 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4101
4102 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4103 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4104 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4105 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4106 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4107 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4108 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4109
4110 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4111 // instruction set such as ARM or Thumb.
4112 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4113
4114 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4115
4116 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004117 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004118 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004119
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004120 // ACLE 6.5.1 Hardware Floating Point
4121 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004122 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004123
Yi Konga44c4d72014-06-27 21:25:42 +00004124 // ACLE predefines.
4125 Builder.defineMacro("__ARM_ACLE", "200");
4126
Mike Stump9d54bd72009-04-08 02:07:04 +00004127 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004128
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004129 // FIXME: It's more complicated than this and we don't really support
4130 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004131 // Windows on ARM does not "support" interworking
4132 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004133 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004134
David Tweed8f676532012-10-25 13:33:01 +00004135 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004136 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004137 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4138 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004139 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004140 Builder.defineMacro("__ARM_PCS", "1");
4141
David Tweed8f676532012-10-25 13:33:01 +00004142 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004143 Builder.defineMacro("__ARM_PCS_VFP", "1");
4144 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004145
Daniel Dunbar893d4752009-12-19 04:15:38 +00004146 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004147 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004148
4149 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004150 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004151
4152 if (IsThumb) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004153 Builder.defineMacro("__THUMBEL__");
4154 Builder.defineMacro("__thumb__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004155 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004156 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004157 }
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004158 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4159 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004160
4161 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004162 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004163
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004164 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004165 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004166 if (FPU & VFP2FPU)
4167 Builder.defineMacro("__ARM_VFPV2__");
4168 if (FPU & VFP3FPU)
4169 Builder.defineMacro("__ARM_VFPV3__");
4170 if (FPU & VFP4FPU)
4171 Builder.defineMacro("__ARM_VFPV4__");
4172 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004173
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004174 // This only gets set when Neon instructions are actually available, unlike
4175 // the VFP define, hence the soft float and arch check. This is subtly
4176 // different from gcc, we follow the intent which was that it should be set
4177 // when Neon instructions are actually available.
Tim Northover5bb34ca2013-11-21 12:36:34 +00004178 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4179 Builder.defineMacro("__ARM_NEON");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004180 Builder.defineMacro("__ARM_NEON__");
Tim Northover5bb34ca2013-11-21 12:36:34 +00004181 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004182
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004183 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4184 Opts.ShortWChar ? "2" : "4");
4185
4186 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4187 Opts.ShortEnums ? "1" : "4");
4188
Bernard Ogden18b57012013-10-29 09:47:51 +00004189 if (CRC)
Joey Gouly1e8637b2013-09-18 10:07:09 +00004190 Builder.defineMacro("__ARM_FEATURE_CRC32");
Weiming Zhao53a797c2013-09-30 22:51:32 +00004191
Tim Northover02e38602014-02-03 17:28:04 +00004192 if (Crypto)
4193 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4194
Bernard Ogden58a05cf2013-10-24 18:32:44 +00004195 if (CPUArchVer >= 6 && CPUArch != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004196 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4197 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4198 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4199 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4200 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004201 }
Craig Topper3164f332014-03-11 03:39:26 +00004202 void getTargetBuiltins(const Builtin::Info *&Records,
4203 unsigned &NumRecords) const override {
Chris Lattner5cc15e02010-03-03 19:03:45 +00004204 Records = BuiltinInfo;
4205 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
Chris Lattner17df24e2008-04-21 18:56:49 +00004206 }
Craig Topper3164f332014-03-11 03:39:26 +00004207 bool isCLZForZeroUndef() const override { return false; }
4208 BuiltinVaListKind getBuiltinVaListKind() const override {
Logan Chien57086ce2012-10-10 06:56:20 +00004209 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
Chris Lattner17df24e2008-04-21 18:56:49 +00004210 }
Craig Topper3164f332014-03-11 03:39:26 +00004211 void getGCCRegNames(const char * const *&Names,
4212 unsigned &NumNames) const override;
4213 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4214 unsigned &NumAliases) const override;
4215 bool validateAsmConstraint(const char *&Name,
4216 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004217 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004218 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004219 case 'l': // r0-r7
4220 case 'h': // r8-r15
4221 case 'w': // VFP Floating point register single precision
4222 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004223 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004224 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004225 case 'Q': // A memory address that is a single base register.
4226 Info.setAllowsMemory();
4227 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004228 case 'U': // a memory reference...
4229 switch (Name[1]) {
4230 case 'q': // ...ARMV4 ldrsb
4231 case 'v': // ...VFP load/store (reg+constant offset)
4232 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004233 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004234 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004235 case 'n': // valid address for Neon doubleword vector load/store
4236 case 'm': // valid address for Neon element and structure load/store
4237 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004238 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004239 Info.setAllowsMemory();
4240 Name++;
4241 return true;
4242 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004243 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004244 return false;
4245 }
Craig Topper3164f332014-03-11 03:39:26 +00004246 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004247 std::string R;
4248 switch (*Constraint) {
4249 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004250 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004251 Constraint++;
4252 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004253 case 'p': // 'p' should be translated to 'r' by default.
4254 R = std::string("r");
4255 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004256 default:
4257 return std::string(1, *Constraint);
4258 }
4259 return R;
4260 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004261 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004262 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004263 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004264 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004265 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004266
Bill Wendling9d1ee112012-10-25 23:28:48 +00004267 // Strip off constraint modifiers.
4268 while (Constraint[0] == '=' ||
4269 Constraint[0] == '+' ||
4270 Constraint[0] == '&')
4271 Constraint = Constraint.substr(1);
4272
4273 switch (Constraint[0]) {
4274 default: break;
4275 case 'r': {
4276 switch (Modifier) {
4277 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004278 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004279 case 'q':
4280 // A register of size 32 cannot fit a vector type.
4281 return false;
4282 }
4283 }
4284 }
4285
4286 return true;
4287 }
Craig Topper3164f332014-03-11 03:39:26 +00004288 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004289 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004290 return "";
4291 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004292
Craig Topper3164f332014-03-11 03:39:26 +00004293 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004294 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4295 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00004296
Craig Topper3164f332014-03-11 03:39:26 +00004297 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00004298 if (RegNo == 0) return 0;
4299 if (RegNo == 1) return 1;
4300 return -1;
4301 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004302};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004303
Rafael Espindolaeb265472013-08-21 21:59:03 +00004304bool ARMTargetInfo::setFPMath(StringRef Name) {
4305 if (Name == "neon") {
4306 FPMath = FP_Neon;
4307 return true;
4308 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4309 Name == "vfp4") {
4310 FPMath = FP_VFP;
4311 return true;
4312 }
4313 return false;
4314}
4315
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004316const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004317 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004318 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004319 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4320
4321 // Float registers
4322 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4323 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4324 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004325 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00004326
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004327 // Double registers
4328 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4329 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004330 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4331 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004332
4333 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00004334 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4335 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004336};
4337
4338void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004339 unsigned &NumNames) const {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004340 Names = GCCRegNames;
4341 NumNames = llvm::array_lengthof(GCCRegNames);
4342}
4343
4344const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004345 { { "a1" }, "r0" },
4346 { { "a2" }, "r1" },
4347 { { "a3" }, "r2" },
4348 { { "a4" }, "r3" },
4349 { { "v1" }, "r4" },
4350 { { "v2" }, "r5" },
4351 { { "v3" }, "r6" },
4352 { { "v4" }, "r7" },
4353 { { "v5" }, "r8" },
4354 { { "v6", "rfp" }, "r9" },
4355 { { "sl" }, "r10" },
4356 { { "fp" }, "r11" },
4357 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00004358 { { "r13" }, "sp" },
4359 { { "r14" }, "lr" },
4360 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00004361 // The S, D and Q registers overlap, but aren't really aliases; we
4362 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004363};
4364
4365void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4366 unsigned &NumAliases) const {
4367 Aliases = GCCRegAliases;
4368 NumAliases = llvm::array_lengthof(GCCRegAliases);
4369}
Chris Lattner5cc15e02010-03-03 19:03:45 +00004370
4371const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004372#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Fariborz Jahaniane8473c22010-11-30 17:35:24 +00004373#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
Eli Friedmanbb5c9ae2011-07-05 21:53:01 +00004374 ALL_LANGUAGES },
Tim Northovera2ee4332014-03-29 15:09:45 +00004375#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00004376
4377#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Saleem Abdulrasool4bddd9d2014-07-02 17:41:27 +00004378#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
Tim Northoverc322f832014-01-30 14:47:51 +00004379#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4380 ALL_LANGUAGES },
Chris Lattner5cc15e02010-03-03 19:03:45 +00004381#include "clang/Basic/BuiltinsARM.def"
4382};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004383
4384class ARMleTargetInfo : public ARMTargetInfo {
4385public:
4386 ARMleTargetInfo(const llvm::Triple &Triple)
4387 : ARMTargetInfo(Triple, false) { }
4388 virtual void getTargetDefines(const LangOptions &Opts,
4389 MacroBuilder &Builder) const {
4390 Builder.defineMacro("__ARMEL__");
4391 ARMTargetInfo::getTargetDefines(Opts, Builder);
4392 }
4393};
4394
4395class ARMbeTargetInfo : public ARMTargetInfo {
4396public:
4397 ARMbeTargetInfo(const llvm::Triple &Triple)
4398 : ARMTargetInfo(Triple, true) { }
4399 virtual void getTargetDefines(const LangOptions &Opts,
4400 MacroBuilder &Builder) const {
4401 Builder.defineMacro("__ARMEB__");
4402 Builder.defineMacro("__ARM_BIG_ENDIAN");
4403 ARMTargetInfo::getTargetDefines(Opts, Builder);
4404 }
4405};
Chris Lattner17df24e2008-04-21 18:56:49 +00004406} // end anonymous namespace.
4407
Eli Friedmanf05b7722008-08-20 07:44:10 +00004408namespace {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004409class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4410 const llvm::Triple Triple;
4411public:
4412 WindowsARMTargetInfo(const llvm::Triple &Triple)
4413 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4414 TLSSupported = false;
4415 WCharType = UnsignedShort;
4416 SizeType = UnsignedInt;
4417 UserLabelPrefix = "";
4418 }
4419 void getVisualStudioDefines(const LangOptions &Opts,
4420 MacroBuilder &Builder) const {
4421 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4422
4423 // FIXME: this is invalid for WindowsCE
4424 Builder.defineMacro("_M_ARM_NT", "1");
4425 Builder.defineMacro("_M_ARMT", "_M_ARM");
4426 Builder.defineMacro("_M_THUMB", "_M_ARM");
4427
4428 assert((Triple.getArch() == llvm::Triple::arm ||
4429 Triple.getArch() == llvm::Triple::thumb) &&
4430 "invalid architecture for Windows ARM target info");
4431 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4432 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4433
4434 // TODO map the complete set of values
4435 // 31: VFPv3 40: VFPv4
4436 Builder.defineMacro("_M_ARM_FP", "31");
4437 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00004438 BuiltinVaListKind getBuiltinVaListKind() const override {
4439 return TargetInfo::CharPtrBuiltinVaList;
4440 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004441};
4442
4443// Windows ARM + Itanium C++ ABI Target
4444class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4445public:
4446 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4447 : WindowsARMTargetInfo(Triple) {
4448 TheCXXABI.set(TargetCXXABI::GenericARM);
4449 }
4450
4451 void getTargetDefines(const LangOptions &Opts,
4452 MacroBuilder &Builder) const override {
4453 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4454
4455 if (Opts.MSVCCompat)
4456 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4457 }
4458};
4459
4460// Windows ARM, MS (C++) ABI
4461class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4462public:
4463 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4464 : WindowsARMTargetInfo(Triple) {
4465 TheCXXABI.set(TargetCXXABI::Microsoft);
4466 }
4467
4468 void getTargetDefines(const LangOptions &Opts,
4469 MacroBuilder &Builder) const override {
4470 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4471 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4472 }
4473};
4474}
4475
4476
4477namespace {
Mike Stump11289f42009-09-09 15:08:12 +00004478class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004479 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00004480protected:
Craig Topper3164f332014-03-11 03:39:26 +00004481 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4482 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00004483 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00004484 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004485
Torok Edwinb2b37c62009-06-30 17:10:35 +00004486public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004487 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004488 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004489 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004490 // iOS always has 64-bit atomic instructions.
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004491 // FIXME: This should be based off of the target features in ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004492 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00004493
4494 // Darwin on iOS uses a variant of the ARM C++ ABI.
4495 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00004496 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00004497};
4498} // end anonymous namespace.
4499
Tony Linthicum76329bf2011-12-12 21:14:55 +00004500
4501namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004502class AArch64TargetInfo : public TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004503 virtual void setDescriptionString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00004504 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4505 static const char *const GCCRegNames[];
4506
James Molloy75f5f9e2014-04-16 15:33:48 +00004507 enum FPUModeEnum {
4508 FPUMode,
4509 NeonMode
4510 };
4511
4512 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00004513 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00004514 unsigned Crypto;
4515
Tim Northovera2ee4332014-03-29 15:09:45 +00004516 static const Builtin::Info BuiltinInfo[];
4517
4518 std::string ABI;
4519
4520public:
Tim Northover573cbee2014-05-24 12:52:07 +00004521 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00004522 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00004523
4524 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4525 WCharType = SignedInt;
4526
4527 // NetBSD apparently prefers consistency across ARM targets to consistency
4528 // across 64-bit targets.
4529 Int64Type = SignedLongLong;
4530 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004531 } else {
4532 WCharType = UnsignedInt;
4533 Int64Type = SignedLong;
4534 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00004535 }
4536
Tim Northovera2ee4332014-03-29 15:09:45 +00004537 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00004538 MaxVectorAlign = 128;
4539 RegParmMax = 8;
4540 MaxAtomicInlineWidth = 128;
4541 MaxAtomicPromoteWidth = 128;
4542
4543 LongDoubleWidth = LongDoubleAlign = 128;
4544 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4545
Tim Northovera2ee4332014-03-29 15:09:45 +00004546 // {} in inline assembly are neon specifiers, not assembly variant
4547 // specifiers.
4548 NoAsmVariants = true;
4549
Tim Northover573cbee2014-05-24 12:52:07 +00004550 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00004551 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4552 }
4553
Alp Toker4925ba72014-06-07 23:30:42 +00004554 StringRef getABI() const override { return ABI; }
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004555 virtual bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004556 if (Name != "aapcs" && Name != "darwinpcs")
4557 return false;
4558
4559 ABI = Name;
4560 return true;
4561 }
4562
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004563 virtual bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004564 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00004565 .Case("generic", true)
James Molloyec78aa42014-04-17 12:51:28 +00004566 .Cases("cortex-a53", "cortex-a57", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00004567 .Case("cyclone", true)
4568 .Default(false);
4569 return CPUKnown;
4570 }
4571
4572 virtual void getTargetDefines(const LangOptions &Opts,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004573 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004574 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00004575 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004576
4577 // Target properties.
4578 Builder.defineMacro("_LP64");
4579 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00004580
4581 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4582 Builder.defineMacro("__ARM_ACLE", "200");
4583 Builder.defineMacro("__ARM_ARCH", "8");
4584 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4585
4586 Builder.defineMacro("__ARM_64BIT_STATE");
4587 Builder.defineMacro("__ARM_PCS_AAPCS64");
4588 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4589
4590 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4591 Builder.defineMacro("__ARM_FEATURE_CLZ");
4592 Builder.defineMacro("__ARM_FEATURE_FMA");
4593 Builder.defineMacro("__ARM_FEATURE_DIV");
James Molloy0ffb0932014-09-15 11:25:38 +00004594 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4595 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4596 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4597 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
Tim Northovera2ee4332014-03-29 15:09:45 +00004598
4599 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4600
4601 // 0xe implies support for half, single and double precision operations.
4602 Builder.defineMacro("__ARM_FP", "0xe");
4603
4604 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4605 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4606 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4607
4608 if (Opts.FastMath || Opts.FiniteMathOnly)
4609 Builder.defineMacro("__ARM_FP_FAST");
4610
Richard Smithab506ad2014-10-20 23:26:58 +00004611 if (Opts.C99 && !Opts.Freestanding)
Tim Northovera2ee4332014-03-29 15:09:45 +00004612 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4613
4614 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4615
4616 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4617 Opts.ShortEnums ? "1" : "4");
4618
James Molloy75f5f9e2014-04-16 15:33:48 +00004619 if (FPU == NeonMode) {
4620 Builder.defineMacro("__ARM_NEON");
4621 // 64-bit NEON supports half, single and double precision operations.
Bradley Smith9a6b2952014-05-02 15:18:38 +00004622 Builder.defineMacro("__ARM_NEON_FP", "0xe");
James Molloy75f5f9e2014-04-16 15:33:48 +00004623 }
Tim Northovera2ee4332014-03-29 15:09:45 +00004624
Bradley Smith418c5932014-05-02 15:17:51 +00004625 if (CRC)
4626 Builder.defineMacro("__ARM_FEATURE_CRC32");
4627
James Molloy75f5f9e2014-04-16 15:33:48 +00004628 if (Crypto)
4629 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
Tim Northovera2ee4332014-03-29 15:09:45 +00004630 }
4631
4632 virtual void getTargetBuiltins(const Builtin::Info *&Records,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004633 unsigned &NumRecords) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004634 Records = BuiltinInfo;
Tim Northover573cbee2014-05-24 12:52:07 +00004635 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
Tim Northovera2ee4332014-03-29 15:09:45 +00004636 }
4637
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004638 virtual bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004639 return Feature == "aarch64" ||
4640 Feature == "arm64" ||
4641 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00004642 }
4643
James Molloy5e73df52014-04-16 15:06:20 +00004644 bool handleTargetFeatures(std::vector<std::string> &Features,
4645 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00004646 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004647 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00004648 Crypto = 0;
4649 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4650 if (Features[i] == "+neon")
4651 FPU = NeonMode;
Bradley Smith418c5932014-05-02 15:17:51 +00004652 if (Features[i] == "+crc")
4653 CRC = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00004654 if (Features[i] == "+crypto")
4655 Crypto = 1;
4656 }
4657
James Molloy5e73df52014-04-16 15:06:20 +00004658 setDescriptionString();
4659
4660 return true;
4661 }
4662
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004663 virtual bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004664
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004665 virtual BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004666 return TargetInfo::AArch64ABIBuiltinVaList;
4667 }
4668
4669 virtual void getGCCRegNames(const char *const *&Names,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004670 unsigned &NumNames) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004671 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004672 unsigned &NumAliases) const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00004673
4674 virtual bool validateAsmConstraint(const char *&Name,
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004675 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004676 switch (*Name) {
4677 default:
4678 return false;
4679 case 'w': // Floating point and SIMD registers (V0-V31)
4680 Info.setAllowsRegister();
4681 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00004682 case 'I': // Constant that can be used with an ADD instruction
4683 case 'J': // Constant that can be used with a SUB instruction
4684 case 'K': // Constant that can be used with a 32-bit logical instruction
4685 case 'L': // Constant that can be used with a 64-bit logical instruction
4686 case 'M': // Constant that can be used as a 32-bit MOV immediate
4687 case 'N': // Constant that can be used as a 64-bit MOV immediate
4688 case 'Y': // Floating point constant zero
4689 case 'Z': // Integer constant zero
4690 return true;
4691 case 'Q': // A memory reference with base register and no offset
4692 Info.setAllowsMemory();
4693 return true;
4694 case 'S': // A symbolic address
4695 Info.setAllowsRegister();
4696 return true;
4697 case 'U':
4698 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes, whatever they may be
4699 // Utf: A memory address suitable for ldp/stp in TF mode, whatever it may be
4700 // Usa: An absolute symbolic address
4701 // Ush: The high part (bits 32:12) of a pc-relative symbolic address
4702 llvm_unreachable("FIXME: Unimplemented support for bizarre constraints");
Tim Northovera2ee4332014-03-29 15:09:45 +00004703 case 'z': // Zero register, wzr or xzr
4704 Info.setAllowsRegister();
4705 return true;
4706 case 'x': // Floating point and SIMD registers (V0-V15)
4707 Info.setAllowsRegister();
4708 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00004709 }
4710 return false;
4711 }
4712
Akira Hatanaka987f1862014-08-22 06:05:21 +00004713 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004714 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004715 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00004716 // Strip off constraint modifiers.
4717 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4718 Constraint = Constraint.substr(1);
4719
4720 switch (Constraint[0]) {
4721 default:
4722 return true;
4723 case 'z':
4724 case 'r': {
4725 switch (Modifier) {
4726 case 'x':
4727 case 'w':
4728 // For now assume that the person knows what they're
4729 // doing with the modifier.
4730 return true;
4731 default:
4732 // By default an 'r' constraint will be in the 'x'
4733 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00004734 if (Size == 64)
4735 return true;
4736
4737 SuggestedModifier = "w";
4738 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00004739 }
4740 }
4741 }
4742 }
4743
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004744 virtual const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00004745
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004746 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004747 if (RegNo == 0)
4748 return 0;
4749 if (RegNo == 1)
4750 return 1;
4751 return -1;
4752 }
4753};
4754
Tim Northover573cbee2014-05-24 12:52:07 +00004755const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004756 // 32-bit Integer registers
4757 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4758 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4759 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4760
4761 // 64-bit Integer registers
4762 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4763 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4764 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4765
4766 // 32-bit floating point regsisters
4767 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4768 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4769 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4770
4771 // 64-bit floating point regsisters
4772 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4773 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4774 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4775
4776 // Vector registers
4777 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4778 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4779 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4780};
4781
Tim Northover573cbee2014-05-24 12:52:07 +00004782void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
Tim Northovera2ee4332014-03-29 15:09:45 +00004783 unsigned &NumNames) const {
4784 Names = GCCRegNames;
4785 NumNames = llvm::array_lengthof(GCCRegNames);
4786}
4787
Tim Northover573cbee2014-05-24 12:52:07 +00004788const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004789 { { "w31" }, "wsp" },
4790 { { "x29" }, "fp" },
4791 { { "x30" }, "lr" },
4792 { { "x31" }, "sp" },
4793 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4794 // don't want to substitute one of these for a different-sized one.
4795};
4796
Tim Northover573cbee2014-05-24 12:52:07 +00004797void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
Tim Northovera2ee4332014-03-29 15:09:45 +00004798 unsigned &NumAliases) const {
4799 Aliases = GCCRegAliases;
4800 NumAliases = llvm::array_lengthof(GCCRegAliases);
4801}
4802
Tim Northover573cbee2014-05-24 12:52:07 +00004803const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00004804#define BUILTIN(ID, TYPE, ATTRS) \
4805 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4806#include "clang/Basic/BuiltinsNEON.def"
4807
4808#define BUILTIN(ID, TYPE, ATTRS) \
4809 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
Tim Northover573cbee2014-05-24 12:52:07 +00004810#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00004811};
James Molloy5e73df52014-04-16 15:06:20 +00004812
Tim Northover573cbee2014-05-24 12:52:07 +00004813class AArch64leTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004814 void setDescriptionString() override {
4815 if (getTriple().isOSBinFormatMachO())
4816 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4817 else
4818 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4819 }
4820
4821public:
Tim Northover573cbee2014-05-24 12:52:07 +00004822 AArch64leTargetInfo(const llvm::Triple &Triple)
4823 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00004824 BigEndian = false;
4825 }
4826 void getTargetDefines(const LangOptions &Opts,
4827 MacroBuilder &Builder) const override {
4828 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00004829 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004830 }
4831};
4832
Tim Northover573cbee2014-05-24 12:52:07 +00004833class AArch64beTargetInfo : public AArch64TargetInfo {
James Molloy5e73df52014-04-16 15:06:20 +00004834 void setDescriptionString() override {
4835 assert(!getTriple().isOSBinFormatMachO());
4836 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4837 }
4838
4839public:
Tim Northover573cbee2014-05-24 12:52:07 +00004840 AArch64beTargetInfo(const llvm::Triple &Triple)
4841 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00004842 void getTargetDefines(const LangOptions &Opts,
4843 MacroBuilder &Builder) const override {
4844 Builder.defineMacro("__AARCH64EB__");
4845 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4846 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00004847 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00004848 }
4849};
Tim Northovera2ee4332014-03-29 15:09:45 +00004850} // end anonymous namespace.
4851
4852namespace {
Tim Northover573cbee2014-05-24 12:52:07 +00004853class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00004854protected:
4855 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4856 MacroBuilder &Builder) const override {
4857 Builder.defineMacro("__AARCH64_SIMD__");
4858 Builder.defineMacro("__ARM64_ARCH_8__");
4859 Builder.defineMacro("__ARM_NEON__");
4860 Builder.defineMacro("__LITTLE_ENDIAN__");
4861 Builder.defineMacro("__REGISTER_PREFIX__", "");
4862 Builder.defineMacro("__arm64", "1");
4863 Builder.defineMacro("__arm64__", "1");
4864
4865 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4866 }
4867
Tim Northovera2ee4332014-03-29 15:09:45 +00004868public:
Tim Northover573cbee2014-05-24 12:52:07 +00004869 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4870 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00004871 Int64Type = SignedLongLong;
4872 WCharType = SignedInt;
4873 UseSignedCharForObjCBool = false;
4874
4875 LongDoubleWidth = LongDoubleAlign = 64;
4876 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4877
4878 TheCXXABI.set(TargetCXXABI::iOS64);
4879 }
4880
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00004881 virtual BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00004882 return TargetInfo::CharPtrBuiltinVaList;
4883 }
4884};
4885} // end anonymous namespace
4886
4887namespace {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004888// Hexagon abstract base class
4889class HexagonTargetInfo : public TargetInfo {
4890 static const Builtin::Info BuiltinInfo[];
4891 static const char * const GCCRegNames[];
4892 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4893 std::string CPU;
4894public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004895 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00004896 BigEndian = false;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004897 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
Tony Linthicum76329bf2011-12-12 21:14:55 +00004898
4899 // {} in inline assembly are packet specifiers, not assembly variant
4900 // specifiers.
4901 NoAsmVariants = true;
4902 }
4903
Craig Topper3164f332014-03-11 03:39:26 +00004904 void getTargetBuiltins(const Builtin::Info *&Records,
4905 unsigned &NumRecords) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004906 Records = BuiltinInfo;
4907 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
4908 }
4909
Craig Topper3164f332014-03-11 03:39:26 +00004910 bool validateAsmConstraint(const char *&Name,
4911 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004912 return true;
4913 }
4914
Craig Topper3164f332014-03-11 03:39:26 +00004915 void getTargetDefines(const LangOptions &Opts,
4916 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004917
Craig Topper3164f332014-03-11 03:39:26 +00004918 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004919 return Feature == "hexagon";
4920 }
Craig Topper3164f332014-03-11 03:39:26 +00004921
4922 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004923 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004924 }
Craig Topper3164f332014-03-11 03:39:26 +00004925 void getGCCRegNames(const char * const *&Names,
4926 unsigned &NumNames) const override;
4927 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4928 unsigned &NumAliases) const override;
4929 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004930 return "";
4931 }
Sebastian Pop86500282012-01-13 20:37:10 +00004932
4933 static const char *getHexagonCPUSuffix(StringRef Name) {
4934 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00004935 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004936 .Case("hexagonv5", "5")
Craig Topperf1186c52014-05-08 06:41:40 +00004937 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00004938 }
4939
Craig Topper3164f332014-03-11 03:39:26 +00004940 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00004941 if (!getHexagonCPUSuffix(Name))
4942 return false;
4943
Tony Linthicum76329bf2011-12-12 21:14:55 +00004944 CPU = Name;
4945 return true;
4946 }
4947};
4948
4949void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
4950 MacroBuilder &Builder) const {
4951 Builder.defineMacro("qdsp6");
4952 Builder.defineMacro("__qdsp6", "1");
4953 Builder.defineMacro("__qdsp6__", "1");
4954
4955 Builder.defineMacro("hexagon");
4956 Builder.defineMacro("__hexagon", "1");
4957 Builder.defineMacro("__hexagon__", "1");
4958
4959 if(CPU == "hexagonv1") {
4960 Builder.defineMacro("__HEXAGON_V1__");
4961 Builder.defineMacro("__HEXAGON_ARCH__", "1");
4962 if(Opts.HexagonQdsp6Compat) {
4963 Builder.defineMacro("__QDSP6_V1__");
4964 Builder.defineMacro("__QDSP6_ARCH__", "1");
4965 }
4966 }
4967 else if(CPU == "hexagonv2") {
4968 Builder.defineMacro("__HEXAGON_V2__");
4969 Builder.defineMacro("__HEXAGON_ARCH__", "2");
4970 if(Opts.HexagonQdsp6Compat) {
4971 Builder.defineMacro("__QDSP6_V2__");
4972 Builder.defineMacro("__QDSP6_ARCH__", "2");
4973 }
4974 }
4975 else if(CPU == "hexagonv3") {
4976 Builder.defineMacro("__HEXAGON_V3__");
4977 Builder.defineMacro("__HEXAGON_ARCH__", "3");
4978 if(Opts.HexagonQdsp6Compat) {
4979 Builder.defineMacro("__QDSP6_V3__");
4980 Builder.defineMacro("__QDSP6_ARCH__", "3");
4981 }
4982 }
4983 else if(CPU == "hexagonv4") {
4984 Builder.defineMacro("__HEXAGON_V4__");
4985 Builder.defineMacro("__HEXAGON_ARCH__", "4");
4986 if(Opts.HexagonQdsp6Compat) {
4987 Builder.defineMacro("__QDSP6_V4__");
4988 Builder.defineMacro("__QDSP6_ARCH__", "4");
4989 }
4990 }
Sirish Pande11ebc4e2012-05-10 20:19:54 +00004991 else if(CPU == "hexagonv5") {
4992 Builder.defineMacro("__HEXAGON_V5__");
4993 Builder.defineMacro("__HEXAGON_ARCH__", "5");
4994 if(Opts.HexagonQdsp6Compat) {
4995 Builder.defineMacro("__QDSP6_V5__");
4996 Builder.defineMacro("__QDSP6_ARCH__", "5");
4997 }
4998 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004999}
5000
5001const char * const HexagonTargetInfo::GCCRegNames[] = {
5002 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5003 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5004 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5005 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5006 "p0", "p1", "p2", "p3",
5007 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5008};
5009
5010void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5011 unsigned &NumNames) const {
5012 Names = GCCRegNames;
5013 NumNames = llvm::array_lengthof(GCCRegNames);
5014}
5015
5016
5017const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5018 { { "sp" }, "r29" },
5019 { { "fp" }, "r30" },
5020 { { "lr" }, "r31" },
5021 };
5022
5023void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5024 unsigned &NumAliases) const {
5025 Aliases = GCCRegAliases;
5026 NumAliases = llvm::array_lengthof(GCCRegAliases);
5027}
5028
5029
5030const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5031#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5032#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5033 ALL_LANGUAGES },
5034#include "clang/Basic/BuiltinsHexagon.def"
5035};
5036}
5037
5038
Chris Lattner5ba61f02006-10-14 07:39:34 +00005039namespace {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005040// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5041class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005042 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5043 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005044 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005045public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005046 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005047
Craig Topper3164f332014-03-11 03:39:26 +00005048 bool handleTargetFeatures(std::vector<std::string> &Features,
5049 DiagnosticsEngine &Diags) override {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005050 SoftFloat = false;
5051 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5052 if (Features[i] == "+soft-float")
5053 SoftFloat = true;
Rafael Espindolaeb265472013-08-21 21:59:03 +00005054 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005055 }
Craig Topper3164f332014-03-11 03:39:26 +00005056 void getTargetDefines(const LangOptions &Opts,
5057 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005058 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005059 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005060
5061 if (SoftFloat)
5062 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005063 }
Craig Topper3164f332014-03-11 03:39:26 +00005064
5065 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005066 return llvm::StringSwitch<bool>(Feature)
5067 .Case("softfloat", SoftFloat)
5068 .Case("sparc", true)
5069 .Default(false);
5070 }
Craig Topper3164f332014-03-11 03:39:26 +00005071
5072 void getTargetBuiltins(const Builtin::Info *&Records,
5073 unsigned &NumRecords) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005074 // FIXME: Implement!
Gabor Greif49991682008-02-21 16:29:08 +00005075 }
Craig Topper3164f332014-03-11 03:39:26 +00005076 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005077 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005078 }
Craig Topper3164f332014-03-11 03:39:26 +00005079 void getGCCRegNames(const char * const *&Names,
5080 unsigned &NumNames) const override;
5081 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5082 unsigned &NumAliases) const override;
5083 bool validateAsmConstraint(const char *&Name,
5084 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005085 // FIXME: Implement!
5086 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005087 }
Craig Topper3164f332014-03-11 03:39:26 +00005088 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005089 // FIXME: Implement!
5090 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005091 }
5092};
5093
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005094const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005095 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5096 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5097 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5098 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5099};
5100
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005101void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5102 unsigned &NumNames) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005103 Names = GCCRegNames;
5104 NumNames = llvm::array_lengthof(GCCRegNames);
5105}
5106
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005107const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005108 { { "g0" }, "r0" },
5109 { { "g1" }, "r1" },
5110 { { "g2" }, "r2" },
5111 { { "g3" }, "r3" },
5112 { { "g4" }, "r4" },
5113 { { "g5" }, "r5" },
5114 { { "g6" }, "r6" },
5115 { { "g7" }, "r7" },
5116 { { "o0" }, "r8" },
5117 { { "o1" }, "r9" },
5118 { { "o2" }, "r10" },
5119 { { "o3" }, "r11" },
5120 { { "o4" }, "r12" },
5121 { { "o5" }, "r13" },
5122 { { "o6", "sp" }, "r14" },
5123 { { "o7" }, "r15" },
5124 { { "l0" }, "r16" },
5125 { { "l1" }, "r17" },
5126 { { "l2" }, "r18" },
5127 { { "l3" }, "r19" },
5128 { { "l4" }, "r20" },
5129 { { "l5" }, "r21" },
5130 { { "l6" }, "r22" },
5131 { { "l7" }, "r23" },
5132 { { "i0" }, "r24" },
5133 { { "i1" }, "r25" },
5134 { { "i2" }, "r26" },
5135 { { "i3" }, "r27" },
5136 { { "i4" }, "r28" },
5137 { { "i5" }, "r29" },
5138 { { "i6", "fp" }, "r30" },
5139 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00005140};
5141
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005142void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5143 unsigned &NumAliases) const {
Chris Lattner9b415d62009-01-27 01:58:38 +00005144 Aliases = GCCRegAliases;
5145 NumAliases = llvm::array_lengthof(GCCRegAliases);
5146}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005147
5148// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5149class SparcV8TargetInfo : public SparcTargetInfo {
5150public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005151 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005152 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005153 }
5154
Craig Topper3164f332014-03-11 03:39:26 +00005155 void getTargetDefines(const LangOptions &Opts,
5156 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005157 SparcTargetInfo::getTargetDefines(Opts, Builder);
5158 Builder.defineMacro("__sparcv8");
5159 }
5160};
5161
5162// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5163class SparcV9TargetInfo : public SparcTargetInfo {
5164public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005165 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005166 // FIXME: Support Sparc quad-precision long double?
Rafael Espindolac418ae92014-01-03 19:22:05 +00005167 DescriptionString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00005168 // This is an LP64 platform.
5169 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005170
5171 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005172 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005173 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00005174 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005175 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00005176 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00005177
5178 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5179 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5180 LongDoubleWidth = 128;
5181 LongDoubleAlign = 128;
5182 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00005183 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005184 }
5185
Craig Topper3164f332014-03-11 03:39:26 +00005186 void getTargetDefines(const LangOptions &Opts,
5187 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005188 SparcTargetInfo::getTargetDefines(Opts, Builder);
5189 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005190 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00005191 // Solaris doesn't need these variants, but the BSDs do.
5192 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00005193 Builder.defineMacro("__sparc64__");
5194 Builder.defineMacro("__sparc_v9__");
5195 Builder.defineMacro("__sparcv9__");
5196 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005197 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005198
Craig Topper3164f332014-03-11 03:39:26 +00005199 bool setCPU(const std::string &Name) override {
Roman Divackyb1ae3d42014-02-25 18:35:30 +00005200 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5201 .Case("v9", true)
5202 .Case("ultrasparc", true)
5203 .Case("ultrasparc3", true)
5204 .Case("niagara", true)
5205 .Case("niagara2", true)
5206 .Case("niagara3", true)
5207 .Case("niagara4", true)
5208 .Default(false);
5209
5210 // No need to store the CPU yet. There aren't any CPU-specific
5211 // macros to define.
5212 return CPUKnown;
5213 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005214};
5215
Gabor Greif49991682008-02-21 16:29:08 +00005216} // end anonymous namespace.
5217
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005218namespace {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005219class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005220public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005221 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5222 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
Eli Friedmand50881c2008-11-02 02:43:55 +00005223 SizeType = UnsignedInt;
5224 PtrDiffType = SignedInt;
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005225 }
5226};
5227} // end anonymous namespace.
Chris Lattner5ba61f02006-10-14 07:39:34 +00005228
Chris Lattnerb781dc792008-05-08 05:58:21 +00005229namespace {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005230class SystemZTargetInfo : public TargetInfo {
5231 static const char *const GCCRegNames[];
Ulrich Weigand47445072013-05-06 16:26:41 +00005232
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005233public:
5234 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5235 TLSSupported = true;
5236 IntWidth = IntAlign = 32;
5237 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5238 PointerWidth = PointerAlign = 64;
5239 LongDoubleWidth = 128;
5240 LongDoubleAlign = 64;
5241 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5242 MinGlobalAlign = 16;
5243 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5244 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5245 }
5246 void getTargetDefines(const LangOptions &Opts,
5247 MacroBuilder &Builder) const override {
5248 Builder.defineMacro("__s390__");
5249 Builder.defineMacro("__s390x__");
5250 Builder.defineMacro("__zarch__");
5251 Builder.defineMacro("__LONG_DOUBLE_128__");
5252 }
5253 void getTargetBuiltins(const Builtin::Info *&Records,
5254 unsigned &NumRecords) const override {
5255 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005256 Records = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005257 NumRecords = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005258 }
5259
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005260 void getGCCRegNames(const char *const *&Names,
5261 unsigned &NumNames) const override;
5262 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5263 unsigned &NumAliases) const override {
5264 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005265 Aliases = nullptr;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005266 NumAliases = 0;
Ulrich Weigand47445072013-05-06 16:26:41 +00005267 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00005268 bool validateAsmConstraint(const char *&Name,
5269 TargetInfo::ConstraintInfo &info) const override;
5270 const char *getClobbers() const override {
5271 // FIXME: Is this really right?
5272 return "";
5273 }
5274 BuiltinVaListKind getBuiltinVaListKind() const override {
5275 return TargetInfo::SystemZBuiltinVaList;
5276 }
5277 bool setCPU(const std::string &Name) override {
5278 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5279 .Case("z10", true)
5280 .Case("z196", true)
5281 .Case("zEC12", true)
5282 .Default(false);
5283
5284 // No need to store the CPU yet. There aren't any CPU-specific
5285 // macros to define.
5286 return CPUKnown;
5287 }
5288};
5289
5290const char *const SystemZTargetInfo::GCCRegNames[] = {
5291 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5292 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5293 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5294 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5295};
5296
5297void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5298 unsigned &NumNames) const {
5299 Names = GCCRegNames;
5300 NumNames = llvm::array_lengthof(GCCRegNames);
5301}
5302
5303bool SystemZTargetInfo::
5304validateAsmConstraint(const char *&Name,
5305 TargetInfo::ConstraintInfo &Info) const {
5306 switch (*Name) {
5307 default:
5308 return false;
5309
5310 case 'a': // Address register
5311 case 'd': // Data register (equivalent to 'r')
5312 case 'f': // Floating-point register
5313 Info.setAllowsRegister();
5314 return true;
5315
5316 case 'I': // Unsigned 8-bit constant
5317 case 'J': // Unsigned 12-bit constant
5318 case 'K': // Signed 16-bit constant
5319 case 'L': // Signed 20-bit displacement (on all targets we support)
5320 case 'M': // 0x7fffffff
5321 return true;
5322
5323 case 'Q': // Memory with base and unsigned 12-bit displacement
5324 case 'R': // Likewise, plus an index
5325 case 'S': // Memory with base and signed 20-bit displacement
5326 case 'T': // Likewise, plus an index
5327 Info.setAllowsMemory();
5328 return true;
5329 }
5330}
Ulrich Weigand47445072013-05-06 16:26:41 +00005331}
5332
5333namespace {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005334 class MSP430TargetInfo : public TargetInfo {
5335 static const char * const GCCRegNames[];
5336 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005337 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005338 BigEndian = false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005339 TLSSupported = false;
Anton Korobeynikovcbc4e982010-01-30 12:55:11 +00005340 IntWidth = 16; IntAlign = 16;
5341 LongWidth = 32; LongLongWidth = 64;
5342 LongAlign = LongLongAlign = 16;
5343 PointerWidth = 16; PointerAlign = 16;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005344 SuitableAlign = 16;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005345 SizeType = UnsignedInt;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005346 IntMaxType = SignedLongLong;
Anton Korobeynikovef412902013-07-01 19:42:40 +00005347 IntPtrType = SignedInt;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005348 PtrDiffType = SignedInt;
Edward O'Callaghan847f2a12009-11-21 00:49:54 +00005349 SigAtomicType = SignedLong;
Job Noormanac95cd52014-09-30 11:19:13 +00005350 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Craig Topper3164f332014-03-11 03:39:26 +00005351 }
5352 void getTargetDefines(const LangOptions &Opts,
5353 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005354 Builder.defineMacro("MSP430");
5355 Builder.defineMacro("__MSP430__");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005356 // FIXME: defines for different 'flavours' of MCU
5357 }
Craig Topper3164f332014-03-11 03:39:26 +00005358 void getTargetBuiltins(const Builtin::Info *&Records,
5359 unsigned &NumRecords) const override {
5360 // FIXME: Implement.
Craig Topperf1186c52014-05-08 06:41:40 +00005361 Records = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005362 NumRecords = 0;
5363 }
Craig Topper3164f332014-03-11 03:39:26 +00005364 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005365 return Feature == "msp430";
5366 }
Craig Topper3164f332014-03-11 03:39:26 +00005367 void getGCCRegNames(const char * const *&Names,
5368 unsigned &NumNames) const override;
5369 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5370 unsigned &NumAliases) const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005371 // No aliases.
Craig Topperf1186c52014-05-08 06:41:40 +00005372 Aliases = nullptr;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005373 NumAliases = 0;
5374 }
Craig Topper3164f332014-03-11 03:39:26 +00005375 bool validateAsmConstraint(const char *&Name,
5376 TargetInfo::ConstraintInfo &info) const override {
Anton Korobeynikov051913b2009-10-15 23:17:13 +00005377 // No target constraints for now.
5378 return false;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005379 }
Craig Topper3164f332014-03-11 03:39:26 +00005380 const char *getClobbers() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005381 // FIXME: Is this really right?
5382 return "";
5383 }
Craig Topper3164f332014-03-11 03:39:26 +00005384 BuiltinVaListKind getBuiltinVaListKind() const override {
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005385 // FIXME: implement
Meador Inge5d3fb222012-06-16 03:34:49 +00005386 return TargetInfo::CharPtrBuiltinVaList;
Anton Korobeynikova0f54372009-05-03 13:43:08 +00005387 }
5388 };
5389
5390 const char * const MSP430TargetInfo::GCCRegNames[] = {
5391 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5392 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5393 };
5394
5395 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5396 unsigned &NumNames) const {
5397 Names = GCCRegNames;
5398 NumNames = llvm::array_lengthof(GCCRegNames);
5399 }
5400}
5401
Jakob Stoklund Olesen0de52f92009-08-17 20:08:44 +00005402namespace {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005403
Mike Stump11289f42009-09-09 15:08:12 +00005404 // LLVM and Clang cannot be used directly to output native binaries for
5405 // target, but is used to compile C code to llvm bitcode with correct
Eli Friedmana9c3d712009-08-19 20:47:07 +00005406 // type and alignment information.
Mike Stump11289f42009-09-09 15:08:12 +00005407 //
5408 // TCE uses the llvm bitcode as input and uses it for generating customized
5409 // target processor and program binary. TCE co-design environment is
Eli Friedmana9c3d712009-08-19 20:47:07 +00005410 // publicly available in http://tce.cs.tut.fi
5411
Eli Friedman1f191002011-10-07 19:51:42 +00005412 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5413 3, // opencl_global
5414 4, // opencl_local
Peter Collingbournef44bdf92012-05-20 21:08:35 +00005415 5, // opencl_constant
5416 0, // cuda_device
5417 0, // cuda_constant
5418 0 // cuda_shared
Eli Friedman1f191002011-10-07 19:51:42 +00005419 };
5420
Eli Friedmana9c3d712009-08-19 20:47:07 +00005421 class TCETargetInfo : public TargetInfo{
5422 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005423 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedmana9c3d712009-08-19 20:47:07 +00005424 TLSSupported = false;
5425 IntWidth = 32;
5426 LongWidth = LongLongWidth = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005427 PointerWidth = 32;
5428 IntAlign = 32;
5429 LongAlign = LongLongAlign = 32;
5430 PointerAlign = 32;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005431 SuitableAlign = 32;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005432 SizeType = UnsignedInt;
5433 IntMaxType = SignedLong;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005434 IntPtrType = SignedInt;
5435 PtrDiffType = SignedInt;
5436 FloatWidth = 32;
5437 FloatAlign = 32;
5438 DoubleWidth = 32;
5439 DoubleAlign = 32;
5440 LongDoubleWidth = 32;
5441 LongDoubleAlign = 32;
5442 FloatFormat = &llvm::APFloat::IEEEsingle;
5443 DoubleFormat = &llvm::APFloat::IEEEsingle;
5444 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Rafael Espindola29db13a2014-01-03 18:13:17 +00005445 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5446 "-f64:32-v64:32-v128:32-a:0:32-n32";
Eli Friedman1f191002011-10-07 19:51:42 +00005447 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00005448 UseAddrSpaceMapMangling = true;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005449 }
5450
Craig Topper3164f332014-03-11 03:39:26 +00005451 void getTargetDefines(const LangOptions &Opts,
5452 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005453 DefineStd(Builder, "tce", Opts);
5454 Builder.defineMacro("__TCE__");
5455 Builder.defineMacro("__TCE_V1__");
Eli Friedmana9c3d712009-08-19 20:47:07 +00005456 }
Craig Topper3164f332014-03-11 03:39:26 +00005457 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005458 return Feature == "tce";
5459 }
Craig Topper3164f332014-03-11 03:39:26 +00005460
5461 void getTargetBuiltins(const Builtin::Info *&Records,
5462 unsigned &NumRecords) const override {}
5463 const char *getClobbers() const override {
Daniel Dunbar576d90d2009-08-24 09:54:37 +00005464 return "";
5465 }
Craig Topper3164f332014-03-11 03:39:26 +00005466 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005467 return TargetInfo::VoidPtrBuiltinVaList;
Eli Friedmana9c3d712009-08-19 20:47:07 +00005468 }
Craig Topper3164f332014-03-11 03:39:26 +00005469 void getGCCRegNames(const char * const *&Names,
5470 unsigned &NumNames) const override {}
5471 bool validateAsmConstraint(const char *&Name,
5472 TargetInfo::ConstraintInfo &info) const override{
Eli Friedmana9c3d712009-08-19 20:47:07 +00005473 return true;
5474 }
Craig Topper3164f332014-03-11 03:39:26 +00005475 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5476 unsigned &NumAliases) const override {}
Eli Friedmana9c3d712009-08-19 20:47:07 +00005477 };
5478}
5479
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005480namespace {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005481class MipsTargetInfoBase : public TargetInfo {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005482 virtual void setDescriptionString() = 0;
5483
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005484 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005485 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005486 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00005487 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005488 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00005489 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005490 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00005491 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005492 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005493 enum DspRevEnum {
5494 NoDSP, DSP1, DSP2
5495 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00005496 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005497
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005498protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00005499 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005500 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005501
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005502public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005503 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5504 const std::string &CPUStr)
5505 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005506 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005507 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005508
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005509 bool isNaN2008Default() const {
5510 return CPU == "mips32r6" || CPU == "mips64r6";
5511 }
5512
5513 bool isFP64Default() const {
5514 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5515 }
5516
Alp Toker4925ba72014-06-07 23:30:42 +00005517 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00005518 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005519 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5520 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00005521 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005522 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00005523 .Case("mips1", IsMips32)
5524 .Case("mips2", IsMips32)
5525 .Case("mips3", true)
5526 .Case("mips4", true)
5527 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005528 .Case("mips32", IsMips32)
5529 .Case("mips32r2", IsMips32)
5530 .Case("mips32r6", IsMips32)
5531 .Case("mips64", true)
5532 .Case("mips64r2", true)
5533 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005534 .Case("octeon", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00005535 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00005536 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005537 const std::string& getCPU() const { return CPU; }
Craig Topper3164f332014-03-11 03:39:26 +00005538 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Daniel Sanders5a1449d2014-02-20 14:58:19 +00005539 // The backend enables certain ABI's by default according to the
5540 // architecture.
5541 // Disable both possible defaults so that we don't end up with multiple
5542 // ABI's selected and trigger an assertion.
5543 Features["o32"] = false;
5544 Features["n64"] = false;
5545
Eric Christopher0b26a612010-03-02 02:41:08 +00005546 Features[ABI] = true;
Simon Atanasyan4e16a422014-07-04 12:37:04 +00005547 if (CPU == "octeon")
5548 Features["mips64r2"] = Features["cnmips"] = true;
5549 else
5550 Features[CPU] = true;
Eric Christopher0b26a612010-03-02 02:41:08 +00005551 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005552
Craig Topper3164f332014-03-11 03:39:26 +00005553 void getTargetDefines(const LangOptions &Opts,
5554 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005555 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00005556 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005557 if (Opts.GNUMode)
5558 Builder.defineMacro("mips");
5559
Simon Atanasyan683535b2012-08-29 19:14:58 +00005560 Builder.defineMacro("__REGISTER_PREFIX__", "");
5561
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005562 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005563 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005564 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005565 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005566 case SoftFloat:
5567 Builder.defineMacro("__mips_soft_float", Twine(1));
5568 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00005569 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00005570
Simon Atanasyan16071912013-04-14 14:07:30 +00005571 if (IsSingleFloat)
5572 Builder.defineMacro("__mips_single_float", Twine(1));
5573
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005574 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5575 Builder.defineMacro("_MIPS_FPSET",
5576 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5577
Simon Atanasyan72244b62012-07-05 16:06:06 +00005578 if (IsMips16)
5579 Builder.defineMacro("__mips16", Twine(1));
5580
Simon Atanasyan60777612013-04-14 14:07:51 +00005581 if (IsMicromips)
5582 Builder.defineMacro("__mips_micromips", Twine(1));
5583
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005584 if (IsNan2008)
5585 Builder.defineMacro("__mips_nan2008", Twine(1));
5586
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005587 switch (DspRev) {
5588 default:
5589 break;
5590 case DSP1:
5591 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5592 Builder.defineMacro("__mips_dsp", Twine(1));
5593 break;
5594 case DSP2:
5595 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5596 Builder.defineMacro("__mips_dspr2", Twine(1));
5597 Builder.defineMacro("__mips_dsp", Twine(1));
5598 break;
5599 }
5600
Jack Carter44ff1e52013-08-12 17:20:29 +00005601 if (HasMSA)
5602 Builder.defineMacro("__mips_msa", Twine(1));
5603
Simon Atanasyan26f19672012-04-05 19:28:31 +00005604 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5605 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5606 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00005607
5608 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5609 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005610 }
5611
Craig Topper3164f332014-03-11 03:39:26 +00005612 void getTargetBuiltins(const Builtin::Info *&Records,
5613 unsigned &NumRecords) const override {
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005614 Records = BuiltinInfo;
5615 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005616 }
Craig Topper3164f332014-03-11 03:39:26 +00005617 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00005618 return llvm::StringSwitch<bool>(Feature)
5619 .Case("mips", true)
5620 .Case("fp64", HasFP64)
5621 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005622 }
Craig Topper3164f332014-03-11 03:39:26 +00005623 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005624 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005625 }
Craig Topper3164f332014-03-11 03:39:26 +00005626 void getGCCRegNames(const char * const *&Names,
5627 unsigned &NumNames) const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00005628 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00005629 // CPU register names
5630 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005631 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5632 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5633 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005634 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5635 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005636 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5637 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5638 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5639 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00005640 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005641 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00005642 "$fcc5","$fcc6","$fcc7",
5643 // MSA register names
5644 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5645 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5646 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5647 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5648 // MSA control register names
5649 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5650 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005651 };
5652 Names = GCCRegNames;
5653 NumNames = llvm::array_lengthof(GCCRegNames);
5654 }
Craig Topper3164f332014-03-11 03:39:26 +00005655 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5656 unsigned &NumAliases) const override = 0;
5657 bool validateAsmConstraint(const char *&Name,
5658 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005659 switch (*Name) {
5660 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00005661 return false;
5662
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005663 case 'r': // CPU registers.
5664 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00005665 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005666 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00005667 case 'c': // $25 for indirect jumps
5668 case 'l': // lo register
5669 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005670 Info.setAllowsRegister();
5671 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00005672 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00005673 Info.setAllowsMemory();
5674 return true;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005675 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005676 }
5677
Craig Topper3164f332014-03-11 03:39:26 +00005678 const char *getClobbers() const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005679 // FIXME: Implement!
5680 return "";
5681 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005682
Craig Topper3164f332014-03-11 03:39:26 +00005683 bool handleTargetFeatures(std::vector<std::string> &Features,
5684 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00005685 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00005686 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005687 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00005688 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005689 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005690 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005691 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005692
5693 for (std::vector<std::string>::iterator it = Features.begin(),
5694 ie = Features.end(); it != ie; ++it) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005695 if (*it == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00005696 IsSingleFloat = true;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005697 else if (*it == "+soft-float")
5698 FloatABI = SoftFloat;
Simon Atanasyan72244b62012-07-05 16:06:06 +00005699 else if (*it == "+mips16")
5700 IsMips16 = true;
Simon Atanasyan60777612013-04-14 14:07:51 +00005701 else if (*it == "+micromips")
5702 IsMicromips = true;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00005703 else if (*it == "+dsp")
5704 DspRev = std::max(DspRev, DSP1);
5705 else if (*it == "+dspr2")
5706 DspRev = std::max(DspRev, DSP2);
Jack Carter44ff1e52013-08-12 17:20:29 +00005707 else if (*it == "+msa")
5708 HasMSA = true;
Simon Atanasyan2c97a812013-10-18 13:13:53 +00005709 else if (*it == "+fp64")
5710 HasFP64 = true;
5711 else if (*it == "-fp64")
5712 HasFP64 = false;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005713 else if (*it == "+nan2008")
5714 IsNan2008 = true;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00005715 else if (*it == "-nan2008")
5716 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005717 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005718
Simon Atanasyan22127ce2013-09-24 09:09:16 +00005719 // Remove front-end specific options.
Simon Atanasyan9f444d52012-07-05 15:32:46 +00005720 std::vector<std::string>::iterator it =
5721 std::find(Features.begin(), Features.end(), "+soft-float");
5722 if (it != Features.end())
5723 Features.erase(it);
Rafael Espindolaeb265472013-08-21 21:59:03 +00005724
Akira Hatanaka9064e362013-10-29 18:30:33 +00005725 setDescriptionString();
5726
Rafael Espindolaeb265472013-08-21 21:59:03 +00005727 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005728 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005729
Craig Topper3164f332014-03-11 03:39:26 +00005730 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005731 if (RegNo == 0) return 4;
5732 if (RegNo == 1) return 5;
5733 return -1;
5734 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00005735
5736 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005737};
5738
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00005739const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5740#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5741#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5742 ALL_LANGUAGES },
5743#include "clang/Basic/BuiltinsMips.def"
5744};
5745
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005746class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005747public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005748 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005749 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005750 SizeType = UnsignedInt;
5751 PtrDiffType = SignedInt;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005752 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00005753 }
Craig Topper3164f332014-03-11 03:39:26 +00005754 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00005755 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005756 ABI = Name;
5757 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005758 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005759 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005760 }
Craig Topper3164f332014-03-11 03:39:26 +00005761 void getTargetDefines(const LangOptions &Opts,
5762 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005763 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005764
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005765 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005766 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5767
5768 const std::string& CPUStr = getCPU();
5769 if (CPUStr == "mips32")
5770 Builder.defineMacro("__mips_isa_rev", "1");
5771 else if (CPUStr == "mips32r2")
5772 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005773
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005774 if (ABI == "o32") {
5775 Builder.defineMacro("__mips_o32");
5776 Builder.defineMacro("_ABIO32", "1");
5777 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5778 }
5779 else if (ABI == "eabi")
5780 Builder.defineMacro("__mips_eabi");
5781 else
David Blaikie83d382b2011-09-23 05:06:16 +00005782 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005783 }
Craig Topper3164f332014-03-11 03:39:26 +00005784 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5785 unsigned &NumAliases) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005786 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5787 { { "at" }, "$1" },
5788 { { "v0" }, "$2" },
5789 { { "v1" }, "$3" },
5790 { { "a0" }, "$4" },
5791 { { "a1" }, "$5" },
5792 { { "a2" }, "$6" },
5793 { { "a3" }, "$7" },
5794 { { "t0" }, "$8" },
5795 { { "t1" }, "$9" },
5796 { { "t2" }, "$10" },
5797 { { "t3" }, "$11" },
5798 { { "t4" }, "$12" },
5799 { { "t5" }, "$13" },
5800 { { "t6" }, "$14" },
5801 { { "t7" }, "$15" },
5802 { { "s0" }, "$16" },
5803 { { "s1" }, "$17" },
5804 { { "s2" }, "$18" },
5805 { { "s3" }, "$19" },
5806 { { "s4" }, "$20" },
5807 { { "s5" }, "$21" },
5808 { { "s6" }, "$22" },
5809 { { "s7" }, "$23" },
5810 { { "t8" }, "$24" },
5811 { { "t9" }, "$25" },
5812 { { "k0" }, "$26" },
5813 { { "k1" }, "$27" },
5814 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005815 { { "sp","$sp" }, "$29" },
5816 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005817 { { "ra" }, "$31" }
5818 };
5819 Aliases = GCCRegAliases;
5820 NumAliases = llvm::array_lengthof(GCCRegAliases);
5821 }
5822};
5823
5824class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005825 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005826 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005827 }
5828
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005829public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005830 Mips32EBTargetInfo(const llvm::Triple &Triple)
5831 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005832 }
Craig Topper3164f332014-03-11 03:39:26 +00005833 void getTargetDefines(const LangOptions &Opts,
5834 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005835 DefineStd(Builder, "MIPSEB", Opts);
5836 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005837 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005838 }
5839};
5840
5841class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005842 void setDescriptionString() override {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005843 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005844 }
5845
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005846public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005847 Mips32ELTargetInfo(const llvm::Triple &Triple)
5848 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005849 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005850 }
Craig Topper3164f332014-03-11 03:39:26 +00005851 void getTargetDefines(const LangOptions &Opts,
5852 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005853 DefineStd(Builder, "MIPSEL", Opts);
5854 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005855 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00005856 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00005857};
Akira Hatanakabef17452011-09-20 19:21:49 +00005858
5859class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00005860public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005861 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00005862 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005863 LongDoubleWidth = LongDoubleAlign = 128;
5864 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00005865 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
5866 LongDoubleWidth = LongDoubleAlign = 64;
5867 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5868 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005869 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00005870 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00005871 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00005872 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005873
5874 void setN64ABITypes() {
5875 LongWidth = LongAlign = 64;
5876 PointerWidth = PointerAlign = 64;
5877 SizeType = UnsignedLong;
5878 PtrDiffType = SignedLong;
5879 }
5880
5881 void setN32ABITypes() {
5882 LongWidth = LongAlign = 32;
5883 PointerWidth = PointerAlign = 32;
5884 SizeType = UnsignedInt;
5885 PtrDiffType = SignedInt;
5886 }
5887
Craig Topper3164f332014-03-11 03:39:26 +00005888 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00005889 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005890 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005891 ABI = Name;
5892 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00005893 }
Simon Atanasyanad805952014-07-01 10:59:09 +00005894 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00005895 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00005896 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00005897 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00005898 }
5899 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00005900 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00005901
Craig Topper3164f332014-03-11 03:39:26 +00005902 void getTargetDefines(const LangOptions &Opts,
5903 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005904 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00005905
Simon Atanasyan26292cc2014-01-27 13:59:11 +00005906 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005907 Builder.defineMacro("__mips64");
5908 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00005909 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
5910
5911 const std::string& CPUStr = getCPU();
5912 if (CPUStr == "mips64")
5913 Builder.defineMacro("__mips_isa_rev", "1");
5914 else if (CPUStr == "mips64r2")
5915 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00005916
Akira Hatanakabef17452011-09-20 19:21:49 +00005917 if (ABI == "n32") {
5918 Builder.defineMacro("__mips_n32");
5919 Builder.defineMacro("_ABIN32", "2");
5920 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
5921 }
5922 else if (ABI == "n64") {
5923 Builder.defineMacro("__mips_n64");
5924 Builder.defineMacro("_ABI64", "3");
5925 Builder.defineMacro("_MIPS_SIM", "_ABI64");
5926 }
5927 else
David Blaikie83d382b2011-09-23 05:06:16 +00005928 llvm_unreachable("Invalid ABI for Mips64.");
Akira Hatanakabef17452011-09-20 19:21:49 +00005929 }
Craig Topper3164f332014-03-11 03:39:26 +00005930 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5931 unsigned &NumAliases) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005932 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5933 { { "at" }, "$1" },
5934 { { "v0" }, "$2" },
5935 { { "v1" }, "$3" },
5936 { { "a0" }, "$4" },
5937 { { "a1" }, "$5" },
5938 { { "a2" }, "$6" },
5939 { { "a3" }, "$7" },
5940 { { "a4" }, "$8" },
5941 { { "a5" }, "$9" },
5942 { { "a6" }, "$10" },
5943 { { "a7" }, "$11" },
5944 { { "t0" }, "$12" },
5945 { { "t1" }, "$13" },
5946 { { "t2" }, "$14" },
5947 { { "t3" }, "$15" },
5948 { { "s0" }, "$16" },
5949 { { "s1" }, "$17" },
5950 { { "s2" }, "$18" },
5951 { { "s3" }, "$19" },
5952 { { "s4" }, "$20" },
5953 { { "s5" }, "$21" },
5954 { { "s6" }, "$22" },
5955 { { "s7" }, "$23" },
5956 { { "t8" }, "$24" },
5957 { { "t9" }, "$25" },
5958 { { "k0" }, "$26" },
5959 { { "k1" }, "$27" },
5960 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00005961 { { "sp","$sp" }, "$29" },
5962 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00005963 { { "ra" }, "$31" }
5964 };
5965 Aliases = GCCRegAliases;
5966 NumAliases = llvm::array_lengthof(GCCRegAliases);
5967 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00005968
5969 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00005970};
5971
5972class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005973 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005974 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005975 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 +00005976 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005977 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00005978
Akira Hatanakabef17452011-09-20 19:21:49 +00005979 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00005980
Akira Hatanakabef17452011-09-20 19:21:49 +00005981public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005982 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00005983 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00005984 void getTargetDefines(const LangOptions &Opts,
5985 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00005986 DefineStd(Builder, "MIPSEB", Opts);
5987 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00005988 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00005989 }
5990};
5991
5992class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Craig Topper3164f332014-03-11 03:39:26 +00005993 void setDescriptionString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00005994 if (ABI == "n32")
Rafael Espindolac418ae92014-01-03 19:22:05 +00005995 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 +00005996 else
Rafael Espindolac418ae92014-01-03 19:22:05 +00005997 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00005998 }
5999public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006000 Mips64ELTargetInfo(const llvm::Triple &Triple)
6001 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006002 // Default ABI is n64.
6003 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006004 }
Craig Topper3164f332014-03-11 03:39:26 +00006005 void getTargetDefines(const LangOptions &Opts,
6006 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006007 DefineStd(Builder, "MIPSEL", Opts);
6008 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006009 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00006010 }
6011};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006012} // end anonymous namespace.
6013
Ivan Krasindd7403e2011-08-24 20:22:22 +00006014namespace {
6015class PNaClTargetInfo : public TargetInfo {
6016public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006017 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006018 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006019 this->UserLabelPrefix = "";
6020 this->LongAlign = 32;
6021 this->LongWidth = 32;
6022 this->PointerAlign = 32;
6023 this->PointerWidth = 32;
6024 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006025 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006026 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006027 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00006028 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00006029 this->SizeType = TargetInfo::UnsignedInt;
6030 this->PtrDiffType = TargetInfo::SignedInt;
6031 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00006032 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00006033 }
6034
Craig Topper3164f332014-03-11 03:39:26 +00006035 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006036 }
Craig Toppere6f17d02014-03-11 04:07:52 +00006037 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006038 Builder.defineMacro("__le32__");
6039 Builder.defineMacro("__pnacl__");
6040 }
Craig Topper3164f332014-03-11 03:39:26 +00006041 void getTargetDefines(const LangOptions &Opts,
6042 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006043 getArchDefines(Opts, Builder);
6044 }
Craig Topper3164f332014-03-11 03:39:26 +00006045 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006046 return Feature == "pnacl";
6047 }
Craig Topper3164f332014-03-11 03:39:26 +00006048 void getTargetBuiltins(const Builtin::Info *&Records,
6049 unsigned &NumRecords) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006050 }
Craig Topper3164f332014-03-11 03:39:26 +00006051 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006052 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006053 }
Craig Topper3164f332014-03-11 03:39:26 +00006054 void getGCCRegNames(const char * const *&Names,
6055 unsigned &NumNames) const override;
6056 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6057 unsigned &NumAliases) const override;
6058 bool validateAsmConstraint(const char *&Name,
6059 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006060 return false;
6061 }
6062
Craig Topper3164f332014-03-11 03:39:26 +00006063 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00006064 return "";
6065 }
6066};
6067
6068void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6069 unsigned &NumNames) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006070 Names = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006071 NumNames = 0;
6072}
6073
6074void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6075 unsigned &NumAliases) const {
Craig Topperf1186c52014-05-08 06:41:40 +00006076 Aliases = nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006077 NumAliases = 0;
6078}
6079} // end anonymous namespace.
6080
Guy Benyeib798fc92012-12-11 21:38:14 +00006081namespace {
JF Bastien643817d2014-09-12 17:52:47 +00006082class Le64TargetInfo : public TargetInfo {
6083 static const Builtin::Info BuiltinInfo[];
6084
6085public:
6086 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6087 BigEndian = false;
6088 NoAsmVariants = true;
6089 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6090 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6091 DescriptionString =
6092 "e-S128-p:64:64-v16:16-v32:32-v64:64-v96:32-v128:32-m:e-n8:16:32:64";
6093 }
6094
6095 void getTargetDefines(const LangOptions &Opts,
6096 MacroBuilder &Builder) const override {
6097 DefineStd(Builder, "unix", Opts);
6098 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6099 Builder.defineMacro("__ELF__");
6100 }
6101 void getTargetBuiltins(const Builtin::Info *&Records,
6102 unsigned &NumRecords) const override {
6103 Records = BuiltinInfo;
6104 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6105 }
6106 BuiltinVaListKind getBuiltinVaListKind() const override {
6107 return TargetInfo::PNaClABIBuiltinVaList;
6108 }
6109 const char *getClobbers() const override { return ""; }
6110 void getGCCRegNames(const char *const *&Names,
6111 unsigned &NumNames) const override {
6112 Names = nullptr;
6113 NumNames = 0;
6114 }
6115 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6116 unsigned &NumAliases) const override {
6117 Aliases = nullptr;
6118 NumAliases = 0;
6119 }
6120 bool validateAsmConstraint(const char *&Name,
6121 TargetInfo::ConstraintInfo &Info) const override {
6122 return false;
6123 }
6124
6125 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00006126};
6127} // end anonymous namespace.
6128
6129const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6130#define BUILTIN(ID, TYPE, ATTRS) \
6131 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6132#include "clang/Basic/BuiltinsLe64.def"
6133};
6134
6135namespace {
Guy Benyeib798fc92012-12-11 21:38:14 +00006136 static const unsigned SPIRAddrSpaceMap[] = {
6137 1, // opencl_global
6138 3, // opencl_local
6139 2, // opencl_constant
6140 0, // cuda_device
6141 0, // cuda_constant
6142 0 // cuda_shared
6143 };
6144 class SPIRTargetInfo : public TargetInfo {
Guy Benyeib798fc92012-12-11 21:38:14 +00006145 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006146 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006147 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6148 "SPIR target must use unknown OS");
6149 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6150 "SPIR target must use unknown environment type");
6151 BigEndian = false;
6152 TLSSupported = false;
6153 LongWidth = LongAlign = 64;
6154 AddrSpaceMap = &SPIRAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00006155 UseAddrSpaceMapMangling = true;
Guy Benyeib798fc92012-12-11 21:38:14 +00006156 // Define available target features
6157 // These must be defined in sorted order!
6158 NoAsmVariants = true;
6159 }
Craig Topper3164f332014-03-11 03:39:26 +00006160 void getTargetDefines(const LangOptions &Opts,
6161 MacroBuilder &Builder) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006162 DefineStd(Builder, "SPIR", Opts);
6163 }
Craig Topper3164f332014-03-11 03:39:26 +00006164 bool hasFeature(StringRef Feature) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006165 return Feature == "spir";
6166 }
Craig Topper3164f332014-03-11 03:39:26 +00006167
6168 void getTargetBuiltins(const Builtin::Info *&Records,
6169 unsigned &NumRecords) const override {}
6170 const char *getClobbers() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006171 return "";
6172 }
Craig Topper3164f332014-03-11 03:39:26 +00006173 void getGCCRegNames(const char * const *&Names,
6174 unsigned &NumNames) const override {}
6175 bool validateAsmConstraint(const char *&Name,
6176 TargetInfo::ConstraintInfo &info) const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006177 return true;
6178 }
Craig Topper3164f332014-03-11 03:39:26 +00006179 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6180 unsigned &NumAliases) const override {}
6181 BuiltinVaListKind getBuiltinVaListKind() const override {
Guy Benyeib798fc92012-12-11 21:38:14 +00006182 return TargetInfo::VoidPtrBuiltinVaList;
6183 }
6184 };
6185
6186
6187 class SPIR32TargetInfo : public SPIRTargetInfo {
6188 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006189 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006190 PointerWidth = PointerAlign = 32;
6191 SizeType = TargetInfo::UnsignedInt;
6192 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6193 DescriptionString
Rafael Espindola29db13a2014-01-03 18:13:17 +00006194 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6195 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006196 }
Craig Topper3164f332014-03-11 03:39:26 +00006197 void getTargetDefines(const LangOptions &Opts,
6198 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006199 DefineStd(Builder, "SPIR32", Opts);
6200 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006201 };
6202
6203 class SPIR64TargetInfo : public SPIRTargetInfo {
6204 public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006205 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
Guy Benyeib798fc92012-12-11 21:38:14 +00006206 PointerWidth = PointerAlign = 64;
6207 SizeType = TargetInfo::UnsignedLong;
6208 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
Rafael Espindola29db13a2014-01-03 18:13:17 +00006209 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6210 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
Guy Benyei5ea30272013-03-07 13:06:10 +00006211 }
Craig Topper3164f332014-03-11 03:39:26 +00006212 void getTargetDefines(const LangOptions &Opts,
6213 MacroBuilder &Builder) const override {
Guy Benyei5ea30272013-03-07 13:06:10 +00006214 DefineStd(Builder, "SPIR64", Opts);
6215 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006216 };
6217}
6218
Robert Lytton0e076492013-08-13 09:43:10 +00006219namespace {
6220class XCoreTargetInfo : public TargetInfo {
6221 static const Builtin::Info BuiltinInfo[];
6222public:
6223 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6224 BigEndian = false;
6225 NoAsmVariants = true;
6226 LongLongAlign = 32;
6227 SuitableAlign = 32;
6228 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00006229 SizeType = UnsignedInt;
6230 PtrDiffType = SignedInt;
6231 IntPtrType = SignedInt;
6232 WCharType = UnsignedChar;
6233 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00006234 UseZeroLengthBitfieldAlignment = true;
Rafael Espindolac418ae92014-01-03 19:22:05 +00006235 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 +00006236 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00006237 }
Craig Topper3164f332014-03-11 03:39:26 +00006238 void getTargetDefines(const LangOptions &Opts,
6239 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006240 Builder.defineMacro("__XS1B__");
6241 }
Craig Topper3164f332014-03-11 03:39:26 +00006242 void getTargetBuiltins(const Builtin::Info *&Records,
6243 unsigned &NumRecords) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006244 Records = BuiltinInfo;
6245 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6246 }
Craig Topper3164f332014-03-11 03:39:26 +00006247 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006248 return TargetInfo::VoidPtrBuiltinVaList;
6249 }
Craig Topper3164f332014-03-11 03:39:26 +00006250 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006251 return "";
6252 }
Craig Topper3164f332014-03-11 03:39:26 +00006253 void getGCCRegNames(const char * const *&Names,
6254 unsigned &NumNames) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006255 static const char * const GCCRegNames[] = {
6256 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6257 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6258 };
6259 Names = GCCRegNames;
6260 NumNames = llvm::array_lengthof(GCCRegNames);
6261 }
Craig Topper3164f332014-03-11 03:39:26 +00006262 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6263 unsigned &NumAliases) const override {
Craig Topperf1186c52014-05-08 06:41:40 +00006264 Aliases = nullptr;
Robert Lytton0e076492013-08-13 09:43:10 +00006265 NumAliases = 0;
6266 }
Craig Topper3164f332014-03-11 03:39:26 +00006267 bool validateAsmConstraint(const char *&Name,
6268 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00006269 return false;
6270 }
Craig Topper3164f332014-03-11 03:39:26 +00006271 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00006272 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6273 return (RegNo < 2)? RegNo : -1;
6274 }
Robert Lytton0e076492013-08-13 09:43:10 +00006275};
6276
6277const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6278#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6279#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6280 ALL_LANGUAGES },
6281#include "clang/Basic/BuiltinsXCore.def"
6282};
6283} // end anonymous namespace.
6284
Ivan Krasindd7403e2011-08-24 20:22:22 +00006285
Chris Lattner5ba61f02006-10-14 07:39:34 +00006286//===----------------------------------------------------------------------===//
6287// Driver code
6288//===----------------------------------------------------------------------===//
6289
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006290static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006291 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00006292
Daniel Dunbar52322032009-08-18 05:47:58 +00006293 switch (Triple.getArch()) {
6294 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006295 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00006296
Tim Northover2a0783d2014-05-30 14:14:07 +00006297 case llvm::Triple::xcore:
6298 return new XCoreTargetInfo(Triple);
6299
6300 case llvm::Triple::hexagon:
6301 return new HexagonTargetInfo(Triple);
6302
6303 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00006304 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00006305 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006306
6307 switch (os) {
6308 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006309 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006310 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006311 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00006312 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006313 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00006314 }
6315
Christian Pirker9b019ae2014-02-25 13:51:00 +00006316 case llvm::Triple::aarch64_be:
6317 switch (os) {
6318 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00006319 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006320 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00006321 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00006322 default:
Tim Northover573cbee2014-05-24 12:52:07 +00006323 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00006324 }
6325
Daniel Dunbar52322032009-08-18 05:47:58 +00006326 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00006327 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00006328 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006329 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006330
Daniel Dunbar52322032009-08-18 05:47:58 +00006331 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00006332 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006333 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006334 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006335 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006336 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006337 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006338 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006339 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006340 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006341 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006342 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006343 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006344 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006345 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00006346 case llvm::Triple::Win32:
6347 switch (Triple.getEnvironment()) {
6348 default:
6349 return new ARMleTargetInfo(Triple);
6350 case llvm::Triple::Itanium:
6351 return new ItaniumWindowsARMleTargetInfo(Triple);
6352 case llvm::Triple::MSVC:
6353 return new MicrosoftARMleTargetInfo(Triple);
6354 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006355 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006356 return new ARMleTargetInfo(Triple);
6357 }
6358
6359 case llvm::Triple::armeb:
6360 case llvm::Triple::thumbeb:
6361 if (Triple.isOSDarwin())
6362 return new DarwinARMTargetInfo(Triple);
6363
6364 switch (os) {
6365 case llvm::Triple::Linux:
6366 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6367 case llvm::Triple::FreeBSD:
6368 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6369 case llvm::Triple::NetBSD:
6370 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6371 case llvm::Triple::OpenBSD:
6372 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6373 case llvm::Triple::Bitrig:
6374 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6375 case llvm::Triple::RTEMS:
6376 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6377 case llvm::Triple::NaCl:
6378 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6379 default:
6380 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006381 }
Eli Friedmanb5366062008-05-20 14:21:01 +00006382
Daniel Dunbar52322032009-08-18 05:47:58 +00006383 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006384 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00006385
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006386 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006387 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006388 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006389 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006390 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006391 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006392 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006393 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006394 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006395 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006396 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006397 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00006398 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006399
6400 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006401 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006402 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006403 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006404 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006405 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006406 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006407 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006408 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006409 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00006410 case llvm::Triple::NaCl:
6411 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006412 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006413 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00006414 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006415
Akira Hatanakabef17452011-09-20 19:21:49 +00006416 case llvm::Triple::mips64:
6417 switch (os) {
6418 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006419 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006420 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006421 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006422 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006423 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006424 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006425 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006426 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006427 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006428 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006429 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006430 }
6431
6432 case llvm::Triple::mips64el:
6433 switch (os) {
6434 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006435 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006436 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006437 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006438 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006439 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006440 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006441 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006442 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006443 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006444 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006445 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00006446 }
6447
Ivan Krasindd7403e2011-08-24 20:22:22 +00006448 case llvm::Triple::le32:
6449 switch (os) {
Eli Benderskyd7c92032012-12-04 18:38:10 +00006450 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006451 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
Ivan Krasindd7403e2011-08-24 20:22:22 +00006452 default:
Craig Topperf1186c52014-05-08 06:41:40 +00006453 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00006454 }
6455
JF Bastien643817d2014-09-12 17:52:47 +00006456 case llvm::Triple::le64:
6457 return new Le64TargetInfo(Triple);
6458
Daniel Dunbar52322032009-08-18 05:47:58 +00006459 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006460 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006461 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006462 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006463 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006464 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006465 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006466 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006467 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006468 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006469 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006470 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006471 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006472 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006473 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006474 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006475 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006476
6477 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006478 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006479 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006480 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006481 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006482 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006483 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006484 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006485 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006486 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006487 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006488 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006489 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006490 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006491 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006492
Bill Schmidt778d3872013-07-26 01:36:11 +00006493 case llvm::Triple::ppc64le:
6494 switch (os) {
6495 case llvm::Triple::Linux:
6496 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6497 default:
6498 return new PPC64TargetInfo(Triple);
6499 }
6500
Peter Collingbournec947aae2012-05-20 23:28:41 +00006501 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006502 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006503 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006504 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00006505
Eli Friedmand13b41e2012-10-12 23:32:00 +00006506 case llvm::Triple::r600:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006507 return new R600TargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00006508
Daniel Dunbar52322032009-08-18 05:47:58 +00006509 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006510 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00006511 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006512 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006513 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006514 return new SolarisSparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006515 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006516 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00006517 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006518 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006519 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006520 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006521 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006522 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00006523 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006524
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006525 case llvm::Triple::sparcv9:
6526 switch (os) {
6527 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006528 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006529 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006530 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006531 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006532 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006533 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006534 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006535 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006536 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006537 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006538 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006539 }
6540
Ulrich Weigand47445072013-05-06 16:26:41 +00006541 case llvm::Triple::systemz:
6542 switch (os) {
6543 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006544 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006545 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006546 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00006547 }
6548
Eli Friedmana9c3d712009-08-19 20:47:07 +00006549 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006550 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00006551
Daniel Dunbar52322032009-08-18 05:47:58 +00006552 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006553 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006554 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006555
Daniel Dunbar52322032009-08-18 05:47:58 +00006556 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006557 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006558 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006559 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006560 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006561 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006562 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006563 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006564 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006565 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006566 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006567 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006568 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006569 case llvm::Triple::KFreeBSD:
6570 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00006571 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006572 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006573 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006574 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006575 case llvm::Triple::Win32: {
6576 switch (Triple.getEnvironment()) {
6577 default:
6578 return new X86_32TargetInfo(Triple);
6579 case llvm::Triple::Cygnus:
6580 return new CygwinX86_32TargetInfo(Triple);
6581 case llvm::Triple::GNU:
6582 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00006583 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006584 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006585 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006586 }
6587 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00006588 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006589 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00006590 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006591 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00006592 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006593 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006594 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006595 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006596 }
6597
6598 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006599 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006600 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00006601
Daniel Dunbar52322032009-08-18 05:47:58 +00006602 switch (os) {
Daniel Dunbar52322032009-08-18 05:47:58 +00006603 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006604 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
Chris Lattner002ba6b2010-01-09 05:41:14 +00006605 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006606 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006607 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006608 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006609 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006610 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00006611 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006612 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006613 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006614 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00006615 case llvm::Triple::KFreeBSD:
6616 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006617 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006618 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006619 case llvm::Triple::Win32: {
6620 switch (Triple.getEnvironment()) {
6621 default:
6622 return new X86_64TargetInfo(Triple);
6623 case llvm::Triple::GNU:
6624 return new MinGWX86_64TargetInfo(Triple);
6625 case llvm::Triple::MSVC:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00006626 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00006627 }
6628 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00006629 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006630 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006631 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006632 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00006633 }
Guy Benyeib798fc92012-12-11 21:38:14 +00006634
6635 case llvm::Triple::spir: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006636 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006637 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006638 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006639 return new SPIR32TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006640 }
6641 case llvm::Triple::spir64: {
Guy Benyeib798fc92012-12-11 21:38:14 +00006642 if (Triple.getOS() != llvm::Triple::UnknownOS ||
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006643 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
Craig Topperf1186c52014-05-08 06:41:40 +00006644 return nullptr;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006645 return new SPIR64TargetInfo(Triple);
Guy Benyeib798fc92012-12-11 21:38:14 +00006646 }
Daniel Dunbar52322032009-08-18 05:47:58 +00006647 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00006648}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006649
6650/// CreateTargetInfo - Return the target info object for the specified target
6651/// triple.
Alp Toker80758082014-07-06 05:26:44 +00006652TargetInfo *
6653TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6654 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00006655 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006656
6657 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00006658 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006659 if (!Target) {
6660 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00006661 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006662 }
Alp Toker80758082014-07-06 05:26:44 +00006663 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006664
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006665 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006666 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6667 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00006668 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00006669 }
6670
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006671 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006672 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6673 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00006674 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006675 }
6676
Rafael Espindolaeb265472013-08-21 21:59:03 +00006677 // Set the fp math unit.
6678 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6679 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00006680 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00006681 }
6682
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006683 // Compute the default target features, we need the target to handle this
6684 // because features may have dependencies on one another.
6685 llvm::StringMap<bool> Features;
Chandler Carruth8bdcf9e2011-09-28 05:56:05 +00006686 Target->getDefaultFeatures(Features);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006687
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006688 // Apply the user specified deltas.
6689 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6690 I < N; ++I) {
6691 const char *Name = Opts->FeaturesAsWritten[I].c_str();
Rafael Espindolaa6416a72011-11-27 20:00:43 +00006692 // Apply the feature via the target.
Rafael Espindoladb0fcfb2013-08-20 18:57:55 +00006693 bool Enabled = Name[0] == '+';
6694 Target->setFeatureEnabled(Features, Name + 1, Enabled);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006695 }
6696
6697 // Add the features to the compile options.
6698 //
6699 // FIXME: If we are completely confident that we have the right set, we only
6700 // need to pass the minuses.
Douglas Gregorf8715de2012-11-16 04:24:59 +00006701 Opts->Features.clear();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006702 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6703 ie = Features.end(); it != ie; ++it)
Douglas Gregorf8715de2012-11-16 04:24:59 +00006704 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
Eric Christopher3ff21b32013-10-16 21:26:26 +00006705 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00006706 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006707
Ahmed Charles9a16beb2014-03-07 19:33:25 +00006708 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00006709}