blob: db86b93f0882437b9fab0f1b7f543723e73735b8 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
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"
Tim Northover756447a2015-10-30 16:30:36 +000022#include "clang/Basic/Version.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000023#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000025#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000026#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000027#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000028#include "llvm/ADT/Triple.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"
Renato Golinf5c4dec2015-05-27 13:33:00 +000031#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000032#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000033#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000034
Chris Lattner5ba61f02006-10-14 07:39:34 +000035using namespace clang;
36
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000038// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
40
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041/// DefineStd - Define a macro name and standard variants. For example if
42/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
43/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 const LangOptions &Opts) {
46 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000047
Chris Lattner1e1c0b92009-03-20 16:06:38 +000048 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
49 // in the user's namespace.
50 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000055
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000057 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058}
59
Benjamin Kramere3b442d2012-01-10 11:50:09 +000060static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
61 bool Tuning = true) {
62 Builder.defineMacro("__" + CPUName);
63 Builder.defineMacro("__" + CPUName + "__");
64 if (Tuning)
65 Builder.defineMacro("__tune_" + CPUName + "__");
66}
67
Chris Lattner09d98f52008-10-05 21:50:58 +000068//===----------------------------------------------------------------------===//
69// Defines specific to certain operating systems.
70//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000071
Torok Edwinb2b37c62009-06-30 17:10:35 +000072namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000073template<typename TgtInfo>
74class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000075protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000076 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000077 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000078public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000079 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000080 void getTargetDefines(const LangOptions &Opts,
81 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 TgtInfo::getTargetDefines(Opts, Builder);
83 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000084 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000085
86};
Chris Lattner30ba6742009-08-10 19:03:04 +000087
Eric Christopher7d0c7252015-09-24 21:17:04 +000088// CloudABI Target
89template <typename Target>
90class CloudABITargetInfo : public OSTargetInfo<Target> {
91protected:
92 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
93 MacroBuilder &Builder) const override {
94 Builder.defineMacro("__CloudABI__");
95 Builder.defineMacro("__ELF__");
96
97 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
98 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
99 Builder.defineMacro("__STDC_UTF_16__");
100 Builder.defineMacro("__STDC_UTF_32__");
101 }
102
103public:
104 CloudABITargetInfo(const llvm::Triple &Triple)
James Y Knighta3518ad2016-01-27 01:04:51 +0000105 : OSTargetInfo<Target>(Triple) {
106 this->UserLabelPrefix = "";
107 }
Eric Christopher7d0c7252015-09-24 21:17:04 +0000108};
109
Daniel Dunbard86666f2010-01-26 01:44:04 +0000110static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000111 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000112 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000113 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000114 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000115 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000116 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000117 // AddressSanitizer doesn't play well with source fortification, which is on
118 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000119 if (Opts.Sanitize.has(SanitizerKind::Address))
120 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000121
John McCall460ce582015-10-22 18:38:17 +0000122 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
123 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000124 // __weak is always defined, for use in blocks and with objc pointers.
125 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000126 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000127 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000128 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000129
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000130 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000131 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000132 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000133 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000134
135 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000136 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000137
Daniel Dunbarecf13562011-04-19 21:40:34 +0000138 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000139 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000140 if (Triple.isMacOSX()) {
141 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000143 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 Triple.getOSVersion(Maj, Min, Rev);
145 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000146 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000147
Sebastian Pop422377c2012-01-20 22:01:23 +0000148 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000149 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000150 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
151 if (PlatformName == "win32") {
152 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
153 return;
154 }
155
Evan Cheng31dd9a62014-01-26 23:12:43 +0000156 // Set the appropriate OS version define.
157 if (Triple.isiOS()) {
158 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
159 char Str[6];
160 Str[0] = '0' + Maj;
161 Str[1] = '0' + (Min / 10);
162 Str[2] = '0' + (Min % 10);
163 Str[3] = '0' + (Rev / 10);
164 Str[4] = '0' + (Rev % 10);
165 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000166 if (Triple.isTvOS())
167 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
168 else
169 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
170 Str);
171
172 } else if (Triple.isWatchOS()) {
173 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
174 char Str[6];
175 Str[0] = '0' + Maj;
176 Str[1] = '0' + (Min / 10);
177 Str[2] = '0' + (Min % 10);
178 Str[3] = '0' + (Rev / 10);
179 Str[4] = '0' + (Rev % 10);
180 Str[5] = '\0';
181 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000182 } else if (Triple.isMacOSX()) {
183 // Note that the Driver allows versions which aren't representable in the
184 // define (because we only get a single digit for the minor and micro
185 // revision numbers). So, we limit them to the maximum representable
186 // version.
187 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000188 char Str[7];
189 if (Maj < 10 || (Maj == 10 && Min < 10)) {
190 Str[0] = '0' + (Maj / 10);
191 Str[1] = '0' + (Maj % 10);
192 Str[2] = '0' + std::min(Min, 9U);
193 Str[3] = '0' + std::min(Rev, 9U);
194 Str[4] = '\0';
195 } else {
196 // Handle versions > 10.9.
197 Str[0] = '0' + (Maj / 10);
198 Str[1] = '0' + (Maj % 10);
199 Str[2] = '0' + (Min / 10);
200 Str[3] = '0' + (Min % 10);
201 Str[4] = '0' + (Rev / 10);
202 Str[5] = '0' + (Rev % 10);
203 Str[6] = '\0';
204 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000205 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000206 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000207
Tim Northover157d9112014-01-16 08:48:16 +0000208 // Tell users about the kernel if there is one.
209 if (Triple.isOSDarwin())
210 Builder.defineMacro("__MACH__");
211
Daniel Dunbarecf13562011-04-19 21:40:34 +0000212 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000213}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000214
Torok Edwinb2b37c62009-06-30 17:10:35 +0000215template<typename Target>
216class DarwinTargetInfo : public OSTargetInfo<Target> {
217protected:
Craig Topper3164f332014-03-11 03:39:26 +0000218 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
219 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000220 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000221 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222 }
Mike Stump11289f42009-09-09 15:08:12 +0000223
Torok Edwinb2b37c62009-06-30 17:10:35 +0000224public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000225 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000226 // By default, no TLS, and we whitelist permitted architecture/OS
227 // combinations.
228 this->TLSSupported = false;
229
230 if (Triple.isMacOSX())
231 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
232 else if (Triple.isiOS()) {
233 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
234 if (Triple.getArch() == llvm::Triple::x86_64 ||
235 Triple.getArch() == llvm::Triple::aarch64)
236 this->TLSSupported = !Triple.isOSVersionLT(8);
237 else if (Triple.getArch() == llvm::Triple::x86 ||
238 Triple.getArch() == llvm::Triple::arm ||
239 Triple.getArch() == llvm::Triple::thumb)
240 this->TLSSupported = !Triple.isOSVersionLT(9);
241 } else if (Triple.isWatchOS())
242 this->TLSSupported = !Triple.isOSVersionLT(2);
243
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000244 this->MCountName = "\01mcount";
245 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000246
Craig Topper3164f332014-03-11 03:39:26 +0000247 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000248 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000249 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000250 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000251 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000252 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000253 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000254 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000255
Craig Topper3164f332014-03-11 03:39:26 +0000256 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000257 // FIXME: We should return 0 when building kexts.
258 return "__TEXT,__StaticInit,regular,pure_instructions";
259 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000260
John McCalleed64c72012-01-29 01:20:30 +0000261 /// Darwin does not support protected visibility. Darwin's "default"
262 /// is very similar to ELF's "protected"; Darwin requires a "weak"
263 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000264 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000265 return false;
266 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000267};
268
Chris Lattner30ba6742009-08-10 19:03:04 +0000269
Torok Edwinb2b37c62009-06-30 17:10:35 +0000270// DragonFlyBSD Target
271template<typename Target>
272class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
273protected:
Craig Topper3164f332014-03-11 03:39:26 +0000274 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
275 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000276 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000277 Builder.defineMacro("__DragonFly__");
278 Builder.defineMacro("__DragonFly_cc_version", "100001");
279 Builder.defineMacro("__ELF__");
280 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
281 Builder.defineMacro("__tune_i386__");
282 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000283 }
284public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000285 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
286 : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +0000287 this->UserLabelPrefix = "";
288
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000289 switch (Triple.getArch()) {
290 default:
291 case llvm::Triple::x86:
292 case llvm::Triple::x86_64:
293 this->MCountName = ".mcount";
294 break;
295 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000296 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297};
298
299// FreeBSD Target
300template<typename Target>
301class FreeBSDTargetInfo : public OSTargetInfo<Target> {
302protected:
Craig Topper3164f332014-03-11 03:39:26 +0000303 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
304 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000305 // FreeBSD defines; list based off of gcc output
306
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000307 unsigned Release = Triple.getOSMajorVersion();
308 if (Release == 0U)
309 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000311 Builder.defineMacro("__FreeBSD__", Twine(Release));
312 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000313 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
314 DefineStd(Builder, "unix", Opts);
315 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000316
317 // On FreeBSD, wchar_t contains the number of the code point as
318 // used by the character set of the locale. These character sets are
319 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000320 //
321 // FIXME: This is wrong; the macro refers to the numerical values
322 // of wchar_t *literals*, which are not locale-dependent. However,
323 // FreeBSD systems apparently depend on us getting this wrong, and
324 // setting this to 1 is conforming even if all the basic source
325 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000326 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000327 }
328public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000329 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +0000330 this->UserLabelPrefix = "";
331
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000332 switch (Triple.getArch()) {
333 default:
334 case llvm::Triple::x86:
335 case llvm::Triple::x86_64:
336 this->MCountName = ".mcount";
337 break;
338 case llvm::Triple::mips:
339 case llvm::Triple::mipsel:
340 case llvm::Triple::ppc:
341 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000342 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000343 this->MCountName = "_mcount";
344 break;
345 case llvm::Triple::arm:
346 this->MCountName = "__mcount";
347 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000348 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000349 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000350};
351
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000352// GNU/kFreeBSD Target
353template<typename Target>
354class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
355protected:
Craig Topper3164f332014-03-11 03:39:26 +0000356 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
357 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000358 // GNU/kFreeBSD defines; list based off of gcc output
359
360 DefineStd(Builder, "unix", Opts);
361 Builder.defineMacro("__FreeBSD_kernel__");
362 Builder.defineMacro("__GLIBC__");
363 Builder.defineMacro("__ELF__");
364 if (Opts.POSIXThreads)
365 Builder.defineMacro("_REENTRANT");
366 if (Opts.CPlusPlus)
367 Builder.defineMacro("_GNU_SOURCE");
368 }
369public:
Eric Christopher917e9522014-11-18 22:36:15 +0000370 KFreeBSDTargetInfo(const llvm::Triple &Triple)
James Y Knighta3518ad2016-01-27 01:04:51 +0000371 : OSTargetInfo<Target>(Triple) {
372 this->UserLabelPrefix = "";
373 }
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000374};
375
Chris Lattner3e2ee142010-07-07 16:01:42 +0000376// Minix Target
377template<typename Target>
378class MinixTargetInfo : public OSTargetInfo<Target> {
379protected:
Craig Topper3164f332014-03-11 03:39:26 +0000380 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
381 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000382 // Minix defines
383
384 Builder.defineMacro("__minix", "3");
385 Builder.defineMacro("_EM_WSIZE", "4");
386 Builder.defineMacro("_EM_PSIZE", "4");
387 Builder.defineMacro("_EM_SSIZE", "2");
388 Builder.defineMacro("_EM_LSIZE", "4");
389 Builder.defineMacro("_EM_FSIZE", "4");
390 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000391 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000392 DefineStd(Builder, "unix", Opts);
393 }
394public:
James Y Knighta3518ad2016-01-27 01:04:51 +0000395 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
396 this->UserLabelPrefix = "";
397 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000398};
399
Torok Edwinb2b37c62009-06-30 17:10:35 +0000400// Linux target
401template<typename Target>
402class LinuxTargetInfo : public OSTargetInfo<Target> {
403protected:
Craig Topper3164f332014-03-11 03:39:26 +0000404 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
405 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000406 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000407 DefineStd(Builder, "unix", Opts);
408 DefineStd(Builder, "linux", Opts);
409 Builder.defineMacro("__gnu_linux__");
410 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000411 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000412 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000413 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000414 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000415 this->PlatformName = "android";
416 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
417 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000418 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000419 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000420 if (Opts.CPlusPlus)
421 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000422 }
423public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000424 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000425 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000426 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000427
428 switch (Triple.getArch()) {
429 default:
430 break;
431 case llvm::Triple::ppc:
432 case llvm::Triple::ppc64:
433 case llvm::Triple::ppc64le:
434 this->MCountName = "_mcount";
435 break;
436 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000437 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000438
Craig Topper3164f332014-03-11 03:39:26 +0000439 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000440 return ".text.startup";
441 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000442};
443
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000444// NetBSD Target
445template<typename Target>
446class NetBSDTargetInfo : public OSTargetInfo<Target> {
447protected:
Craig Topper3164f332014-03-11 03:39:26 +0000448 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
449 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000450 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000451 Builder.defineMacro("__NetBSD__");
452 Builder.defineMacro("__unix__");
453 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000454 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000455 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000456
457 switch (Triple.getArch()) {
458 default:
459 break;
460 case llvm::Triple::arm:
461 case llvm::Triple::armeb:
462 case llvm::Triple::thumb:
463 case llvm::Triple::thumbeb:
464 Builder.defineMacro("__ARM_DWARF_EH__");
465 break;
466 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000467 }
468public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000469 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +0000470 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000471 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000472 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000473};
474
Torok Edwinb2b37c62009-06-30 17:10:35 +0000475// OpenBSD Target
476template<typename Target>
477class OpenBSDTargetInfo : 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 {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000481 // OpenBSD defines; list based off of gcc output
482
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000483 Builder.defineMacro("__OpenBSD__");
484 DefineStd(Builder, "unix", Opts);
485 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000486 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000487 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000488 }
489public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000490 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +0000491 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000492 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000493
Eli Friedman3715d1f2011-12-15 02:15:56 +0000494 switch (Triple.getArch()) {
495 default:
496 case llvm::Triple::x86:
497 case llvm::Triple::x86_64:
498 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000499 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000500 this->MCountName = "__mcount";
501 break;
502 case llvm::Triple::mips64:
503 case llvm::Triple::mips64el:
504 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000505 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000506 this->MCountName = "_mcount";
507 break;
508 }
509 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000510};
511
Eli Friedman9fa28852012-08-08 23:57:20 +0000512// Bitrig Target
513template<typename Target>
514class BitrigTargetInfo : public OSTargetInfo<Target> {
515protected:
Craig Topper3164f332014-03-11 03:39:26 +0000516 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
517 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000518 // Bitrig defines; list based off of gcc output
519
520 Builder.defineMacro("__Bitrig__");
521 DefineStd(Builder, "unix", Opts);
522 Builder.defineMacro("__ELF__");
523 if (Opts.POSIXThreads)
524 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000525
526 switch (Triple.getArch()) {
527 default:
528 break;
529 case llvm::Triple::arm:
530 case llvm::Triple::armeb:
531 case llvm::Triple::thumb:
532 case llvm::Triple::thumbeb:
533 Builder.defineMacro("__ARM_DWARF_EH__");
534 break;
535 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000536 }
537public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000538 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +0000539 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000540 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000541 }
542};
543
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000544// PSP Target
545template<typename Target>
546class PSPTargetInfo : public OSTargetInfo<Target> {
547protected:
Craig Topper3164f332014-03-11 03:39:26 +0000548 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
549 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000550 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000551 Builder.defineMacro("PSP");
552 Builder.defineMacro("_PSP");
553 Builder.defineMacro("__psp__");
554 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000555 }
556public:
James Y Knighta3518ad2016-01-27 01:04:51 +0000557 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
558 this->UserLabelPrefix = "";
559 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000560};
561
John Thompsone467e192009-11-19 17:18:50 +0000562// PS3 PPU Target
563template<typename Target>
564class PS3PPUTargetInfo : public OSTargetInfo<Target> {
565protected:
Craig Topper3164f332014-03-11 03:39:26 +0000566 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
567 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000568 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000569 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000570 Builder.defineMacro("__PPU__");
571 Builder.defineMacro("__CELLOS_LV2__");
572 Builder.defineMacro("__ELF__");
573 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000574 Builder.defineMacro("_ARCH_PPC64");
575 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000576 }
577public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000578 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +0000579 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000580 this->LongWidth = this->LongAlign = 32;
581 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000582 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000583 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000584 this->SizeType = TargetInfo::UnsignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +0000585 this->DataLayoutString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000586 }
587};
588
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000589template <typename Target>
590class PS4OSTargetInfo : public OSTargetInfo<Target> {
591protected:
592 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
593 MacroBuilder &Builder) const override {
594 Builder.defineMacro("__FreeBSD__", "9");
595 Builder.defineMacro("__FreeBSD_cc_version", "900001");
596 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
597 DefineStd(Builder, "unix", Opts);
598 Builder.defineMacro("__ELF__");
599 Builder.defineMacro("__PS4__");
600 }
601public:
602 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
603 this->WCharType = this->UnsignedShort;
604
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000605 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
606 this->MaxTLSAlign = 256;
James Y Knighta3518ad2016-01-27 01:04:51 +0000607 this->UserLabelPrefix = "";
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000608
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000609 // On PS4, do not honor explicit bit field alignment,
610 // as in "__attribute__((aligned(2))) int b : 1;".
611 this->UseExplicitBitFieldAlignment = false;
612
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000613 switch (Triple.getArch()) {
614 default:
615 case llvm::Triple::x86_64:
616 this->MCountName = ".mcount";
617 break;
618 }
619 }
620};
621
Torok Edwinb2b37c62009-06-30 17:10:35 +0000622// Solaris target
623template<typename Target>
624class SolarisTargetInfo : public OSTargetInfo<Target> {
625protected:
Craig Topper3164f332014-03-11 03:39:26 +0000626 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
627 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000628 DefineStd(Builder, "sun", Opts);
629 DefineStd(Builder, "unix", Opts);
630 Builder.defineMacro("__ELF__");
631 Builder.defineMacro("__svr4__");
632 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000633 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
634 // newer, but to 500 for everything else. feature_test.h has a check to
635 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000636 // with a new version.
637 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000638 Builder.defineMacro("_XOPEN_SOURCE", "600");
639 else
640 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000641 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000642 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000643 Builder.defineMacro("_LARGEFILE_SOURCE");
644 Builder.defineMacro("_LARGEFILE64_SOURCE");
645 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000646 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000647 }
648public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000649 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000650 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000651 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000652 // FIXME: WIntType should be SignedLong
653 }
654};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000655
656// Windows target
657template<typename Target>
658class WindowsTargetInfo : public OSTargetInfo<Target> {
659protected:
Craig Topper3164f332014-03-11 03:39:26 +0000660 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
661 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000662 Builder.defineMacro("_WIN32");
663 }
664 void getVisualStudioDefines(const LangOptions &Opts,
665 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000666 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000667 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000668 Builder.defineMacro("_CPPRTTI");
669
Reid Kleckner16514352015-01-30 21:42:55 +0000670 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000671 Builder.defineMacro("_CPPUNWIND");
672 }
673
David Majnemer6a658902015-07-22 22:36:26 +0000674 if (Opts.Bool)
675 Builder.defineMacro("__BOOL_DEFINED");
676
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000677 if (!Opts.CharIsSigned)
678 Builder.defineMacro("_CHAR_UNSIGNED");
679
680 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
681 // but it works for now.
682 if (Opts.POSIXThreads)
683 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000684
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000685 if (Opts.MSCompatibilityVersion) {
686 Builder.defineMacro("_MSC_VER",
687 Twine(Opts.MSCompatibilityVersion / 100000));
688 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000689 // FIXME We cannot encode the revision information into 32-bits
690 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000691
David Majnemerb710a932015-05-11 03:57:49 +0000692 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000693 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000694 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000695
696 if (Opts.MicrosoftExt) {
697 Builder.defineMacro("_MSC_EXTENSIONS");
698
699 if (Opts.CPlusPlus11) {
700 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
701 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
702 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
703 }
704 }
705
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000706 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000707 }
708
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000709public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000710 WindowsTargetInfo(const llvm::Triple &Triple)
711 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000712};
713
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000714template <typename Target>
715class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000716protected:
Craig Topper3164f332014-03-11 03:39:26 +0000717 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
718 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000719 if (Opts.POSIXThreads)
720 Builder.defineMacro("_REENTRANT");
721 if (Opts.CPlusPlus)
722 Builder.defineMacro("_GNU_SOURCE");
723
724 DefineStd(Builder, "unix", Opts);
725 Builder.defineMacro("__ELF__");
726 Builder.defineMacro("__native_client__");
727 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000728
729public:
730 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +0000731 this->UserLabelPrefix = "";
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000732 this->LongAlign = 32;
733 this->LongWidth = 32;
734 this->PointerAlign = 32;
735 this->PointerWidth = 32;
736 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000737 this->Int64Type = TargetInfo::SignedLongLong;
738 this->DoubleAlign = 64;
739 this->LongDoubleWidth = 64;
740 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000741 this->LongLongWidth = 64;
742 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000743 this->SizeType = TargetInfo::UnsignedInt;
744 this->PtrDiffType = TargetInfo::SignedInt;
745 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000746 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000747 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000748 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000749 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000750 } else if (Triple.getArch() == llvm::Triple::x86) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000751 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000752 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000753 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000754 } else if (Triple.getArch() == llvm::Triple::mipsel) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000755 // Handled on mips' setDataLayoutString.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000756 } else {
757 assert(Triple.getArch() == llvm::Triple::le32);
Eric Christopher964a5f32015-08-05 23:48:05 +0000758 this->DataLayoutString = "e-p:32:32-i64:64";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000759 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000760 }
761};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000762
Dan Gohmanc2853072015-09-03 22:51:53 +0000763// WebAssembly target
764template <typename Target>
765class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
766 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000767 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000768 // A common platform macro.
769 if (Opts.POSIXThreads)
770 Builder.defineMacro("_REENTRANT");
771 // Follow g++ convention and predefine _GNU_SOURCE for C++.
772 if (Opts.CPlusPlus)
773 Builder.defineMacro("_GNU_SOURCE");
774 }
775
776 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000777 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000778 return ".text.__startup";
779 }
780
781public:
782 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
783 : OSTargetInfo<Target>(Triple) {
784 this->MCountName = "__mcount";
James Y Knighta3518ad2016-01-27 01:04:51 +0000785 this->UserLabelPrefix = "";
Dan Gohmanc2853072015-09-03 22:51:53 +0000786 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
787 }
788};
Dan Gohmanc2853072015-09-03 22:51:53 +0000789
Chris Lattner09d98f52008-10-05 21:50:58 +0000790//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000791// Specific target implementations.
792//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000793
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000794// PPC abstract base class
795class PPCTargetInfo : public TargetInfo {
796 static const Builtin::Info BuiltinInfo[];
797 static const char * const GCCRegNames[];
798 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000799 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000800
801 // Target cpu features.
802 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000803 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000804 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000805 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000806 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000807 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000808 bool HasBPERMD;
809 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000810
Ulrich Weigand8afad612014-07-28 13:17:52 +0000811protected:
812 std::string ABI;
813
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000814public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000815 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000816 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000817 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000818 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000819 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000820 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000821 LongDoubleWidth = LongDoubleAlign = 128;
822 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
823 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000824
Hal Finkel6b984f02012-07-03 16:51:04 +0000825 /// \brief Flags for architecture specific defines.
826 typedef enum {
827 ArchDefineNone = 0,
828 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
829 ArchDefinePpcgr = 1 << 1,
830 ArchDefinePpcsq = 1 << 2,
831 ArchDefine440 = 1 << 3,
832 ArchDefine603 = 1 << 4,
833 ArchDefine604 = 1 << 5,
834 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000835 ArchDefinePwr5 = 1 << 7,
836 ArchDefinePwr5x = 1 << 8,
837 ArchDefinePwr6 = 1 << 9,
838 ArchDefinePwr6x = 1 << 10,
839 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000840 ArchDefinePwr8 = 1 << 12,
841 ArchDefineA2 = 1 << 13,
842 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000843 } ArchDefineTypes;
844
Bill Schmidt38378a02013-02-01 20:23:10 +0000845 // Note: GCC recognizes the following additional cpus:
846 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
847 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
848 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000849 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000850 bool CPUKnown = llvm::StringSwitch<bool>(Name)
851 .Case("generic", true)
852 .Case("440", true)
853 .Case("450", true)
854 .Case("601", true)
855 .Case("602", true)
856 .Case("603", true)
857 .Case("603e", true)
858 .Case("603ev", true)
859 .Case("604", true)
860 .Case("604e", true)
861 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000862 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000863 .Case("g3", true)
864 .Case("7400", true)
865 .Case("g4", true)
866 .Case("7450", true)
867 .Case("g4+", true)
868 .Case("750", true)
869 .Case("970", true)
870 .Case("g5", true)
871 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000872 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000873 .Case("e500mc", true)
874 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000875 .Case("power3", true)
876 .Case("pwr3", true)
877 .Case("power4", true)
878 .Case("pwr4", true)
879 .Case("power5", true)
880 .Case("pwr5", true)
881 .Case("power5x", true)
882 .Case("pwr5x", true)
883 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000884 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000885 .Case("power6x", true)
886 .Case("pwr6x", true)
887 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000888 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000889 .Case("power8", true)
890 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000891 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000892 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000893 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000894 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000895 .Case("powerpc64le", true)
896 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000897 .Default(false);
898
899 if (CPUKnown)
900 CPU = Name;
901
902 return CPUKnown;
903 }
904
Ulrich Weigand8afad612014-07-28 13:17:52 +0000905
906 StringRef getABI() const override { return ABI; }
907
Craig Topper6c03a542015-10-19 04:51:35 +0000908 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
909 return llvm::makeArrayRef(BuiltinInfo,
910 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000911 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000912
Craig Topper3164f332014-03-11 03:39:26 +0000913 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000914
Craig Topper3164f332014-03-11 03:39:26 +0000915 void getTargetDefines(const LangOptions &Opts,
916 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000917
Eric Christopher8c47b422015-10-09 18:39:55 +0000918 bool
919 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
920 StringRef CPU,
921 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000922
Craig Topper3164f332014-03-11 03:39:26 +0000923 bool handleTargetFeatures(std::vector<std::string> &Features,
924 DiagnosticsEngine &Diags) override;
925 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000926 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
927 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000928
Craig Topperf054e3a2015-10-19 03:52:27 +0000929 ArrayRef<const char *> getGCCRegNames() const override;
930 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000931 bool validateAsmConstraint(const char *&Name,
932 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000933 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000934 default: return false;
935 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000936 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000937 case 'b': // Base register
938 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000939 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000940 break;
941 // FIXME: The following are added to allow parsing.
942 // I just took a guess at what the actions should be.
943 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000944 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000945 case 'v': // Altivec vector register
946 Info.setAllowsRegister();
947 break;
948 case 'w':
949 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000950 case 'd':// VSX vector register to hold vector double data
951 case 'f':// VSX vector register to hold vector float data
952 case 's':// VSX vector register to hold scalar float data
953 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000954 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000955 break;
956 default:
957 return false;
958 }
959 Info.setAllowsRegister();
960 Name++; // Skip over 'w'.
961 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000962 case 'h': // `MQ', `CTR', or `LINK' register
963 case 'q': // `MQ' register
964 case 'c': // `CTR' register
965 case 'l': // `LINK' register
966 case 'x': // `CR' register (condition register) number 0
967 case 'y': // `CR' register (condition register)
968 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000969 Info.setAllowsRegister();
970 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000971 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000972 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000973 // (use `L' instead for SImode constants)
974 case 'K': // Unsigned 16-bit constant
975 case 'L': // Signed 16-bit constant shifted left 16 bits
976 case 'M': // Constant larger than 31
977 case 'N': // Exact power of 2
978 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000979 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000980 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000981 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000982 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000983 break;
984 case 'm': // Memory operand. Note that on PowerPC targets, m can
985 // include addresses that update the base register. It
986 // is therefore only safe to use `m' in an asm statement
987 // if that asm statement accesses the operand exactly once.
988 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000989 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000990 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000991 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000992 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000993 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
994 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000995 // register to be updated.
996 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000997 if (Name[1] != 's')
998 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000999 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001000 // include any automodification of the base register. Unlike
1001 // `m', this constraint can be used in asm statements that
1002 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001003 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001004 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001005 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001006 break;
1007 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001008 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001009 case 'Z': // Memory operand that is an indexed or indirect from a
1010 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001011 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001012 Info.setAllowsMemory();
1013 Info.setAllowsRegister();
1014 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001015 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001016 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001017 // register (`p' is preferable for asm statements)
1018 case 'S': // Constant suitable as a 64-bit mask operand
1019 case 'T': // Constant suitable as a 32-bit mask operand
1020 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001021 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001022 // instructions
1023 case 'W': // Vector constant that does not require memory
1024 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001025 break;
1026 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001027 }
John Thompson07a61a42010-06-24 22:44:13 +00001028 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001029 }
Craig Topper3164f332014-03-11 03:39:26 +00001030 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001031 std::string R;
1032 switch (*Constraint) {
1033 case 'e':
1034 case 'w':
1035 // Two-character constraint; add "^" hint for later parsing.
1036 R = std::string("^") + std::string(Constraint, 2);
1037 Constraint++;
1038 break;
1039 default:
1040 return TargetInfo::convertConstraint(Constraint);
1041 }
1042 return R;
1043 }
Craig Topper3164f332014-03-11 03:39:26 +00001044 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001045 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001046 }
Craig Topper3164f332014-03-11 03:39:26 +00001047 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001048 if (RegNo == 0) return 3;
1049 if (RegNo == 1) return 4;
1050 return -1;
1051 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001052
1053 bool hasSjLjLowering() const override {
1054 return true;
1055 }
David Majnemer2617ea62015-06-09 18:05:33 +00001056
1057 bool useFloat128ManglingForLongDouble() const override {
1058 return LongDoubleWidth == 128 &&
1059 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1060 getTriple().isOSBinFormatELF();
1061 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001062};
Anders Carlssonf511f642007-11-27 04:11:28 +00001063
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001064const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001065#define BUILTIN(ID, TYPE, ATTRS) \
1066 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1067#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1068 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001069#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001070};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001071
Eric Christopher917e9522014-11-18 22:36:15 +00001072/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001073/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001074bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001075 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001076 for (const auto &Feature : Features) {
1077 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001078 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001079 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001080 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001081 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001082 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001083 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001084 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001085 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001086 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001087 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001088 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001089 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001090 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001091 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001092 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001093 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001094 // TODO: Finish this list and add an assert that we've handled them
1095 // all.
1096 }
Eric Christopher02c33352015-08-25 00:59:11 +00001097
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001098 return true;
1099}
1100
Chris Lattnerecd49032009-03-02 22:27:17 +00001101/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1102/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001103void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001104 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001105 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001106 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001107 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001108 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001109 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001110 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001111 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001112 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001113 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001114 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001115 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001116 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001117
Chris Lattnerecd49032009-03-02 22:27:17 +00001118 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001119 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1120 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001121 } else {
1122 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1123 getTriple().getOS() != llvm::Triple::OpenBSD)
1124 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001125 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001126
Ulrich Weigand8afad612014-07-28 13:17:52 +00001127 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001128 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001129 Builder.defineMacro("_CALL_ELF", "1");
1130 if (ABI == "elfv2")
1131 Builder.defineMacro("_CALL_ELF", "2");
1132
Chris Lattnerecd49032009-03-02 22:27:17 +00001133 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001134 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1135 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001136
Chris Lattnerecd49032009-03-02 22:27:17 +00001137 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001138 if (LongDoubleWidth == 128)
1139 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001140
John Thompsone467e192009-11-19 17:18:50 +00001141 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001142 Builder.defineMacro("__VEC__", "10206");
1143 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001144 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001145
1146 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001147 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1148 .Case("440", ArchDefineName)
1149 .Case("450", ArchDefineName | ArchDefine440)
1150 .Case("601", ArchDefineName)
1151 .Case("602", ArchDefineName | ArchDefinePpcgr)
1152 .Case("603", ArchDefineName | ArchDefinePpcgr)
1153 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1154 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1155 .Case("604", ArchDefineName | ArchDefinePpcgr)
1156 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1157 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001158 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001159 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1160 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1161 .Case("750", ArchDefineName | ArchDefinePpcgr)
1162 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1163 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001164 .Case("a2", ArchDefineA2)
1165 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001166 .Case("pwr3", ArchDefinePpcgr)
1167 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1168 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1169 | ArchDefinePpcsq)
1170 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1171 | ArchDefinePpcgr | ArchDefinePpcsq)
1172 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1173 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1174 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1175 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1176 | ArchDefinePpcsq)
1177 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1178 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001179 | ArchDefinePpcgr | ArchDefinePpcsq)
1180 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1181 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1182 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001183 .Case("power3", ArchDefinePpcgr)
1184 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1185 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1186 | ArchDefinePpcsq)
1187 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1188 | ArchDefinePpcgr | ArchDefinePpcsq)
1189 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1190 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1191 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1192 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1193 | ArchDefinePpcsq)
1194 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1195 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001196 | ArchDefinePpcgr | ArchDefinePpcsq)
1197 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1198 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1199 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001200 .Default(ArchDefineNone);
1201
1202 if (defs & ArchDefineName)
1203 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1204 if (defs & ArchDefinePpcgr)
1205 Builder.defineMacro("_ARCH_PPCGR");
1206 if (defs & ArchDefinePpcsq)
1207 Builder.defineMacro("_ARCH_PPCSQ");
1208 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001209 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001210 if (defs & ArchDefine603)
1211 Builder.defineMacro("_ARCH_603");
1212 if (defs & ArchDefine604)
1213 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001214 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001215 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001216 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001217 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001218 if (defs & ArchDefinePwr5x)
1219 Builder.defineMacro("_ARCH_PWR5X");
1220 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001221 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001222 if (defs & ArchDefinePwr6x)
1223 Builder.defineMacro("_ARCH_PWR6X");
1224 if (defs & ArchDefinePwr7)
1225 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001226 if (defs & ArchDefinePwr8)
1227 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001228 if (defs & ArchDefineA2)
1229 Builder.defineMacro("_ARCH_A2");
1230 if (defs & ArchDefineA2q) {
1231 Builder.defineMacro("_ARCH_A2Q");
1232 Builder.defineMacro("_ARCH_QP");
1233 }
1234
1235 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1236 Builder.defineMacro("__bg__");
1237 Builder.defineMacro("__THW_BLUEGENE__");
1238 Builder.defineMacro("__bgq__");
1239 Builder.defineMacro("__TOS_BGQ__");
1240 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001241
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001242 if (HasVSX)
1243 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001244 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001245 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001246 if (HasP8Crypto)
1247 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001248 if (HasHTM)
1249 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001250
1251 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1252 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1253 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1254 if (PointerWidth == 64)
1255 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001256
Bill Schmidt38378a02013-02-01 20:23:10 +00001257 // FIXME: The following are not yet generated here by Clang, but are
1258 // generated by GCC:
1259 //
1260 // _SOFT_FLOAT_
1261 // __RECIP_PRECISION__
1262 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001263 // __RECIP__
1264 // __RECIPF__
1265 // __RSQRTE__
1266 // __RSQRTEF__
1267 // _SOFT_DOUBLE_
1268 // __NO_LWSYNC__
1269 // __HAVE_BSWAP__
1270 // __LONGDOUBLE128
1271 // __CMODEL_MEDIUM__
1272 // __CMODEL_LARGE__
1273 // _CALL_SYSV
1274 // _CALL_DARWIN
1275 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001276}
1277
Eric Christophera8a14c32015-08-31 18:39:16 +00001278// Handle explicit options being passed to the compiler here: if we've
1279// explicitly turned off vsx and turned on power8-vector or direct-move then
1280// go ahead and error since the customer has expressed a somewhat incompatible
1281// set of options.
1282static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001283 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001284
1285 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1286 FeaturesVec.end()) {
1287 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1288 FeaturesVec.end()) {
1289 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1290 << "-mno-vsx";
1291 return false;
1292 }
1293
1294 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1295 FeaturesVec.end()) {
1296 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1297 << "-mno-vsx";
1298 return false;
1299 }
1300 }
1301
1302 return true;
1303}
1304
Eric Christopher8c47b422015-10-09 18:39:55 +00001305bool PPCTargetInfo::initFeatureMap(
1306 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1307 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001308 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1309 .Case("7400", true)
1310 .Case("g4", true)
1311 .Case("7450", true)
1312 .Case("g4+", true)
1313 .Case("970", true)
1314 .Case("g5", true)
1315 .Case("pwr6", true)
1316 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001317 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001318 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001319 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001320 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001321
1322 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001323 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1324 .Case("ppc64le", true)
1325 .Case("pwr8", true)
1326 .Default(false);
1327 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1328 .Case("ppc64le", true)
1329 .Case("pwr8", true)
1330 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001331 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1332 .Case("ppc64le", true)
1333 .Case("pwr8", true)
1334 .Case("pwr7", true)
1335 .Default(false);
1336 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1337 .Case("ppc64le", true)
1338 .Case("pwr8", true)
1339 .Case("pwr7", true)
1340 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001341 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1342 .Case("ppc64le", true)
1343 .Case("pwr8", true)
1344 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001345 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1346 .Case("ppc64le", true)
1347 .Case("pwr8", true)
1348 .Case("pwr7", true)
1349 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001350
Eric Christophera8a14c32015-08-31 18:39:16 +00001351 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1352 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001353
Eric Christopher007b0a02015-08-28 22:32:01 +00001354 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001355}
1356
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001357bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001358 return llvm::StringSwitch<bool>(Feature)
1359 .Case("powerpc", true)
1360 .Case("vsx", HasVSX)
1361 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001362 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001363 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001364 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001365 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001366 .Case("bpermd", HasBPERMD)
1367 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001368 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001369}
Chris Lattner17df24e2008-04-21 18:56:49 +00001370
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001371void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1372 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001373 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1374 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1375 // incompatible options.
1376 if (Enabled) {
1377 if (Name == "vsx") {
1378 Features[Name] = true;
1379 } else if (Name == "direct-move") {
1380 Features[Name] = Features["vsx"] = true;
1381 } else if (Name == "power8-vector") {
1382 Features[Name] = Features["vsx"] = true;
1383 } else {
1384 Features[Name] = true;
1385 }
1386 } else {
1387 if (Name == "vsx") {
1388 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1389 false;
1390 } else {
1391 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001392 }
1393 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001394}
1395
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001396const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001397 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1398 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1399 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1400 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1401 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1402 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1403 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1404 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001405 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001406 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001407 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001408 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1409 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1410 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1411 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001412 "vrsave", "vscr",
1413 "spe_acc", "spefscr",
1414 "sfp"
1415};
Chris Lattner10a5b382007-01-29 05:24:35 +00001416
Craig Topperf054e3a2015-10-19 03:52:27 +00001417ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1418 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001419}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001420
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001421const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1422 // While some of these aliases do map to different registers
1423 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001424 { { "0" }, "r0" },
1425 { { "1"}, "r1" },
1426 { { "2" }, "r2" },
1427 { { "3" }, "r3" },
1428 { { "4" }, "r4" },
1429 { { "5" }, "r5" },
1430 { { "6" }, "r6" },
1431 { { "7" }, "r7" },
1432 { { "8" }, "r8" },
1433 { { "9" }, "r9" },
1434 { { "10" }, "r10" },
1435 { { "11" }, "r11" },
1436 { { "12" }, "r12" },
1437 { { "13" }, "r13" },
1438 { { "14" }, "r14" },
1439 { { "15" }, "r15" },
1440 { { "16" }, "r16" },
1441 { { "17" }, "r17" },
1442 { { "18" }, "r18" },
1443 { { "19" }, "r19" },
1444 { { "20" }, "r20" },
1445 { { "21" }, "r21" },
1446 { { "22" }, "r22" },
1447 { { "23" }, "r23" },
1448 { { "24" }, "r24" },
1449 { { "25" }, "r25" },
1450 { { "26" }, "r26" },
1451 { { "27" }, "r27" },
1452 { { "28" }, "r28" },
1453 { { "29" }, "r29" },
1454 { { "30" }, "r30" },
1455 { { "31" }, "r31" },
1456 { { "fr0" }, "f0" },
1457 { { "fr1" }, "f1" },
1458 { { "fr2" }, "f2" },
1459 { { "fr3" }, "f3" },
1460 { { "fr4" }, "f4" },
1461 { { "fr5" }, "f5" },
1462 { { "fr6" }, "f6" },
1463 { { "fr7" }, "f7" },
1464 { { "fr8" }, "f8" },
1465 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001466 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001467 { { "fr11" }, "f11" },
1468 { { "fr12" }, "f12" },
1469 { { "fr13" }, "f13" },
1470 { { "fr14" }, "f14" },
1471 { { "fr15" }, "f15" },
1472 { { "fr16" }, "f16" },
1473 { { "fr17" }, "f17" },
1474 { { "fr18" }, "f18" },
1475 { { "fr19" }, "f19" },
1476 { { "fr20" }, "f20" },
1477 { { "fr21" }, "f21" },
1478 { { "fr22" }, "f22" },
1479 { { "fr23" }, "f23" },
1480 { { "fr24" }, "f24" },
1481 { { "fr25" }, "f25" },
1482 { { "fr26" }, "f26" },
1483 { { "fr27" }, "f27" },
1484 { { "fr28" }, "f28" },
1485 { { "fr29" }, "f29" },
1486 { { "fr30" }, "f30" },
1487 { { "fr31" }, "f31" },
1488 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001489};
1490
Craig Topperf054e3a2015-10-19 03:52:27 +00001491ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1492 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001493}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001494
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001495class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001496public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001497 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001498 DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001499
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001500 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001501 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001502 case llvm::Triple::FreeBSD:
1503 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001504 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001505 PtrDiffType = SignedInt;
1506 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001507 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001508 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001509 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001510 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001511
Roman Divacky3ffe7462012-03-13 19:20:17 +00001512 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1513 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001514 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001515 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001516
1517 // PPC32 supports atomics up to 4 bytes.
1518 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001519 }
1520
Craig Topper3164f332014-03-11 03:39:26 +00001521 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001522 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001523 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001524 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001525};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001526
Bill Schmidt778d3872013-07-26 01:36:11 +00001527// Note: ABI differences may eventually require us to have a separate
1528// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001529class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001530public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001531 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001532 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001533 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001534 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001535
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001536 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001537 DataLayoutString = "e-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001538 ABI = "elfv2";
1539 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001540 DataLayoutString = "E-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001541 ABI = "elfv1";
1542 }
1543
1544 switch (getTriple().getOS()) {
1545 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001546 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001547 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001548 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001549 case llvm::Triple::NetBSD:
1550 IntMaxType = SignedLongLong;
1551 Int64Type = SignedLongLong;
1552 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001553 default:
1554 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001555 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001556
1557 // PPC64 supports atomics up to 8 bytes.
1558 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001559 }
Craig Topper3164f332014-03-11 03:39:26 +00001560 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001561 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001562 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001563 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001564 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001565 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001566 ABI = Name;
1567 return true;
1568 }
1569 return false;
1570 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001571};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001572
Roman Divacky965b0b72011-01-06 08:27:10 +00001573class DarwinPPC32TargetInfo :
1574 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001575public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001576 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1577 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001578 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001579 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001580 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001581 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001582 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001583 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001584 }
Craig Topper3164f332014-03-11 03:39:26 +00001585 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001586 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001587 }
1588};
1589
1590class DarwinPPC64TargetInfo :
1591 public DarwinTargetInfo<PPC64TargetInfo> {
1592public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001593 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1594 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001595 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001596 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001597 DataLayoutString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001598 }
1599};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001600
Eric Christopherc48497a2015-09-18 21:26:24 +00001601static const unsigned NVPTXAddrSpaceMap[] = {
1602 1, // opencl_global
1603 3, // opencl_local
1604 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001605 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001606 0, // opencl_generic
1607 1, // cuda_device
1608 4, // cuda_constant
1609 3, // cuda_shared
1610};
1611
1612class NVPTXTargetInfo : public TargetInfo {
1613 static const char *const GCCRegNames[];
1614 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001615
1616 // The GPU profiles supported by the NVPTX backend
1617 enum GPUKind {
1618 GK_NONE,
1619 GK_SM20,
1620 GK_SM21,
1621 GK_SM30,
1622 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001623 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001624 } GPU;
1625
Eric Christopherc48497a2015-09-18 21:26:24 +00001626public:
1627 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1628 BigEndian = false;
1629 TLSSupported = false;
1630 LongWidth = LongAlign = 64;
1631 AddrSpaceMap = &NVPTXAddrSpaceMap;
1632 UseAddrSpaceMapMangling = true;
1633 // Define available target features
1634 // These must be defined in sorted order!
1635 NoAsmVariants = true;
1636 // Set the default GPU to sm20
1637 GPU = GK_SM20;
1638 }
1639 void getTargetDefines(const LangOptions &Opts,
1640 MacroBuilder &Builder) const override {
1641 Builder.defineMacro("__PTX__");
1642 Builder.defineMacro("__NVPTX__");
1643 if (Opts.CUDAIsDevice) {
1644 // Set __CUDA_ARCH__ for the GPU specified.
1645 std::string CUDAArchCode;
1646 switch (GPU) {
1647 case GK_SM20:
1648 CUDAArchCode = "200";
1649 break;
1650 case GK_SM21:
1651 CUDAArchCode = "210";
1652 break;
1653 case GK_SM30:
1654 CUDAArchCode = "300";
1655 break;
1656 case GK_SM35:
1657 CUDAArchCode = "350";
1658 break;
1659 case GK_SM37:
1660 CUDAArchCode = "370";
1661 break;
1662 default:
1663 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001664 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001665 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001666 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001667 }
Craig Topper6c03a542015-10-19 04:51:35 +00001668 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1669 return llvm::makeArrayRef(BuiltinInfo,
1670 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001671 }
1672 bool hasFeature(StringRef Feature) const override {
1673 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001674 }
1675
Craig Topperf054e3a2015-10-19 03:52:27 +00001676 ArrayRef<const char *> getGCCRegNames() const override;
1677 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001678 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001679 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001680 }
1681 bool validateAsmConstraint(const char *&Name,
1682 TargetInfo::ConstraintInfo &Info) const override {
1683 switch (*Name) {
1684 default:
1685 return false;
1686 case 'c':
1687 case 'h':
1688 case 'r':
1689 case 'l':
1690 case 'f':
1691 case 'd':
1692 Info.setAllowsRegister();
1693 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001694 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001695 }
1696 const char *getClobbers() const override {
1697 // FIXME: Is this really right?
1698 return "";
1699 }
1700 BuiltinVaListKind getBuiltinVaListKind() const override {
1701 // FIXME: implement
1702 return TargetInfo::CharPtrBuiltinVaList;
1703 }
1704 bool setCPU(const std::string &Name) override {
1705 GPU = llvm::StringSwitch<GPUKind>(Name)
1706 .Case("sm_20", GK_SM20)
1707 .Case("sm_21", GK_SM21)
1708 .Case("sm_30", GK_SM30)
1709 .Case("sm_35", GK_SM35)
1710 .Case("sm_37", GK_SM37)
1711 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001712
Eric Christopherc48497a2015-09-18 21:26:24 +00001713 return GPU != GK_NONE;
1714 }
1715};
1716
1717const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1718#define BUILTIN(ID, TYPE, ATTRS) \
1719 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1720#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1721 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1722#include "clang/Basic/BuiltinsNVPTX.def"
1723};
1724
1725const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1726
Craig Topperf054e3a2015-10-19 03:52:27 +00001727ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1728 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001729}
1730
1731class NVPTX32TargetInfo : public NVPTXTargetInfo {
1732public:
1733 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001734 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001735 PointerWidth = PointerAlign = 32;
1736 SizeType = TargetInfo::UnsignedInt;
1737 PtrDiffType = TargetInfo::SignedInt;
1738 IntPtrType = TargetInfo::SignedInt;
1739 DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
1740 }
1741};
1742
1743class NVPTX64TargetInfo : public NVPTXTargetInfo {
1744public:
1745 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1746 PointerWidth = PointerAlign = 64;
1747 SizeType = TargetInfo::UnsignedLong;
1748 PtrDiffType = TargetInfo::SignedLong;
1749 IntPtrType = TargetInfo::SignedLong;
1750 DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64";
1751 }
1752};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001753
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001754static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001755 1, // opencl_global
1756 3, // opencl_local
1757 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001758 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001759 1, // cuda_device
1760 2, // cuda_constant
1761 3 // cuda_shared
1762};
1763
Tom Stellarda96344b2014-08-21 13:58:40 +00001764// If you edit the description strings, make sure you update
1765// getPointerWidthV().
1766
Craig Topper273dbc62015-10-18 05:29:26 +00001767static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001768 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1769 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001770
Craig Topper273dbc62015-10-18 05:29:26 +00001771static const char *const DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001772 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1773 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001774
Craig Topper273dbc62015-10-18 05:29:26 +00001775static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001776 "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 +00001777 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1778 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001779
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001780class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001781 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001782 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001783
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001784 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001785 enum GPUKind {
1786 GK_NONE,
1787 GK_R600,
1788 GK_R600_DOUBLE_OPS,
1789 GK_R700,
1790 GK_R700_DOUBLE_OPS,
1791 GK_EVERGREEN,
1792 GK_EVERGREEN_DOUBLE_OPS,
1793 GK_NORTHERN_ISLANDS,
1794 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001795 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001796 GK_SEA_ISLANDS,
1797 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001798 } GPU;
1799
Jan Veselyeebeaea2015-05-04 19:53:36 +00001800 bool hasFP64:1;
1801 bool hasFMAF:1;
1802 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001803
Eli Friedmand13b41e2012-10-12 23:32:00 +00001804public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001805 AMDGPUTargetInfo(const llvm::Triple &Triple)
1806 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001807
1808 if (Triple.getArch() == llvm::Triple::amdgcn) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001809 DataLayoutString = DataLayoutStringSI;
Tom Stellardd99fb952015-01-28 15:38:44 +00001810 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001811 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001812 hasFMAF = true;
1813 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001814 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001815 DataLayoutString = DataLayoutStringR600;
Tom Stellardd99fb952015-01-28 15:38:44 +00001816 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001817 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001818 hasFMAF = false;
1819 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001820 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001821 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001822 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001823 }
1824
Tom Stellarda96344b2014-08-21 13:58:40 +00001825 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1826 if (GPU <= GK_CAYMAN)
1827 return 32;
1828
1829 switch(AddrSpace) {
1830 default:
1831 return 64;
1832 case 0:
1833 case 3:
1834 case 5:
1835 return 32;
1836 }
1837 }
1838
Craig Topper3164f332014-03-11 03:39:26 +00001839 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001840 return "";
1841 }
1842
Craig Topperf054e3a2015-10-19 03:52:27 +00001843 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001844
Craig Topperf054e3a2015-10-19 03:52:27 +00001845 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1846 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001847 }
1848
Craig Topper3164f332014-03-11 03:39:26 +00001849 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00001850 TargetInfo::ConstraintInfo &Info) const override {
1851 switch (*Name) {
1852 default: break;
1853 case 'v': // vgpr
1854 case 's': // sgpr
1855 Info.setAllowsRegister();
1856 return true;
1857 }
1858 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001859 }
1860
Craig Topper6c03a542015-10-19 04:51:35 +00001861 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1862 return llvm::makeArrayRef(BuiltinInfo,
1863 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001864 }
1865
Craig Topper3164f332014-03-11 03:39:26 +00001866 void getTargetDefines(const LangOptions &Opts,
1867 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00001868 if (getTriple().getArch() == llvm::Triple::amdgcn)
1869 Builder.defineMacro("__AMDGCN__");
1870 else
1871 Builder.defineMacro("__R600__");
1872
Jan Veselyeebeaea2015-05-04 19:53:36 +00001873 if (hasFMAF)
1874 Builder.defineMacro("__HAS_FMAF__");
1875 if (hasLDEXPF)
1876 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001877 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001878 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001879 if (Opts.OpenCL) {
1880 if (GPU >= GK_NORTHERN_ISLANDS) {
1881 Builder.defineMacro("cl_khr_byte_addressable_store");
1882 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1883 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1884 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1885 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1886 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001887 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001888 }
1889
Craig Topper3164f332014-03-11 03:39:26 +00001890 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001891 return TargetInfo::CharPtrBuiltinVaList;
1892 }
1893
Craig Topper3164f332014-03-11 03:39:26 +00001894 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001895 GPU = llvm::StringSwitch<GPUKind>(Name)
1896 .Case("r600" , GK_R600)
1897 .Case("rv610", GK_R600)
1898 .Case("rv620", GK_R600)
1899 .Case("rv630", GK_R600)
1900 .Case("rv635", GK_R600)
1901 .Case("rs780", GK_R600)
1902 .Case("rs880", GK_R600)
1903 .Case("rv670", GK_R600_DOUBLE_OPS)
1904 .Case("rv710", GK_R700)
1905 .Case("rv730", GK_R700)
1906 .Case("rv740", GK_R700_DOUBLE_OPS)
1907 .Case("rv770", GK_R700_DOUBLE_OPS)
1908 .Case("palm", GK_EVERGREEN)
1909 .Case("cedar", GK_EVERGREEN)
1910 .Case("sumo", GK_EVERGREEN)
1911 .Case("sumo2", GK_EVERGREEN)
1912 .Case("redwood", GK_EVERGREEN)
1913 .Case("juniper", GK_EVERGREEN)
1914 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1915 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1916 .Case("barts", GK_NORTHERN_ISLANDS)
1917 .Case("turks", GK_NORTHERN_ISLANDS)
1918 .Case("caicos", GK_NORTHERN_ISLANDS)
1919 .Case("cayman", GK_CAYMAN)
1920 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001921 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001922 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1923 .Case("verde", GK_SOUTHERN_ISLANDS)
1924 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001925 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001926 .Case("bonaire", GK_SEA_ISLANDS)
1927 .Case("kabini", GK_SEA_ISLANDS)
1928 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001929 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001930 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001931 .Case("tonga", GK_VOLCANIC_ISLANDS)
1932 .Case("iceland", GK_VOLCANIC_ISLANDS)
1933 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00001934 .Case("fiji", GK_VOLCANIC_ISLANDS)
1935 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001936 .Default(GK_NONE);
1937
1938 if (GPU == GK_NONE) {
1939 return false;
1940 }
1941
1942 // Set the correct data layout
1943 switch (GPU) {
1944 case GK_NONE:
1945 case GK_R600:
1946 case GK_R700:
1947 case GK_EVERGREEN:
1948 case GK_NORTHERN_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001949 DataLayoutString = DataLayoutStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001950 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001951 hasFMAF = false;
1952 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001953 break;
1954 case GK_R600_DOUBLE_OPS:
1955 case GK_R700_DOUBLE_OPS:
1956 case GK_EVERGREEN_DOUBLE_OPS:
1957 case GK_CAYMAN:
Eric Christopher964a5f32015-08-05 23:48:05 +00001958 DataLayoutString = DataLayoutStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001959 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001960 hasFMAF = true;
1961 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001962 break;
1963 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001964 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001965 case GK_VOLCANIC_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001966 DataLayoutString = DataLayoutStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001967 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001968 hasFMAF = true;
1969 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001970 break;
1971 }
1972
1973 return true;
1974 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001975};
1976
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001977const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001978#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001979 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001980#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001981};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001982const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001983 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1984 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1985 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1986 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1987 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1988 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1989 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1990 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1991 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1992 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1993 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1994 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1995 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1996 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1997 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1998 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1999 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2000 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2001 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2002 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2003 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2004 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2005 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2006 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2007 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2008 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2009 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2010 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2011 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2012 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2013 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2014 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2015 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2016 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2017 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2018 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2019 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2020 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2021 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2022 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2023 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2024 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2025 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2026 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2027 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2028 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2029 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
2030 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
Matt Arsenaultb015d622016-02-27 09:06:22 +00002031 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2032 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002033};
2034
Craig Topperf054e3a2015-10-19 03:52:27 +00002035ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2036 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002037}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002038
Eli Friedman3fd920a2008-08-20 02:34:37 +00002039// Namespace for x86 abstract base class
2040const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002041#define BUILTIN(ID, TYPE, ATTRS) \
2042 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002043#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002044 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002045#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002046 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002047#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002048};
Eli Friedmanb5366062008-05-20 14:21:01 +00002049
Nuno Lopescfca1f02009-12-23 17:49:57 +00002050static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002051 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2052 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002053 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002054 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2055 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2056 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002057 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002058 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2059 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002060 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2061 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2062 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2063 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2064 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2065 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2066 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2067 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002068};
2069
Eric Christophercdd36352011-06-21 00:05:20 +00002070const TargetInfo::AddlRegName AddlRegNames[] = {
2071 { { "al", "ah", "eax", "rax" }, 0 },
2072 { { "bl", "bh", "ebx", "rbx" }, 3 },
2073 { { "cl", "ch", "ecx", "rcx" }, 2 },
2074 { { "dl", "dh", "edx", "rdx" }, 1 },
2075 { { "esi", "rsi" }, 4 },
2076 { { "edi", "rdi" }, 5 },
2077 { { "esp", "rsp" }, 7 },
2078 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002079 { { "r8d", "r8w", "r8b" }, 38 },
2080 { { "r9d", "r9w", "r9b" }, 39 },
2081 { { "r10d", "r10w", "r10b" }, 40 },
2082 { { "r11d", "r11w", "r11b" }, 41 },
2083 { { "r12d", "r12w", "r12b" }, 42 },
2084 { { "r13d", "r13w", "r13b" }, 43 },
2085 { { "r14d", "r14w", "r14b" }, 44 },
2086 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002087};
2088
2089// X86 target abstract base class; x86-32 and x86-64 are very close, so
2090// most of the implementation can be shared.
2091class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002092 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002093 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002094 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002095 enum MMX3DNowEnum {
2096 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002097 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002098 enum XOPEnum {
2099 NoXOP,
2100 SSE4A,
2101 FMA4,
2102 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002103 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002104
Craig Topper543f3bd2015-10-14 23:47:57 +00002105 bool HasAES = false;
2106 bool HasPCLMUL = false;
2107 bool HasLZCNT = false;
2108 bool HasRDRND = false;
2109 bool HasFSGSBASE = false;
2110 bool HasBMI = false;
2111 bool HasBMI2 = false;
2112 bool HasPOPCNT = false;
2113 bool HasRTM = false;
2114 bool HasPRFCHW = false;
2115 bool HasRDSEED = false;
2116 bool HasADX = false;
2117 bool HasTBM = false;
2118 bool HasFMA = false;
2119 bool HasF16C = false;
2120 bool HasAVX512CD = false;
2121 bool HasAVX512ER = false;
2122 bool HasAVX512PF = false;
2123 bool HasAVX512DQ = false;
2124 bool HasAVX512BW = false;
2125 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002126 bool HasAVX512VBMI = false;
2127 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002128 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002129 bool HasMPX = false;
2130 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002131 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002132 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002133 bool HasXSAVE = false;
2134 bool HasXSAVEOPT = false;
2135 bool HasXSAVEC = false;
2136 bool HasXSAVES = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002137 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002138 bool HasCLFLUSHOPT = false;
2139 bool HasPCOMMIT = false;
2140 bool HasCLWB = false;
2141 bool HasUMIP = false;
2142 bool HasMOVBE = false;
2143 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002144
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002145 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2146 ///
2147 /// Each enumeration represents a particular CPU supported by Clang. These
2148 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2149 enum CPUKind {
2150 CK_Generic,
2151
2152 /// \name i386
2153 /// i386-generation processors.
2154 //@{
2155 CK_i386,
2156 //@}
2157
2158 /// \name i486
2159 /// i486-generation processors.
2160 //@{
2161 CK_i486,
2162 CK_WinChipC6,
2163 CK_WinChip2,
2164 CK_C3,
2165 //@}
2166
2167 /// \name i586
2168 /// i586-generation processors, P5 microarchitecture based.
2169 //@{
2170 CK_i586,
2171 CK_Pentium,
2172 CK_PentiumMMX,
2173 //@}
2174
2175 /// \name i686
2176 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2177 //@{
2178 CK_i686,
2179 CK_PentiumPro,
2180 CK_Pentium2,
2181 CK_Pentium3,
2182 CK_Pentium3M,
2183 CK_PentiumM,
2184 CK_C3_2,
2185
2186 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2187 /// Clang however has some logic to suport this.
2188 // FIXME: Warn, deprecate, and potentially remove this.
2189 CK_Yonah,
2190 //@}
2191
2192 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002193 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002194 //@{
2195 CK_Pentium4,
2196 CK_Pentium4M,
2197 CK_Prescott,
2198 CK_Nocona,
2199 //@}
2200
2201 /// \name Core
2202 /// Core microarchitecture based processors.
2203 //@{
2204 CK_Core2,
2205
2206 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2207 /// codename which GCC no longer accepts as an option to -march, but Clang
2208 /// has some logic for recognizing it.
2209 // FIXME: Warn, deprecate, and potentially remove this.
2210 CK_Penryn,
2211 //@}
2212
2213 /// \name Atom
2214 /// Atom processors
2215 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002216 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002217 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002218 //@}
2219
2220 /// \name Nehalem
2221 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002222 CK_Nehalem,
2223
2224 /// \name Westmere
2225 /// Westmere microarchitecture based processors.
2226 CK_Westmere,
2227
2228 /// \name Sandy Bridge
2229 /// Sandy Bridge microarchitecture based processors.
2230 CK_SandyBridge,
2231
2232 /// \name Ivy Bridge
2233 /// Ivy Bridge microarchitecture based processors.
2234 CK_IvyBridge,
2235
2236 /// \name Haswell
2237 /// Haswell microarchitecture based processors.
2238 CK_Haswell,
2239
2240 /// \name Broadwell
2241 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002242 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002243
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002244 /// \name Skylake Client
2245 /// Skylake client microarchitecture based processors.
2246 CK_SkylakeClient,
2247
2248 /// \name Skylake Server
2249 /// Skylake server microarchitecture based processors.
2250 CK_SkylakeServer,
2251
2252 /// \name Cannonlake Client
2253 /// Cannonlake client microarchitecture based processors.
2254 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002255
Craig Topper449314e2013-08-20 07:09:39 +00002256 /// \name Knights Landing
2257 /// Knights Landing processor.
2258 CK_KNL,
2259
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002260 /// \name K6
2261 /// K6 architecture processors.
2262 //@{
2263 CK_K6,
2264 CK_K6_2,
2265 CK_K6_3,
2266 //@}
2267
2268 /// \name K7
2269 /// K7 architecture processors.
2270 //@{
2271 CK_Athlon,
2272 CK_AthlonThunderbird,
2273 CK_Athlon4,
2274 CK_AthlonXP,
2275 CK_AthlonMP,
2276 //@}
2277
2278 /// \name K8
2279 /// K8 architecture processors.
2280 //@{
2281 CK_Athlon64,
2282 CK_Athlon64SSE3,
2283 CK_AthlonFX,
2284 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002285 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002286 CK_Opteron,
2287 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002288 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002289 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002290
Benjamin Kramer569f2152012-01-10 11:50:18 +00002291 /// \name Bobcat
2292 /// Bobcat architecture processors.
2293 //@{
2294 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002295 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002296 //@}
2297
2298 /// \name Bulldozer
2299 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002300 //@{
2301 CK_BDVER1,
2302 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002303 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002304 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002305 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002306
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002307 /// This specification is deprecated and will be removed in the future.
2308 /// Users should prefer \see CK_K8.
2309 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002310 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002311 CK_x86_64,
2312 //@}
2313
2314 /// \name Geode
2315 /// Geode processors.
2316 //@{
2317 CK_Geode
2318 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002319 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002320
Eric Christopherc50738f2015-08-27 00:05:50 +00002321 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002322 return llvm::StringSwitch<CPUKind>(CPU)
2323 .Case("i386", CK_i386)
2324 .Case("i486", CK_i486)
2325 .Case("winchip-c6", CK_WinChipC6)
2326 .Case("winchip2", CK_WinChip2)
2327 .Case("c3", CK_C3)
2328 .Case("i586", CK_i586)
2329 .Case("pentium", CK_Pentium)
2330 .Case("pentium-mmx", CK_PentiumMMX)
2331 .Case("i686", CK_i686)
2332 .Case("pentiumpro", CK_PentiumPro)
2333 .Case("pentium2", CK_Pentium2)
2334 .Case("pentium3", CK_Pentium3)
2335 .Case("pentium3m", CK_Pentium3M)
2336 .Case("pentium-m", CK_PentiumM)
2337 .Case("c3-2", CK_C3_2)
2338 .Case("yonah", CK_Yonah)
2339 .Case("pentium4", CK_Pentium4)
2340 .Case("pentium4m", CK_Pentium4M)
2341 .Case("prescott", CK_Prescott)
2342 .Case("nocona", CK_Nocona)
2343 .Case("core2", CK_Core2)
2344 .Case("penryn", CK_Penryn)
2345 .Case("bonnell", CK_Bonnell)
2346 .Case("atom", CK_Bonnell) // Legacy name.
2347 .Case("silvermont", CK_Silvermont)
2348 .Case("slm", CK_Silvermont) // Legacy name.
2349 .Case("nehalem", CK_Nehalem)
2350 .Case("corei7", CK_Nehalem) // Legacy name.
2351 .Case("westmere", CK_Westmere)
2352 .Case("sandybridge", CK_SandyBridge)
2353 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2354 .Case("ivybridge", CK_IvyBridge)
2355 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2356 .Case("haswell", CK_Haswell)
2357 .Case("core-avx2", CK_Haswell) // Legacy name.
2358 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002359 .Case("skylake", CK_SkylakeClient)
2360 .Case("skylake-avx512", CK_SkylakeServer)
2361 .Case("skx", CK_SkylakeServer) // Legacy name.
2362 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002363 .Case("knl", CK_KNL)
2364 .Case("k6", CK_K6)
2365 .Case("k6-2", CK_K6_2)
2366 .Case("k6-3", CK_K6_3)
2367 .Case("athlon", CK_Athlon)
2368 .Case("athlon-tbird", CK_AthlonThunderbird)
2369 .Case("athlon-4", CK_Athlon4)
2370 .Case("athlon-xp", CK_AthlonXP)
2371 .Case("athlon-mp", CK_AthlonMP)
2372 .Case("athlon64", CK_Athlon64)
2373 .Case("athlon64-sse3", CK_Athlon64SSE3)
2374 .Case("athlon-fx", CK_AthlonFX)
2375 .Case("k8", CK_K8)
2376 .Case("k8-sse3", CK_K8SSE3)
2377 .Case("opteron", CK_Opteron)
2378 .Case("opteron-sse3", CK_OpteronSSE3)
2379 .Case("barcelona", CK_AMDFAM10)
2380 .Case("amdfam10", CK_AMDFAM10)
2381 .Case("btver1", CK_BTVER1)
2382 .Case("btver2", CK_BTVER2)
2383 .Case("bdver1", CK_BDVER1)
2384 .Case("bdver2", CK_BDVER2)
2385 .Case("bdver3", CK_BDVER3)
2386 .Case("bdver4", CK_BDVER4)
2387 .Case("x86-64", CK_x86_64)
2388 .Case("geode", CK_Geode)
2389 .Default(CK_Generic);
2390 }
2391
Rafael Espindolaeb265472013-08-21 21:59:03 +00002392 enum FPMathKind {
2393 FP_Default,
2394 FP_SSE,
2395 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002396 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002397
Eli Friedman3fd920a2008-08-20 02:34:37 +00002398public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002399 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002400 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002401 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002402 }
Craig Topper3164f332014-03-11 03:39:26 +00002403 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002404 // X87 evaluates with 80 bits "long double" precision.
2405 return SSELevel == NoSSE ? 2 : 0;
2406 }
Craig Topper6c03a542015-10-19 04:51:35 +00002407 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2408 return llvm::makeArrayRef(BuiltinInfo,
2409 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002410 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002411 ArrayRef<const char *> getGCCRegNames() const override {
2412 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002413 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002414 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2415 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002416 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002417 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2418 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002419 }
Eric Christopherd9832702015-06-29 21:00:05 +00002420 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002421 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002422 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002423
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002424 bool validateGlobalRegisterVariable(StringRef RegName,
2425 unsigned RegSize,
2426 bool &HasSizeMismatch) const override {
2427 // esp and ebp are the only 32-bit registers the x86 backend can currently
2428 // handle.
2429 if (RegName.equals("esp") || RegName.equals("ebp")) {
2430 // Check that the register size is 32-bit.
2431 HasSizeMismatch = RegSize != 32;
2432 return true;
2433 }
2434
2435 return false;
2436 }
2437
Akira Hatanaka974131e2014-09-18 18:17:18 +00002438 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2439
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002440 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2441
Akira Hatanaka974131e2014-09-18 18:17:18 +00002442 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2443
Craig Topper3164f332014-03-11 03:39:26 +00002444 std::string convertConstraint(const char *&Constraint) const override;
2445 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002446 return "~{dirflag},~{fpsr},~{flags}";
2447 }
Craig Topper3164f332014-03-11 03:39:26 +00002448 void getTargetDefines(const LangOptions &Opts,
2449 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002450 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2451 bool Enabled);
2452 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2453 bool Enabled);
2454 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2455 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002456 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2457 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002458 setFeatureEnabledImpl(Features, Name, Enabled);
2459 }
2460 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002461 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002462 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2463 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002464 bool
2465 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2466 StringRef CPU,
2467 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002468 bool hasFeature(StringRef Feature) const override;
2469 bool handleTargetFeatures(std::vector<std::string> &Features,
2470 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002471 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002472 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2473 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002474 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002475 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002476 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002477 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002478 return "no-mmx";
2479 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002480 }
Craig Topper3164f332014-03-11 03:39:26 +00002481 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002482 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002483
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002484 // Perform any per-CPU checks necessary to determine if this CPU is
2485 // acceptable.
2486 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2487 // invalid without explaining *why*.
2488 switch (CPU) {
2489 case CK_Generic:
2490 // No processor selected!
2491 return false;
2492
2493 case CK_i386:
2494 case CK_i486:
2495 case CK_WinChipC6:
2496 case CK_WinChip2:
2497 case CK_C3:
2498 case CK_i586:
2499 case CK_Pentium:
2500 case CK_PentiumMMX:
2501 case CK_i686:
2502 case CK_PentiumPro:
2503 case CK_Pentium2:
2504 case CK_Pentium3:
2505 case CK_Pentium3M:
2506 case CK_PentiumM:
2507 case CK_Yonah:
2508 case CK_C3_2:
2509 case CK_Pentium4:
2510 case CK_Pentium4M:
2511 case CK_Prescott:
2512 case CK_K6:
2513 case CK_K6_2:
2514 case CK_K6_3:
2515 case CK_Athlon:
2516 case CK_AthlonThunderbird:
2517 case CK_Athlon4:
2518 case CK_AthlonXP:
2519 case CK_AthlonMP:
2520 case CK_Geode:
2521 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002522 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002523 return false;
2524
2525 // Fallthrough
2526 case CK_Nocona:
2527 case CK_Core2:
2528 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002529 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002530 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002531 case CK_Nehalem:
2532 case CK_Westmere:
2533 case CK_SandyBridge:
2534 case CK_IvyBridge:
2535 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002536 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002537 case CK_SkylakeClient:
2538 case CK_SkylakeServer:
2539 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002540 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002541 case CK_Athlon64:
2542 case CK_Athlon64SSE3:
2543 case CK_AthlonFX:
2544 case CK_K8:
2545 case CK_K8SSE3:
2546 case CK_Opteron:
2547 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002548 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002549 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002550 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002551 case CK_BDVER1:
2552 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002553 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002554 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002555 case CK_x86_64:
2556 return true;
2557 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002558 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002559 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002560
Craig Topper3164f332014-03-11 03:39:26 +00002561 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002562
Craig Topper3164f332014-03-11 03:39:26 +00002563 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002564 // Most of the non-ARM calling conventions are i386 conventions.
2565 switch (CC) {
2566 case CC_X86ThisCall:
2567 case CC_X86FastCall:
2568 case CC_X86StdCall:
2569 case CC_X86VectorCall:
2570 case CC_C:
2571 case CC_Swift:
2572 case CC_X86Pascal:
2573 case CC_IntelOclBicc:
2574 return CCCR_OK;
2575 default:
2576 return CCCR_Warning;
2577 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002578 }
2579
Craig Topper3164f332014-03-11 03:39:26 +00002580 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002581 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002582 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002583
2584 bool hasSjLjLowering() const override {
2585 return true;
2586 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002587};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002588
Rafael Espindolaeb265472013-08-21 21:59:03 +00002589bool X86TargetInfo::setFPMath(StringRef Name) {
2590 if (Name == "387") {
2591 FPMath = FP_387;
2592 return true;
2593 }
2594 if (Name == "sse") {
2595 FPMath = FP_SSE;
2596 return true;
2597 }
2598 return false;
2599}
2600
Eric Christopher007b0a02015-08-28 22:32:01 +00002601bool X86TargetInfo::initFeatureMap(
2602 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002603 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002604 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002605 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002606 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002607 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002608
Eric Christopher2b4a7252015-08-27 00:05:52 +00002609 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002610 case CK_Generic:
2611 case CK_i386:
2612 case CK_i486:
2613 case CK_i586:
2614 case CK_Pentium:
2615 case CK_i686:
2616 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002617 break;
2618 case CK_PentiumMMX:
2619 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002620 case CK_K6:
2621 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002622 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002623 break;
2624 case CK_Pentium3:
2625 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002626 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002627 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002628 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002629 break;
2630 case CK_PentiumM:
2631 case CK_Pentium4:
2632 case CK_Pentium4M:
2633 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002634 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002635 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002636 break;
2637 case CK_Yonah:
2638 case CK_Prescott:
2639 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002640 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002641 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002642 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002643 break;
2644 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002645 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002646 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002647 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002648 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002649 break;
2650 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002651 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002652 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002653 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002654 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002655 case CK_Cannonlake:
2656 setFeatureEnabledImpl(Features, "avx512ifma", true);
2657 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2658 setFeatureEnabledImpl(Features, "sha", true);
2659 setFeatureEnabledImpl(Features, "umip", true);
2660 // FALLTHROUGH
2661 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002662 setFeatureEnabledImpl(Features, "avx512f", true);
2663 setFeatureEnabledImpl(Features, "avx512cd", true);
2664 setFeatureEnabledImpl(Features, "avx512dq", true);
2665 setFeatureEnabledImpl(Features, "avx512bw", true);
2666 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002667 setFeatureEnabledImpl(Features, "pku", true);
2668 setFeatureEnabledImpl(Features, "pcommit", true);
2669 setFeatureEnabledImpl(Features, "clwb", true);
2670 // FALLTHROUGH
2671 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002672 setFeatureEnabledImpl(Features, "xsavec", true);
2673 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002674 setFeatureEnabledImpl(Features, "mpx", true);
2675 setFeatureEnabledImpl(Features, "sgx", true);
2676 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002677 // FALLTHROUGH
2678 case CK_Broadwell:
2679 setFeatureEnabledImpl(Features, "rdseed", true);
2680 setFeatureEnabledImpl(Features, "adx", true);
2681 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002682 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002683 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002684 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002685 setFeatureEnabledImpl(Features, "bmi", true);
2686 setFeatureEnabledImpl(Features, "bmi2", true);
2687 setFeatureEnabledImpl(Features, "rtm", true);
2688 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002689 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002690 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002691 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002692 setFeatureEnabledImpl(Features, "rdrnd", true);
2693 setFeatureEnabledImpl(Features, "f16c", true);
2694 setFeatureEnabledImpl(Features, "fsgsbase", true);
2695 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002696 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002697 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002698 setFeatureEnabledImpl(Features, "xsave", true);
2699 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002700 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002701 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002702 case CK_Silvermont:
2703 setFeatureEnabledImpl(Features, "aes", true);
2704 setFeatureEnabledImpl(Features, "pclmul", true);
2705 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002706 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002707 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002708 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002709 setFeatureEnabledImpl(Features, "cx16", true);
2710 break;
2711 case CK_KNL:
2712 setFeatureEnabledImpl(Features, "avx512f", true);
2713 setFeatureEnabledImpl(Features, "avx512cd", true);
2714 setFeatureEnabledImpl(Features, "avx512er", true);
2715 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002716 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002717 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002718 setFeatureEnabledImpl(Features, "rdseed", true);
2719 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002720 setFeatureEnabledImpl(Features, "lzcnt", true);
2721 setFeatureEnabledImpl(Features, "bmi", true);
2722 setFeatureEnabledImpl(Features, "bmi2", true);
2723 setFeatureEnabledImpl(Features, "rtm", true);
2724 setFeatureEnabledImpl(Features, "fma", true);
2725 setFeatureEnabledImpl(Features, "rdrnd", true);
2726 setFeatureEnabledImpl(Features, "f16c", true);
2727 setFeatureEnabledImpl(Features, "fsgsbase", true);
2728 setFeatureEnabledImpl(Features, "aes", true);
2729 setFeatureEnabledImpl(Features, "pclmul", true);
2730 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002731 setFeatureEnabledImpl(Features, "xsaveopt", true);
2732 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002733 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002734 break;
2735 case CK_K6_2:
2736 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002737 case CK_WinChip2:
2738 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002739 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002740 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002741 case CK_Athlon:
2742 case CK_AthlonThunderbird:
2743 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002744 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002745 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002746 case CK_Athlon4:
2747 case CK_AthlonXP:
2748 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002749 setFeatureEnabledImpl(Features, "sse", true);
2750 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002751 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002752 break;
2753 case CK_K8:
2754 case CK_Opteron:
2755 case CK_Athlon64:
2756 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002757 setFeatureEnabledImpl(Features, "sse2", true);
2758 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002759 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002760 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002761 case CK_AMDFAM10:
2762 setFeatureEnabledImpl(Features, "sse4a", true);
2763 setFeatureEnabledImpl(Features, "lzcnt", true);
2764 setFeatureEnabledImpl(Features, "popcnt", true);
2765 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002766 case CK_K8SSE3:
2767 case CK_OpteronSSE3:
2768 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002769 setFeatureEnabledImpl(Features, "sse3", true);
2770 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002771 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002772 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002773 case CK_BTVER2:
2774 setFeatureEnabledImpl(Features, "avx", true);
2775 setFeatureEnabledImpl(Features, "aes", true);
2776 setFeatureEnabledImpl(Features, "pclmul", true);
2777 setFeatureEnabledImpl(Features, "bmi", true);
2778 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002779 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002780 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002781 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002782 setFeatureEnabledImpl(Features, "ssse3", true);
2783 setFeatureEnabledImpl(Features, "sse4a", true);
2784 setFeatureEnabledImpl(Features, "lzcnt", true);
2785 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002786 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002787 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002788 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002789 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002790 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002791 case CK_BDVER4:
2792 setFeatureEnabledImpl(Features, "avx2", true);
2793 setFeatureEnabledImpl(Features, "bmi2", true);
2794 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002795 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002796 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002797 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002798 // FALLTHROUGH
2799 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002800 setFeatureEnabledImpl(Features, "bmi", true);
2801 setFeatureEnabledImpl(Features, "fma", true);
2802 setFeatureEnabledImpl(Features, "f16c", true);
2803 setFeatureEnabledImpl(Features, "tbm", true);
2804 // FALLTHROUGH
2805 case CK_BDVER1:
2806 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002807 setFeatureEnabledImpl(Features, "xop", true);
2808 setFeatureEnabledImpl(Features, "lzcnt", true);
2809 setFeatureEnabledImpl(Features, "aes", true);
2810 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002811 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002812 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002813 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002814 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002815 break;
Eli Friedman33465822011-07-08 23:31:17 +00002816 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002817 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2818 return false;
2819
2820 // Can't do this earlier because we need to be able to explicitly enable
2821 // or disable these features and the things that they depend upon.
2822
2823 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2824 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002825 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002826 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2827 FeaturesVec.end())
2828 Features["popcnt"] = true;
2829
2830 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2831 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002832 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002833 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2834 FeaturesVec.end())
2835 Features["prfchw"] = true;
2836
Eric Christophera7260af2015-10-08 20:10:18 +00002837 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2838 // then enable MMX.
2839 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002840 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002841 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2842 FeaturesVec.end())
2843 Features["mmx"] = true;
2844
Eric Christopherbbd746d2015-10-08 20:10:14 +00002845 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002846}
2847
Rafael Espindolae62e2792013-08-20 13:44:29 +00002848void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002849 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002850 if (Enabled) {
2851 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002852 case AVX512F:
2853 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002854 case AVX2:
2855 Features["avx2"] = true;
2856 case AVX:
2857 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002858 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002859 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002860 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002861 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002862 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002863 case SSSE3:
2864 Features["ssse3"] = true;
2865 case SSE3:
2866 Features["sse3"] = true;
2867 case SSE2:
2868 Features["sse2"] = true;
2869 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002870 Features["sse"] = true;
2871 case NoSSE:
2872 break;
2873 }
2874 return;
2875 }
2876
2877 switch (Level) {
2878 case NoSSE:
2879 case SSE1:
2880 Features["sse"] = false;
2881 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002882 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2883 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002884 case SSE3:
2885 Features["sse3"] = false;
2886 setXOPLevel(Features, NoXOP, false);
2887 case SSSE3:
2888 Features["ssse3"] = false;
2889 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002890 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002891 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002892 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002893 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002894 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2895 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002896 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002897 case AVX2:
2898 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002899 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002900 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002901 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00002902 Features["avx512vl"] = Features["avx512vbmi"] =
2903 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002904 }
2905}
2906
2907void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002908 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002909 if (Enabled) {
2910 switch (Level) {
2911 case AMD3DNowAthlon:
2912 Features["3dnowa"] = true;
2913 case AMD3DNow:
2914 Features["3dnow"] = true;
2915 case MMX:
2916 Features["mmx"] = true;
2917 case NoMMX3DNow:
2918 break;
2919 }
2920 return;
2921 }
2922
2923 switch (Level) {
2924 case NoMMX3DNow:
2925 case MMX:
2926 Features["mmx"] = false;
2927 case AMD3DNow:
2928 Features["3dnow"] = false;
2929 case AMD3DNowAthlon:
2930 Features["3dnowa"] = false;
2931 }
2932}
2933
2934void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002935 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002936 if (Enabled) {
2937 switch (Level) {
2938 case XOP:
2939 Features["xop"] = true;
2940 case FMA4:
2941 Features["fma4"] = true;
2942 setSSELevel(Features, AVX, true);
2943 case SSE4A:
2944 Features["sse4a"] = true;
2945 setSSELevel(Features, SSE3, true);
2946 case NoXOP:
2947 break;
2948 }
2949 return;
2950 }
2951
2952 switch (Level) {
2953 case NoXOP:
2954 case SSE4A:
2955 Features["sse4a"] = false;
2956 case FMA4:
2957 Features["fma4"] = false;
2958 case XOP:
2959 Features["xop"] = false;
2960 }
2961}
2962
Craig Topper86d79ef2013-09-17 04:51:29 +00002963void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2964 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002965 // This is a bit of a hack to deal with the sse4 target feature when used
2966 // as part of the target attribute. We handle sse4 correctly everywhere
2967 // else. See below for more information on how we handle the sse4 options.
2968 if (Name != "sse4")
2969 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002970
Craig Topper29561122013-09-19 01:13:07 +00002971 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002972 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002973 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002974 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002975 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002976 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002977 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002978 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002979 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002980 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002981 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002982 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002983 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002984 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002985 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002986 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002987 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002988 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002989 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002990 if (Enabled)
2991 setSSELevel(Features, SSE2, Enabled);
2992 } else if (Name == "pclmul") {
2993 if (Enabled)
2994 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002995 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002996 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002997 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002998 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002999 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003000 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003001 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3002 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3003 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003004 if (Enabled)
3005 setSSELevel(Features, AVX512F, Enabled);
3006 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003007 if (Enabled)
3008 setSSELevel(Features, AVX, Enabled);
3009 } else if (Name == "fma4") {
3010 setXOPLevel(Features, FMA4, Enabled);
3011 } else if (Name == "xop") {
3012 setXOPLevel(Features, XOP, Enabled);
3013 } else if (Name == "sse4a") {
3014 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003015 } else if (Name == "f16c") {
3016 if (Enabled)
3017 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003018 } else if (Name == "sha") {
3019 if (Enabled)
3020 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003021 } else if (Name == "sse4") {
3022 // We can get here via the __target__ attribute since that's not controlled
3023 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3024 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3025 // disabled.
3026 if (Enabled)
3027 setSSELevel(Features, SSE42, Enabled);
3028 else
3029 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003030 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003031 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003032 Features["xsaveopt"] = false;
3033 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003034 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003035 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003036 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003037}
3038
Eric Christopher3ff21b32013-10-16 21:26:26 +00003039/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003040/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003041bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003042 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003043 for (const auto &Feature : Features) {
3044 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003045 continue;
3046
Eric Christopher610fe112015-08-26 08:21:55 +00003047 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003048 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003049 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003050 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003051 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003052 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003053 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003054 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003055 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003056 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003057 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003058 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003059 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003060 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003061 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003062 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003063 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003064 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003065 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003066 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003067 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003068 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003069 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003070 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003071 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003072 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003073 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003074 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003075 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003076 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003077 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003078 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003079 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003080 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003081 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003082 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003083 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003084 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003085 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003086 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003087 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003088 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003089 } else if (Feature == "+avx512vbmi") {
3090 HasAVX512VBMI = true;
3091 } else if (Feature == "+avx512ifma") {
3092 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003093 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003094 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003095 } else if (Feature == "+mpx") {
3096 HasMPX = true;
3097 } else if (Feature == "+movbe") {
3098 HasMOVBE = true;
3099 } else if (Feature == "+sgx") {
3100 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003101 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003102 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003103 } else if (Feature == "+fxsr") {
3104 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003105 } else if (Feature == "+xsave") {
3106 HasXSAVE = true;
3107 } else if (Feature == "+xsaveopt") {
3108 HasXSAVEOPT = true;
3109 } else if (Feature == "+xsavec") {
3110 HasXSAVEC = true;
3111 } else if (Feature == "+xsaves") {
3112 HasXSAVES = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003113 } else if (Feature == "+pku") {
3114 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003115 } else if (Feature == "+clflushopt") {
3116 HasCLFLUSHOPT = true;
3117 } else if (Feature == "+pcommit") {
3118 HasPCOMMIT = true;
3119 } else if (Feature == "+clwb") {
3120 HasCLWB = true;
3121 } else if (Feature == "+umip") {
3122 HasUMIP = true;
3123 } else if (Feature == "+prefetchwt1") {
3124 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003125 }
3126
Benjamin Kramer27402c62012-03-05 15:10:44 +00003127 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003128 .Case("+avx512f", AVX512F)
3129 .Case("+avx2", AVX2)
3130 .Case("+avx", AVX)
3131 .Case("+sse4.2", SSE42)
3132 .Case("+sse4.1", SSE41)
3133 .Case("+ssse3", SSSE3)
3134 .Case("+sse3", SSE3)
3135 .Case("+sse2", SSE2)
3136 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003137 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003138 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003139
Eli Friedman33465822011-07-08 23:31:17 +00003140 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003141 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003142 .Case("+3dnowa", AMD3DNowAthlon)
3143 .Case("+3dnow", AMD3DNow)
3144 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003145 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003146 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003147
3148 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003149 .Case("+xop", XOP)
3150 .Case("+fma4", FMA4)
3151 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003152 .Default(NoXOP);
3153 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003154 }
Eli Friedman33465822011-07-08 23:31:17 +00003155
Rafael Espindolaeb265472013-08-21 21:59:03 +00003156 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3157 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003158 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3159 (FPMath == FP_387 && SSELevel >= SSE1)) {
3160 Diags.Report(diag::err_target_unsupported_fpmath) <<
3161 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003162 return false;
3163 }
3164
Alexey Bataev00396512015-07-02 03:40:19 +00003165 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003166 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003167 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003168}
Chris Lattnerecd49032009-03-02 22:27:17 +00003169
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003170/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3171/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003172void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003173 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003174 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003175 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003176 Builder.defineMacro("__amd64__");
3177 Builder.defineMacro("__amd64");
3178 Builder.defineMacro("__x86_64");
3179 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003180 if (getTriple().getArchName() == "x86_64h") {
3181 Builder.defineMacro("__x86_64h");
3182 Builder.defineMacro("__x86_64h__");
3183 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003184 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003185 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003186 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003187
Chris Lattnerecd49032009-03-02 22:27:17 +00003188 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003189 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3190 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003191 switch (CPU) {
3192 case CK_Generic:
3193 break;
3194 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003195 // The rest are coming from the i386 define above.
3196 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003197 break;
3198 case CK_i486:
3199 case CK_WinChipC6:
3200 case CK_WinChip2:
3201 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003202 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003203 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003204 case CK_PentiumMMX:
3205 Builder.defineMacro("__pentium_mmx__");
3206 Builder.defineMacro("__tune_pentium_mmx__");
3207 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003208 case CK_i586:
3209 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003210 defineCPUMacros(Builder, "i586");
3211 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003212 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003213 case CK_Pentium3:
3214 case CK_Pentium3M:
3215 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003216 Builder.defineMacro("__tune_pentium3__");
3217 // Fallthrough
3218 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003219 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003220 Builder.defineMacro("__tune_pentium2__");
3221 // Fallthrough
3222 case CK_PentiumPro:
3223 Builder.defineMacro("__tune_i686__");
3224 Builder.defineMacro("__tune_pentiumpro__");
3225 // Fallthrough
3226 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003227 Builder.defineMacro("__i686");
3228 Builder.defineMacro("__i686__");
3229 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3230 Builder.defineMacro("__pentiumpro");
3231 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003232 break;
3233 case CK_Pentium4:
3234 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003235 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003236 break;
3237 case CK_Yonah:
3238 case CK_Prescott:
3239 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003240 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003241 break;
3242 case CK_Core2:
3243 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003244 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003245 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003246 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003247 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003248 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003249 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003250 defineCPUMacros(Builder, "slm");
3251 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003252 case CK_Nehalem:
3253 case CK_Westmere:
3254 case CK_SandyBridge:
3255 case CK_IvyBridge:
3256 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003257 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003258 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003259 // FIXME: Historically, we defined this legacy name, it would be nice to
3260 // remove it at some point. We've never exposed fine-grained names for
3261 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003262 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003263 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003264 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003265 defineCPUMacros(Builder, "skx");
3266 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003267 case CK_Cannonlake:
3268 break;
Craig Topper449314e2013-08-20 07:09:39 +00003269 case CK_KNL:
3270 defineCPUMacros(Builder, "knl");
3271 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003272 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003273 Builder.defineMacro("__k6_2__");
3274 Builder.defineMacro("__tune_k6_2__");
3275 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003276 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003277 if (CPU != CK_K6_2) { // In case of fallthrough
3278 // FIXME: GCC may be enabling these in cases where some other k6
3279 // architecture is specified but -m3dnow is explicitly provided. The
3280 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003281 Builder.defineMacro("__k6_3__");
3282 Builder.defineMacro("__tune_k6_3__");
3283 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003284 // Fallthrough
3285 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003286 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003287 break;
3288 case CK_Athlon:
3289 case CK_AthlonThunderbird:
3290 case CK_Athlon4:
3291 case CK_AthlonXP:
3292 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003293 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003294 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003295 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003296 Builder.defineMacro("__tune_athlon_sse__");
3297 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003298 break;
3299 case CK_K8:
3300 case CK_K8SSE3:
3301 case CK_x86_64:
3302 case CK_Opteron:
3303 case CK_OpteronSSE3:
3304 case CK_Athlon64:
3305 case CK_Athlon64SSE3:
3306 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003307 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003308 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003309 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003310 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003311 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003312 case CK_BTVER1:
3313 defineCPUMacros(Builder, "btver1");
3314 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003315 case CK_BTVER2:
3316 defineCPUMacros(Builder, "btver2");
3317 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003318 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003319 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003320 break;
3321 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003322 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003323 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003324 case CK_BDVER3:
3325 defineCPUMacros(Builder, "bdver3");
3326 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003327 case CK_BDVER4:
3328 defineCPUMacros(Builder, "bdver4");
3329 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003330 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003331 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003332 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003333 }
Chris Lattner96e43572009-03-02 22:40:39 +00003334
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003335 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003336 Builder.defineMacro("__REGISTER_PREFIX__", "");
3337
Chris Lattner6df41af2009-04-19 17:32:33 +00003338 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3339 // functions in glibc header files that use FP Stack inline asm which the
3340 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003341 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003342
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003343 if (HasAES)
3344 Builder.defineMacro("__AES__");
3345
Craig Topper3f122a72012-05-31 05:18:48 +00003346 if (HasPCLMUL)
3347 Builder.defineMacro("__PCLMUL__");
3348
Craig Topper22967d42011-12-25 05:06:45 +00003349 if (HasLZCNT)
3350 Builder.defineMacro("__LZCNT__");
3351
Benjamin Kramer1e250392012-07-07 09:39:18 +00003352 if (HasRDRND)
3353 Builder.defineMacro("__RDRND__");
3354
Craig Topper8c7f2512014-11-03 06:51:41 +00003355 if (HasFSGSBASE)
3356 Builder.defineMacro("__FSGSBASE__");
3357
Craig Topper22967d42011-12-25 05:06:45 +00003358 if (HasBMI)
3359 Builder.defineMacro("__BMI__");
3360
3361 if (HasBMI2)
3362 Builder.defineMacro("__BMI2__");
3363
Craig Topper1de83482011-12-29 16:10:46 +00003364 if (HasPOPCNT)
3365 Builder.defineMacro("__POPCNT__");
3366
Michael Liao625a8752012-11-10 05:17:46 +00003367 if (HasRTM)
3368 Builder.defineMacro("__RTM__");
3369
Michael Liao74f4eaf2013-03-26 17:52:08 +00003370 if (HasPRFCHW)
3371 Builder.defineMacro("__PRFCHW__");
3372
Michael Liaoffaae352013-03-29 05:17:55 +00003373 if (HasRDSEED)
3374 Builder.defineMacro("__RDSEED__");
3375
Robert Khasanov50e6f582014-09-19 09:53:48 +00003376 if (HasADX)
3377 Builder.defineMacro("__ADX__");
3378
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003379 if (HasTBM)
3380 Builder.defineMacro("__TBM__");
3381
Rafael Espindolae62e2792013-08-20 13:44:29 +00003382 switch (XOPLevel) {
3383 case XOP:
3384 Builder.defineMacro("__XOP__");
3385 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003386 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003387 case SSE4A:
3388 Builder.defineMacro("__SSE4A__");
3389 case NoXOP:
3390 break;
3391 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003392
Craig Topperbba778b2012-06-03 21:46:30 +00003393 if (HasFMA)
3394 Builder.defineMacro("__FMA__");
3395
Manman Rena45358c2012-10-11 00:59:55 +00003396 if (HasF16C)
3397 Builder.defineMacro("__F16C__");
3398
Craig Topper679b53a2013-08-21 05:29:10 +00003399 if (HasAVX512CD)
3400 Builder.defineMacro("__AVX512CD__");
3401 if (HasAVX512ER)
3402 Builder.defineMacro("__AVX512ER__");
3403 if (HasAVX512PF)
3404 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003405 if (HasAVX512DQ)
3406 Builder.defineMacro("__AVX512DQ__");
3407 if (HasAVX512BW)
3408 Builder.defineMacro("__AVX512BW__");
3409 if (HasAVX512VL)
3410 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003411 if (HasAVX512VBMI)
3412 Builder.defineMacro("__AVX512VBMI__");
3413 if (HasAVX512IFMA)
3414 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003415
Ben Langmuir58078d02013-09-19 13:22:04 +00003416 if (HasSHA)
3417 Builder.defineMacro("__SHA__");
3418
Craig Toppere33f51f2015-10-16 06:22:36 +00003419 if (HasFXSR)
3420 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003421 if (HasXSAVE)
3422 Builder.defineMacro("__XSAVE__");
3423 if (HasXSAVEOPT)
3424 Builder.defineMacro("__XSAVEOPT__");
3425 if (HasXSAVEC)
3426 Builder.defineMacro("__XSAVEC__");
3427 if (HasXSAVES)
3428 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003429 if (HasPKU)
3430 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003431 if (HasCX16)
3432 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3433
Chris Lattner96e43572009-03-02 22:40:39 +00003434 // Each case falls through to the previous one here.
3435 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003436 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003437 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003438 case AVX2:
3439 Builder.defineMacro("__AVX2__");
3440 case AVX:
3441 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003442 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003443 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003444 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003445 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003446 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003447 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003448 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003449 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003450 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003451 Builder.defineMacro("__SSE2__");
3452 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003453 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003454 Builder.defineMacro("__SSE__");
3455 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003456 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003457 break;
3458 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003459
Derek Schuffc7dd7222012-10-11 15:52:22 +00003460 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003461 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003462 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003463 case AVX2:
3464 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003465 case SSE42:
3466 case SSE41:
3467 case SSSE3:
3468 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003469 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003470 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003471 break;
3472 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003473 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003474 break;
3475 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003476 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003477 }
3478 }
3479
Anders Carlssone437c682010-01-27 03:47:49 +00003480 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003481 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003482 case AMD3DNowAthlon:
3483 Builder.defineMacro("__3dNOW_A__");
3484 case AMD3DNow:
3485 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003486 case MMX:
3487 Builder.defineMacro("__MMX__");
3488 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003489 break;
3490 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003491
3492 if (CPU >= CK_i486) {
3493 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3494 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3495 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3496 }
3497 if (CPU >= CK_i586)
3498 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003499}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003500
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003501bool X86TargetInfo::hasFeature(StringRef Feature) const {
3502 return llvm::StringSwitch<bool>(Feature)
3503 .Case("aes", HasAES)
3504 .Case("avx", SSELevel >= AVX)
3505 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003506 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003507 .Case("avx512cd", HasAVX512CD)
3508 .Case("avx512er", HasAVX512ER)
3509 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003510 .Case("avx512dq", HasAVX512DQ)
3511 .Case("avx512bw", HasAVX512BW)
3512 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003513 .Case("avx512vbmi", HasAVX512VBMI)
3514 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003515 .Case("bmi", HasBMI)
3516 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003517 .Case("clflushopt", HasCLFLUSHOPT)
3518 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003519 .Case("cx16", HasCX16)
3520 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003521 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003522 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003523 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003524 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003525 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003526 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3527 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3528 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003529 .Case("movbe", HasMOVBE)
3530 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003531 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003532 .Case("pcommit", HasPCOMMIT)
3533 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003534 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003535 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003536 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003537 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003538 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003539 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003540 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003541 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003542 .Case("sse", SSELevel >= SSE1)
3543 .Case("sse2", SSELevel >= SSE2)
3544 .Case("sse3", SSELevel >= SSE3)
3545 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003546 .Case("sse4.1", SSELevel >= SSE41)
3547 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003548 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003549 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003550 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003551 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003552 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3553 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003554 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003555 .Case("xsave", HasXSAVE)
3556 .Case("xsavec", HasXSAVEC)
3557 .Case("xsaves", HasXSAVES)
3558 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003559 .Default(false);
3560}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003561
Eric Christopherd9832702015-06-29 21:00:05 +00003562// We can't use a generic validation scheme for the features accepted here
3563// versus subtarget features accepted in the target attribute because the
3564// bitfield structure that's initialized in the runtime only supports the
3565// below currently rather than the full range of subtarget features. (See
3566// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3567bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3568 return llvm::StringSwitch<bool>(FeatureStr)
3569 .Case("cmov", true)
3570 .Case("mmx", true)
3571 .Case("popcnt", true)
3572 .Case("sse", true)
3573 .Case("sse2", true)
3574 .Case("sse3", true)
3575 .Case("sse4.1", true)
3576 .Case("sse4.2", true)
3577 .Case("avx", true)
3578 .Case("avx2", true)
3579 .Case("sse4a", true)
3580 .Case("fma4", true)
3581 .Case("xop", true)
3582 .Case("fma", true)
3583 .Case("avx512f", true)
3584 .Case("bmi", true)
3585 .Case("bmi2", true)
3586 .Default(false);
3587}
3588
Eli Friedman3fd920a2008-08-20 02:34:37 +00003589bool
Anders Carlsson58436352009-02-28 17:11:49 +00003590X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003591 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003592 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003593 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003594 // Constant constraints.
3595 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3596 // instructions.
3597 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3598 // x86_64 instructions.
3599 case 's':
3600 Info.setRequiresImmediate();
3601 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003602 case 'I':
3603 Info.setRequiresImmediate(0, 31);
3604 return true;
3605 case 'J':
3606 Info.setRequiresImmediate(0, 63);
3607 return true;
3608 case 'K':
3609 Info.setRequiresImmediate(-128, 127);
3610 return true;
3611 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003612 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003613 return true;
3614 case 'M':
3615 Info.setRequiresImmediate(0, 3);
3616 return true;
3617 case 'N':
3618 Info.setRequiresImmediate(0, 255);
3619 return true;
3620 case 'O':
3621 Info.setRequiresImmediate(0, 127);
3622 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003623 // Register constraints.
3624 case 'Y': // 'Y' is the first character for several 2-character constraints.
3625 // Shift the pointer to the second character of the constraint.
3626 Name++;
3627 switch (*Name) {
3628 default:
3629 return false;
3630 case '0': // First SSE register.
3631 case 't': // Any SSE register, when SSE2 is enabled.
3632 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3633 case 'm': // Any MMX register, when inter-unit moves enabled.
3634 Info.setAllowsRegister();
3635 return true;
3636 }
3637 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003638 // Constraint 'f' cannot be used for output operands.
3639 if (Info.ConstraintStr[0] == '=')
3640 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003641 Info.setAllowsRegister();
3642 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003643 case 'a': // eax.
3644 case 'b': // ebx.
3645 case 'c': // ecx.
3646 case 'd': // edx.
3647 case 'S': // esi.
3648 case 'D': // edi.
3649 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003650 case 't': // Top of floating point stack.
3651 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003652 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003653 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003654 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003655 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003656 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3657 case 'l': // "Index" registers: any general register that can be used as an
3658 // index in a base+index memory access.
3659 Info.setAllowsRegister();
3660 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003661 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003662 case 'C': // SSE floating point constant.
3663 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003664 return true;
3665 }
3666}
3667
Akira Hatanaka974131e2014-09-18 18:17:18 +00003668bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3669 unsigned Size) const {
3670 // Strip off constraint modifiers.
3671 while (Constraint[0] == '=' ||
3672 Constraint[0] == '+' ||
3673 Constraint[0] == '&')
3674 Constraint = Constraint.substr(1);
3675
3676 return validateOperandSize(Constraint, Size);
3677}
3678
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003679bool X86TargetInfo::validateInputSize(StringRef Constraint,
3680 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003681 return validateOperandSize(Constraint, Size);
3682}
3683
3684bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3685 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003686 switch (Constraint[0]) {
3687 default: break;
3688 case 'y':
3689 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003690 case 'f':
3691 case 't':
3692 case 'u':
3693 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003694 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003695 if (SSELevel >= AVX512F)
3696 // 512-bit zmm registers can be used if target supports AVX512F.
3697 return Size <= 512U;
3698 else if (SSELevel >= AVX)
3699 // 256-bit ymm registers can be used if target supports AVX.
3700 return Size <= 256U;
3701 return Size <= 128U;
3702 case 'Y':
3703 // 'Y' is the first character for several 2-character constraints.
3704 switch (Constraint[1]) {
3705 default: break;
3706 case 'm':
3707 // 'Ym' is synonymous with 'y'.
3708 return Size <= 64;
3709 case 'i':
3710 case 't':
3711 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3712 if (SSELevel >= AVX512F)
3713 return Size <= 512U;
3714 else if (SSELevel >= AVX)
3715 return Size <= 256U;
3716 return SSELevel >= SSE2 && Size <= 128U;
3717 }
3718
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003719 }
3720
3721 return true;
3722}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003723
Eli Friedman3fd920a2008-08-20 02:34:37 +00003724std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003725X86TargetInfo::convertConstraint(const char *&Constraint) const {
3726 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003727 case 'a': return std::string("{ax}");
3728 case 'b': return std::string("{bx}");
3729 case 'c': return std::string("{cx}");
3730 case 'd': return std::string("{dx}");
3731 case 'S': return std::string("{si}");
3732 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003733 case 'p': // address
3734 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003735 case 't': // top of floating point stack.
3736 return std::string("{st}");
3737 case 'u': // second from top of floating point stack.
3738 return std::string("{st(1)}"); // second from top of floating point stack.
3739 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003740 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003741 }
3742}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003743
Eli Friedman3fd920a2008-08-20 02:34:37 +00003744// X86-32 generic target
3745class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003746public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003747 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003748 DoubleAlign = LongLongAlign = 32;
3749 LongDoubleWidth = 96;
3750 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003751 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003752 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003753 SizeType = UnsignedInt;
3754 PtrDiffType = SignedInt;
3755 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003756 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003757
3758 // Use fpret for all types.
3759 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3760 (1 << TargetInfo::Double) |
3761 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003762
3763 // x86-32 has atomics up to 8 bytes
3764 // FIXME: Check that we actually have cmpxchg8b before setting
3765 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3766 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003767 }
Craig Topper3164f332014-03-11 03:39:26 +00003768 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003769 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003770 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003771
Craig Topper3164f332014-03-11 03:39:26 +00003772 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003773 if (RegNo == 0) return 0;
3774 if (RegNo == 1) return 2;
3775 return -1;
3776 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003777 bool validateOperandSize(StringRef Constraint,
3778 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003779 switch (Constraint[0]) {
3780 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003781 case 'R':
3782 case 'q':
3783 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003784 case 'a':
3785 case 'b':
3786 case 'c':
3787 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003788 case 'S':
3789 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003790 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003791 case 'A':
3792 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003793 }
3794
Akira Hatanaka974131e2014-09-18 18:17:18 +00003795 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003796 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003797};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003798
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003799class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3800public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003801 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3802 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003803
Craig Topper3164f332014-03-11 03:39:26 +00003804 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003805 unsigned Major, Minor, Micro;
3806 getTriple().getOSVersion(Major, Minor, Micro);
3807 // New NetBSD uses the default rounding mode.
3808 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3809 return X86_32TargetInfo::getFloatEvalMethod();
3810 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003811 return 1;
3812 }
3813};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003814
Eli Friedmane3aa4542009-07-05 18:47:56 +00003815class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3816public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003817 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3818 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003819 SizeType = UnsignedLong;
3820 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003821 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003822 }
3823};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003824
Eli Friedman9fa28852012-08-08 23:57:20 +00003825class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3826public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003827 BitrigI386TargetInfo(const llvm::Triple &Triple)
3828 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003829 SizeType = UnsignedLong;
3830 IntPtrType = SignedLong;
3831 PtrDiffType = SignedLong;
3832 }
3833};
Eli Friedman9fa28852012-08-08 23:57:20 +00003834
Torok Edwinb2b37c62009-06-30 17:10:35 +00003835class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003836public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003837 DarwinI386TargetInfo(const llvm::Triple &Triple)
3838 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003839 LongDoubleWidth = 128;
3840 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003841 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00003842 MaxVectorAlign = 256;
3843 // The watchOS simulator uses the builtin bool type for Objective-C.
3844 llvm::Triple T = llvm::Triple(Triple);
3845 if (T.isWatchOS())
3846 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003847 SizeType = UnsignedLong;
3848 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003849 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003850 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003851 }
3852
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003853 bool handleTargetFeatures(std::vector<std::string> &Features,
3854 DiagnosticsEngine &Diags) override {
3855 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3856 Diags))
3857 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003858 // We now know the features we have: we can decide how to align vectors.
3859 MaxVectorAlign =
3860 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003861 return true;
3862 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003863};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003864
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003865// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003866class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003867public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003868 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3869 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003870 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003871 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003872 bool IsWinCOFF =
3873 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003874 DataLayoutString = IsWinCOFF
3875 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3876 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003877 }
Craig Topper3164f332014-03-11 03:39:26 +00003878 void getTargetDefines(const LangOptions &Opts,
3879 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003880 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3881 }
3882};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003883
3884// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003885class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003886public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003887 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003888 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003889 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003890 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3891 }
Craig Topper3164f332014-03-11 03:39:26 +00003892 void getTargetDefines(const LangOptions &Opts,
3893 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003894 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3895 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3896 // The value of the following reflects processor type.
3897 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3898 // We lost the original triple, so we use the default.
3899 Builder.defineMacro("_M_IX86", "600");
3900 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003901};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003902
David Majnemerae1ed0e2015-05-28 04:36:18 +00003903static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003904 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3905 // supports __declspec natively under -fms-extensions, but we define a no-op
3906 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003907 if (Opts.MicrosoftExt)
3908 Builder.defineMacro("__declspec", "__declspec");
3909 else
3910 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3911
3912 if (!Opts.MicrosoftExt) {
3913 // Provide macros for all the calling convention keywords. Provide both
3914 // single and double underscore prefixed variants. These are available on
3915 // x64 as well as x86, even though they have no effect.
3916 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3917 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003918 std::string GCCSpelling = "__attribute__((__";
3919 GCCSpelling += CC;
3920 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003921 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3922 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3923 }
3924 }
3925}
3926
David Majnemerae1ed0e2015-05-28 04:36:18 +00003927static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3928 Builder.defineMacro("__MSVCRT__");
3929 Builder.defineMacro("__MINGW32__");
3930 addCygMingDefines(Opts, Builder);
3931}
3932
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003933// x86-32 MinGW target
3934class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3935public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003936 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003937 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003938 void getTargetDefines(const LangOptions &Opts,
3939 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003940 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003941 DefineStd(Builder, "WIN32", Opts);
3942 DefineStd(Builder, "WINNT", Opts);
3943 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003944 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003945 }
3946};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003947
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003948// x86-32 Cygwin target
3949class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3950public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003951 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3952 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003953 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003954 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003955 DataLayoutString = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003956 }
Craig Topper3164f332014-03-11 03:39:26 +00003957 void getTargetDefines(const LangOptions &Opts,
3958 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003959 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003960 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003961 Builder.defineMacro("__CYGWIN__");
3962 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003963 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003964 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003965 if (Opts.CPlusPlus)
3966 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003967 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003968};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003969
Chris Lattnerb986aba2010-04-11 19:29:39 +00003970// x86-32 Haiku target
3971class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3972public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003973 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003974 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003975 IntPtrType = SignedLong;
3976 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003977 ProcessIDType = SignedLong;
James Y Knighta3518ad2016-01-27 01:04:51 +00003978 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003979 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003980 }
Craig Topper3164f332014-03-11 03:39:26 +00003981 void getTargetDefines(const LangOptions &Opts,
3982 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003983 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3984 Builder.defineMacro("__INTEL__");
3985 Builder.defineMacro("__HAIKU__");
3986 }
3987};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003988
Alexey Bataevc99b0492015-11-25 09:24:26 +00003989// X86-32 MCU target
3990class MCUX86_32TargetInfo : public X86_32TargetInfo {
3991public:
3992 MCUX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3993 LongDoubleWidth = 64;
3994 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Andrey Turetskiy8170bab2016-02-10 12:56:10 +00003995 DataLayoutString =
3996 "e-m:e-p:32:32-i64:32-f64:32-f128:32-n8:16:32-a:0:32-S32";
Andrey Bokhanko4f8867f2016-01-14 10:59:36 +00003997 UserLabelPrefix = "";
Andrey Bokhanko6e34c1d2016-02-04 11:54:45 +00003998 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00003999 }
4000
4001 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4002 // On MCU we support only C calling convention.
4003 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4004 }
4005
4006 void getTargetDefines(const LangOptions &Opts,
4007 MacroBuilder &Builder) const override {
4008 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4009 Builder.defineMacro("__iamcu");
4010 Builder.defineMacro("__iamcu__");
4011 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004012
4013 bool allowsLargerPreferedTypeAlignment() const override {
4014 return false;
4015 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004016};
4017
Douglas Gregor9fabd852011-07-01 22:41:14 +00004018// RTEMS Target
4019template<typename Target>
4020class RTEMSTargetInfo : public OSTargetInfo<Target> {
4021protected:
Craig Topper3164f332014-03-11 03:39:26 +00004022 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4023 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004024 // RTEMS defines; list based off of gcc output
4025
Douglas Gregor9fabd852011-07-01 22:41:14 +00004026 Builder.defineMacro("__rtems__");
4027 Builder.defineMacro("__ELF__");
4028 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004029
Douglas Gregor9fabd852011-07-01 22:41:14 +00004030public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004031 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +00004032 this->UserLabelPrefix = "";
4033
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004034 switch (Triple.getArch()) {
4035 default:
4036 case llvm::Triple::x86:
4037 // this->MCountName = ".mcount";
4038 break;
4039 case llvm::Triple::mips:
4040 case llvm::Triple::mipsel:
4041 case llvm::Triple::ppc:
4042 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004043 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004044 // this->MCountName = "_mcount";
4045 break;
4046 case llvm::Triple::arm:
4047 // this->MCountName = "__mcount";
4048 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004049 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004050 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004051};
4052
Douglas Gregor9fabd852011-07-01 22:41:14 +00004053// x86-32 RTEMS target
4054class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4055public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004056 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004057 SizeType = UnsignedLong;
4058 IntPtrType = SignedLong;
4059 PtrDiffType = SignedLong;
James Y Knighta3518ad2016-01-27 01:04:51 +00004060 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00004061 }
Craig Topper3164f332014-03-11 03:39:26 +00004062 void getTargetDefines(const LangOptions &Opts,
4063 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004064 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4065 Builder.defineMacro("__INTEL__");
4066 Builder.defineMacro("__rtems__");
4067 }
4068};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004069
Eli Friedman3fd920a2008-08-20 02:34:37 +00004070// x86-64 generic target
4071class X86_64TargetInfo : public X86TargetInfo {
4072public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004073 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00004074 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004075 bool IsWinCOFF =
4076 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004077 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004078 LongDoubleWidth = 128;
4079 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004080 LargeArrayMinWidth = 128;
4081 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004082 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004083 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4084 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4085 IntPtrType = IsX32 ? SignedInt : SignedLong;
4086 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004087 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004088 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004089
Eric Christopher917e9522014-11-18 22:36:15 +00004090 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00004091 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4092 : IsWinCOFF
4093 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4094 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004095
4096 // Use fpret only for long double.
4097 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004098
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004099 // Use fp2ret for _Complex long double.
4100 ComplexLongDoubleUsesFP2Ret = true;
4101
Charles Davisc7d5c942015-09-17 20:55:33 +00004102 // Make __builtin_ms_va_list available.
4103 HasBuiltinMSVaList = true;
4104
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004105 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004106 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004107 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004108 }
Craig Topper3164f332014-03-11 03:39:26 +00004109 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004110 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004111 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004112
Craig Topper3164f332014-03-11 03:39:26 +00004113 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004114 if (RegNo == 0) return 0;
4115 if (RegNo == 1) return 1;
4116 return -1;
4117 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004118
Craig Topper3164f332014-03-11 03:39:26 +00004119 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004120 switch (CC) {
4121 case CC_C:
4122 case CC_Swift:
4123 case CC_X86VectorCall:
4124 case CC_IntelOclBicc:
4125 case CC_X86_64Win64:
4126 return CCCR_OK;
4127 default:
4128 return CCCR_Warning;
4129 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004130 }
4131
Craig Topper3164f332014-03-11 03:39:26 +00004132 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004133 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004134 }
4135
Pavel Chupinfd223e12014-08-04 12:39:43 +00004136 // for x32 we need it here explicitly
4137 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004138 unsigned getUnwindWordWidth() const override { return 64; }
4139 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004140
4141 bool validateGlobalRegisterVariable(StringRef RegName,
4142 unsigned RegSize,
4143 bool &HasSizeMismatch) const override {
4144 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4145 // handle.
4146 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4147 // Check that the register size is 64-bit.
4148 HasSizeMismatch = RegSize != 64;
4149 return true;
4150 }
4151
4152 // Check if the register is a 32-bit register the backend can handle.
4153 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4154 HasSizeMismatch);
4155 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004156};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004157
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004158// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004159class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004160public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004161 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
4162 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004163 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004164 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004165 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004166 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004167 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004168 SizeType = UnsignedLongLong;
4169 PtrDiffType = SignedLongLong;
4170 IntPtrType = SignedLongLong;
James Y Knighta3518ad2016-01-27 01:04:51 +00004171 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004172 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004173
Craig Topper3164f332014-03-11 03:39:26 +00004174 void getTargetDefines(const LangOptions &Opts,
4175 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004176 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004177 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004178 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004179
Craig Topper3164f332014-03-11 03:39:26 +00004180 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004181 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004182 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004183
Craig Topper3164f332014-03-11 03:39:26 +00004184 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004185 switch (CC) {
4186 case CC_X86StdCall:
4187 case CC_X86ThisCall:
4188 case CC_X86FastCall:
4189 return CCCR_Ignore;
4190 case CC_C:
4191 case CC_X86VectorCall:
4192 case CC_IntelOclBicc:
4193 case CC_X86_64SysV:
4194 return CCCR_OK;
4195 default:
4196 return CCCR_Warning;
4197 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004198 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004199};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004200
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004201// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004202class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004203public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004204 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004205 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00004206 LongDoubleWidth = LongDoubleAlign = 64;
4207 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004208 }
Craig Topper3164f332014-03-11 03:39:26 +00004209 void getTargetDefines(const LangOptions &Opts,
4210 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004211 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4212 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004213 Builder.defineMacro("_M_X64", "100");
4214 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004215 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004216};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004217
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004218// x86-64 MinGW target
4219class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4220public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004221 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Reid Kleckner11a17192015-10-28 22:29:52 +00004222 : WindowsX86_64TargetInfo(Triple) {
4223 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4224 // with x86 FP ops. Weird.
4225 LongDoubleWidth = LongDoubleAlign = 128;
4226 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4227 }
4228
Craig Topper3164f332014-03-11 03:39:26 +00004229 void getTargetDefines(const LangOptions &Opts,
4230 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004231 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004232 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004233 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004234 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004235
4236 // GCC defines this macro when it is using __gxx_personality_seh0.
4237 if (!Opts.SjLjExceptions)
4238 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004239 }
4240};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004241
Yaron Kerend030d112015-07-22 17:38:19 +00004242// x86-64 Cygwin target
4243class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4244public:
4245 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4246 : X86_64TargetInfo(Triple) {
4247 TLSSupported = false;
4248 WCharType = UnsignedShort;
Saleem Abdulrasool16fcf0a2016-02-26 16:34:01 +00004249 UserLabelPrefix = "";
Yaron Kerend030d112015-07-22 17:38:19 +00004250 }
4251 void getTargetDefines(const LangOptions &Opts,
4252 MacroBuilder &Builder) const override {
4253 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4254 Builder.defineMacro("__x86_64__");
4255 Builder.defineMacro("__CYGWIN__");
4256 Builder.defineMacro("__CYGWIN64__");
4257 addCygMingDefines(Opts, Builder);
4258 DefineStd(Builder, "unix", Opts);
4259 if (Opts.CPlusPlus)
4260 Builder.defineMacro("_GNU_SOURCE");
4261
4262 // GCC defines this macro when it is using __gxx_personality_seh0.
4263 if (!Opts.SjLjExceptions)
4264 Builder.defineMacro("__SEH__");
4265 }
4266};
4267
Eli Friedman2857ccb2009-07-01 03:36:11 +00004268class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4269public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004270 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4271 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004272 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004273 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4274 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004275 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004276 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004277 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004278 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004279
4280 bool handleTargetFeatures(std::vector<std::string> &Features,
4281 DiagnosticsEngine &Diags) override {
4282 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4283 Diags))
4284 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004285 // We now know the features we have: we can decide how to align vectors.
4286 MaxVectorAlign =
4287 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004288 return true;
4289 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004290};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004291
Eli Friedman245f2292009-07-05 22:31:18 +00004292class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4293public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004294 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4295 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004296 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004297 Int64Type = SignedLongLong;
4298 }
4299};
Eli Friedman245f2292009-07-05 22:31:18 +00004300
Eli Friedman9fa28852012-08-08 23:57:20 +00004301class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4302public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004303 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4304 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4305 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004306 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004307 }
4308};
Tim Northover9bb857a2013-01-31 12:13:10 +00004309
Eli Friedmanf05b7722008-08-20 07:44:10 +00004310class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004311 // Possible FPU choices.
4312 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004313 VFP2FPU = (1 << 0),
4314 VFP3FPU = (1 << 1),
4315 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004316 NeonFPU = (1 << 3),
4317 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004318 };
4319
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004320 // Possible HWDiv features.
4321 enum HWDivMode {
4322 HWDivThumb = (1 << 0),
4323 HWDivARM = (1 << 1)
4324 };
4325
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004326 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004327 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004328 }
4329
4330 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4331 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004332
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004333 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004334
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004335 StringRef CPUProfile;
4336 StringRef CPUAttr;
4337
Rafael Espindolaeb265472013-08-21 21:59:03 +00004338 enum {
4339 FP_Default,
4340 FP_VFP,
4341 FP_Neon
4342 } FPMath;
4343
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004344 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004345 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004346 unsigned ArchProfile;
4347 unsigned ArchVersion;
4348
Bernard Ogdenda13af32013-10-24 18:32:51 +00004349 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004350
Logan Chien57086ce2012-10-10 06:56:20 +00004351 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004352 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004353
4354 // Initialized via features.
4355 unsigned SoftFloat : 1;
4356 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004357
Bernard Ogden18b57012013-10-29 09:47:51 +00004358 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004359 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004360 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004361 unsigned Unaligned : 1;
4362
4363 enum {
4364 LDREX_B = (1 << 0), /// byte (8-bit)
4365 LDREX_H = (1 << 1), /// half (16-bit)
4366 LDREX_W = (1 << 2), /// word (32-bit)
4367 LDREX_D = (1 << 3), /// double (64-bit)
4368 };
4369
4370 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004371
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004372 // ACLE 6.5.1 Hardware floating point
4373 enum {
4374 HW_FP_HP = (1 << 1), /// half (16-bit)
4375 HW_FP_SP = (1 << 2), /// single (32-bit)
4376 HW_FP_DP = (1 << 3), /// double (64-bit)
4377 };
4378 uint32_t HW_FP;
4379
Chris Lattner5cc15e02010-03-03 19:03:45 +00004380 static const Builtin::Info BuiltinInfo[];
4381
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004382 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004383 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004384
4385 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004386 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004387
Renato Golin9ba39232015-02-27 16:35:48 +00004388 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4389 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4390 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004391 SizeType = UnsignedLong;
4392 else
4393 SizeType = UnsignedInt;
4394
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004395 switch (T.getOS()) {
4396 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004397 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004398 break;
4399 case llvm::Triple::Win32:
4400 WCharType = UnsignedShort;
4401 break;
4402 case llvm::Triple::Linux:
4403 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004404 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4405 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004406 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004407 }
4408
4409 UseBitFieldTypeAlignment = true;
4410
4411 ZeroLengthBitfieldBoundary = 0;
4412
Tim Northover147cd2f2014-10-14 22:12:21 +00004413 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4414 // so set preferred for small types to 32.
4415 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004416 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004417 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4418 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4419 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004420 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004421 DataLayoutString = "e"
4422 "-m:w"
4423 "-p:32:32"
4424 "-i64:64"
4425 "-v128:64:128"
4426 "-a:0:32"
4427 "-n32"
4428 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004429 } else if (T.isOSNaCl()) {
4430 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004431 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004432 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004433 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004434 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4435 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004436 }
4437
4438 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004439 }
4440
Tim Northover5627d392015-10-30 16:30:45 +00004441 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004442 const llvm::Triple &T = getTriple();
4443
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004444 IsAAPCS = false;
4445
Tim Northover5627d392015-10-30 16:30:45 +00004446 if (IsAAPCS16)
4447 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4448 else
4449 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004450
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004451 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004452 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004453 SizeType = UnsignedInt;
4454 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004455 SizeType = UnsignedLong;
4456
4457 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4458 WCharType = SignedInt;
4459
4460 // Do not respect the alignment of bit-field types when laying out
4461 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4462 UseBitFieldTypeAlignment = false;
4463
4464 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4465 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4466 /// gcc.
4467 ZeroLengthBitfieldBoundary = 32;
4468
Tim Northover5627d392015-10-30 16:30:45 +00004469 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4470 assert(!BigEndian && "AAPCS16 does not support big-endian");
4471 DataLayoutString = "e-m:o-p:32:32-i64:64-a:0:32-n32-S128";
4472 } else if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004473 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004474 BigEndian
4475 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4476 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4477 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004478 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004479 BigEndian
4480 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4481 : "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 +00004482
4483 // FIXME: Override "preferred align" for double and long long.
4484 }
4485
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004486 void setArchInfo() {
4487 StringRef ArchName = getTriple().getArchName();
4488
Renato Goline84b0002015-10-08 16:43:26 +00004489 ArchISA = llvm::ARM::parseArchISA(ArchName);
4490 CPU = llvm::ARM::getDefaultCPU(ArchName);
4491 unsigned AK = llvm::ARM::parseArch(ArchName);
4492 if (AK != llvm::ARM::AK_INVALID)
4493 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004494 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004495 }
4496
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004497 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004498 StringRef SubArch;
4499
4500 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004501 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004502 SubArch = llvm::ARM::getSubArch(ArchKind);
4503 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4504 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004505
4506 // cache CPU related strings
4507 CPUAttr = getCPUAttr();
4508 CPUProfile = getCPUProfile();
4509 }
4510
4511 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004512 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004513 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004514 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004515 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4516 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004517 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004518 if (ArchProfile == llvm::ARM::PK_M) {
4519 MaxAtomicPromoteWidth = 32;
4520 if (ShouldUseInlineAtomic)
4521 MaxAtomicInlineWidth = 32;
4522 }
4523 else {
4524 MaxAtomicPromoteWidth = 64;
4525 if (ShouldUseInlineAtomic)
4526 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004527 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004528 }
4529
4530 bool isThumb() const {
4531 return (ArchISA == llvm::ARM::IK_THUMB);
4532 }
4533
4534 bool supportsThumb() const {
4535 return CPUAttr.count('T') || ArchVersion >= 6;
4536 }
4537
4538 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004539 return CPUAttr.equals("6T2") ||
4540 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004541 }
4542
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004543 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004544 // For most sub-arches, the build attribute CPU name is enough.
4545 // For Cortex variants, it's slightly different.
4546 switch(ArchKind) {
4547 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004548 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004549 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004550 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004551 case llvm::ARM::AK_ARMV7S:
4552 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004553 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004554 return "7A";
4555 case llvm::ARM::AK_ARMV7R:
4556 return "7R";
4557 case llvm::ARM::AK_ARMV7M:
4558 return "7M";
4559 case llvm::ARM::AK_ARMV7EM:
4560 return "7EM";
4561 case llvm::ARM::AK_ARMV8A:
4562 return "8A";
4563 case llvm::ARM::AK_ARMV8_1A:
4564 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004565 case llvm::ARM::AK_ARMV8_2A:
4566 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004567 case llvm::ARM::AK_ARMV8MBaseline:
4568 return "8M_BASE";
4569 case llvm::ARM::AK_ARMV8MMainline:
4570 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004571 }
4572 }
4573
4574 StringRef getCPUProfile() const {
4575 switch(ArchProfile) {
4576 case llvm::ARM::PK_A:
4577 return "A";
4578 case llvm::ARM::PK_R:
4579 return "R";
4580 case llvm::ARM::PK_M:
4581 return "M";
4582 default:
4583 return "";
4584 }
4585 }
4586
Chris Lattner17df24e2008-04-21 18:56:49 +00004587public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004588 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004589 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004590 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004591 BigEndian = IsBigEndian;
4592
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004593 switch (getTriple().getOS()) {
4594 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004595 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004596 break;
4597 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004598 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004599 break;
4600 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004601
Renato Goline84b0002015-10-08 16:43:26 +00004602 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004603 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004604
Chris Lattner1a8f3942010-04-23 16:29:58 +00004605 // {} in inline assembly are neon specifiers, not assembly variant
4606 // specifiers.
4607 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004608
Eric Christopher0e261882014-12-05 01:06:59 +00004609 // FIXME: This duplicates code from the driver that sets the -target-abi
4610 // option - this code is used if -target-abi isn't passed and should
4611 // be unified in some way.
4612 if (Triple.isOSBinFormatMachO()) {
4613 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4614 // the frontend matches that.
4615 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4616 Triple.getOS() == llvm::Triple::UnknownOS ||
4617 StringRef(CPU).startswith("cortex-m")) {
4618 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004619 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004620 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004621 } else {
4622 setABI("apcs-gnu");
4623 }
4624 } else if (Triple.isOSWindows()) {
4625 // FIXME: this is invalid for WindowsCE
4626 setABI("aapcs");
4627 } else {
4628 // Select the default based on the platform.
4629 switch (Triple.getEnvironment()) {
4630 case llvm::Triple::Android:
4631 case llvm::Triple::GNUEABI:
4632 case llvm::Triple::GNUEABIHF:
4633 setABI("aapcs-linux");
4634 break;
4635 case llvm::Triple::EABIHF:
4636 case llvm::Triple::EABI:
4637 setABI("aapcs");
4638 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004639 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004640 setABI("apcs-gnu");
4641 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004642 default:
4643 if (Triple.getOS() == llvm::Triple::NetBSD)
4644 setABI("apcs-gnu");
4645 else
4646 setABI("aapcs");
4647 break;
4648 }
4649 }
John McCall86353412010-08-21 22:46:04 +00004650
4651 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004652 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004653
Renato Golin15b86152015-07-03 16:41:13 +00004654 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004655 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004656
James Molloya7139222012-03-12 09:14:10 +00004657 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004658 // the alignment of the zero-length bitfield is greater than the member
4659 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004660 // zero length bitfield.
4661 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004662 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004663
Alp Toker4925ba72014-06-07 23:30:42 +00004664 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004665
Craig Topper3164f332014-03-11 03:39:26 +00004666 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004667 ABI = Name;
4668
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004669 // The defaults (above) are for AAPCS, check if we need to change them.
4670 //
4671 // FIXME: We need support for -meabi... we could just mangle it into the
4672 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004673 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004674 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004675 return true;
4676 }
4677 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4678 setABIAAPCS();
4679 return true;
4680 }
4681 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004682 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004683
Renato Golinf5c4dec2015-05-27 13:33:00 +00004684 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004685 bool
4686 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4687 StringRef CPU,
4688 const std::vector<std::string> &FeaturesVec) const override {
4689
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004690 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004691 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004692
4693 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004694 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004695 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4696
4697 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004698 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004699 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4700
4701 for (const char *Feature : TargetFeatures)
4702 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004703 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004704
Eric Christopher007b0a02015-08-28 22:32:01 +00004705 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004706 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004707
Craig Topper3164f332014-03-11 03:39:26 +00004708 bool handleTargetFeatures(std::vector<std::string> &Features,
4709 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004710 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004711 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004712 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004713 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004714 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004715 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004716 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004717
Ranjeet Singhac08e532015-06-24 23:39:25 +00004718 // This does not diagnose illegal cases like having both
4719 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4720 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004721 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004722 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004723 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004724 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004725 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004726 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004727 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004728 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004729 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004730 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004731 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004732 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004733 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004734 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004735 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004736 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004737 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004738 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004739 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004740 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004741 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004742 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004743 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004744 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004745 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004746 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004747 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004748 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004749 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004750 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004751 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004752 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004753 } else if (Feature == "+strict-align") {
4754 Unaligned = 0;
4755 } else if (Feature == "+fp16") {
4756 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004757 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004758 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004759 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004760
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004761 switch (ArchVersion) {
4762 case 6:
4763 if (ArchProfile == llvm::ARM::PK_M)
4764 LDREX = 0;
4765 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4766 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4767 else
4768 LDREX = LDREX_W;
4769 break;
4770 case 7:
4771 if (ArchProfile == llvm::ARM::PK_M)
4772 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4773 else
4774 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4775 break;
4776 case 8:
4777 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4778 }
4779
Rafael Espindolaeb265472013-08-21 21:59:03 +00004780 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4781 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4782 return false;
4783 }
4784
4785 if (FPMath == FP_Neon)
4786 Features.push_back("+neonfp");
4787 else if (FPMath == FP_VFP)
4788 Features.push_back("-neonfp");
4789
Daniel Dunbar893d4752009-12-19 04:15:38 +00004790 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004791 auto Feature =
4792 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4793 if (Feature != Features.end())
4794 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004795
Rafael Espindolaeb265472013-08-21 21:59:03 +00004796 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004797 }
4798
Craig Topper3164f332014-03-11 03:39:26 +00004799 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004800 return llvm::StringSwitch<bool>(Feature)
4801 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004802 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004803 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004804 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004805 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004806 .Case("hwdiv", HWDiv & HWDivThumb)
4807 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004808 .Default(false);
4809 }
Renato Golin15b86152015-07-03 16:41:13 +00004810
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004811 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004812 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004813 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004814
Renato Golin15b86152015-07-03 16:41:13 +00004815 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004816 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004817 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004818 CPU = Name;
4819 return true;
4820 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004821
Craig Topper3164f332014-03-11 03:39:26 +00004822 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004823
Craig Topper3164f332014-03-11 03:39:26 +00004824 void getTargetDefines(const LangOptions &Opts,
4825 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004826 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004827 Builder.defineMacro("__arm");
4828 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004829
Chris Lattnerecd49032009-03-02 22:27:17 +00004830 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004831 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00004832
4833 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
4834 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00004835 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00004836 Builder.defineMacro("__ARM_ARCH_7K__", "2");
4837
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004838 if (!CPUAttr.empty())
4839 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004840
4841 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004842 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00004843 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004844
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004845 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004846 // ACLE 6.5.7 Crypto Extension
4847 if (Crypto)
4848 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4849 // ACLE 6.5.8 CRC32 Extension
4850 if (CRC)
4851 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4852 // ACLE 6.5.10 Numeric Maximum and Minimum
4853 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4854 // ACLE 6.5.9 Directed Rounding
4855 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004856 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004857
4858 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4859 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00004860 // NOTE that the default profile is assumed to be 'A'
4861 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004862 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4863
Bradley Smithf4affc12016-03-03 13:52:22 +00004864 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
4865 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
4866 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
4867 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004868 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004869 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004870 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004871 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4872
4873 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4874 // instruction set such as ARM or Thumb.
4875 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4876
4877 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4878
4879 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004880 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004881 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004882
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004883 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004884 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004885 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004886
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004887 // ACLE 6.4.4 LDREX/STREX
4888 if (LDREX)
4889 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4890
4891 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004892 if (ArchVersion == 5 ||
4893 (ArchVersion == 6 && CPUProfile != "M") ||
4894 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004895 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4896
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004897 // ACLE 6.5.1 Hardware Floating Point
4898 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004899 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004900
Yi Konga44c4d72014-06-27 21:25:42 +00004901 // ACLE predefines.
4902 Builder.defineMacro("__ARM_ACLE", "200");
4903
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004904 // FP16 support (we currently only support IEEE format).
4905 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4906 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4907
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004908 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4909 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4910 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4911
Mike Stump9d54bd72009-04-08 02:07:04 +00004912 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004913
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004914 // FIXME: It's more complicated than this and we don't really support
4915 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004916 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004917 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004918 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004919
David Tweed8f676532012-10-25 13:33:01 +00004920 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004921 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004922 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4923 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004924 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004925 Builder.defineMacro("__ARM_PCS", "1");
4926
David Tweed8f676532012-10-25 13:33:01 +00004927 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004928 Builder.defineMacro("__ARM_PCS_VFP", "1");
4929 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004930
Daniel Dunbar893d4752009-12-19 04:15:38 +00004931 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004932 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004933
4934 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004935 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004936
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004937 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004938 Builder.defineMacro("__THUMBEL__");
4939 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004940 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004941 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004942 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004943
4944 // ACLE 6.4.9 32-bit SIMD instructions
4945 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4946 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4947
4948 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004949 if (((HWDiv & HWDivThumb) && isThumb()) ||
4950 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004951 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004952 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004953 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004954
4955 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004956 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004957
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004958 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004959 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004960 if (FPU & VFP2FPU)
4961 Builder.defineMacro("__ARM_VFPV2__");
4962 if (FPU & VFP3FPU)
4963 Builder.defineMacro("__ARM_VFPV3__");
4964 if (FPU & VFP4FPU)
4965 Builder.defineMacro("__ARM_VFPV4__");
4966 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004967
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004968 // This only gets set when Neon instructions are actually available, unlike
4969 // the VFP define, hence the soft float and arch check. This is subtly
4970 // different from gcc, we follow the intent which was that it should be set
4971 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004972 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004973 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004974 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004975 // current AArch32 NEON implementations do not support double-precision
4976 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004977 Builder.defineMacro("__ARM_NEON_FP",
4978 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004979 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004980
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004981 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4982 Opts.ShortWChar ? "2" : "4");
4983
4984 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4985 Opts.ShortEnums ? "1" : "4");
4986
Bradley Smithf4affc12016-03-03 13:52:22 +00004987 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004988 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4989 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4990 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4991 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4992 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004993
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004994 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004995 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004996 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004997 }
4998
4999 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005000 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005001 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5002 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005003 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005004 }
5005
5006 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005007 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005008 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005009
5010 if (Opts.UnsafeFPMath)
5011 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005012
5013 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5014 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005015 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005016
Craig Topper6c03a542015-10-19 04:51:35 +00005017 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5018 return llvm::makeArrayRef(BuiltinInfo,
5019 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005020 }
Craig Topper3164f332014-03-11 03:39:26 +00005021 bool isCLZForZeroUndef() const override { return false; }
5022 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005023 return IsAAPCS
5024 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005025 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5026 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005027 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005028 ArrayRef<const char *> getGCCRegNames() const override;
5029 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005030 bool validateAsmConstraint(const char *&Name,
5031 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005032 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005033 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005034 case 'l': // r0-r7
5035 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005036 case 't': // VFP Floating point register single precision
5037 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005038 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005039 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005040 case 'I':
5041 case 'J':
5042 case 'K':
5043 case 'L':
5044 case 'M':
5045 // FIXME
5046 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005047 case 'Q': // A memory address that is a single base register.
5048 Info.setAllowsMemory();
5049 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005050 case 'U': // a memory reference...
5051 switch (Name[1]) {
5052 case 'q': // ...ARMV4 ldrsb
5053 case 'v': // ...VFP load/store (reg+constant offset)
5054 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005055 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005056 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005057 case 'n': // valid address for Neon doubleword vector load/store
5058 case 'm': // valid address for Neon element and structure load/store
5059 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005060 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005061 Info.setAllowsMemory();
5062 Name++;
5063 return true;
5064 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005065 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005066 return false;
5067 }
Craig Topper3164f332014-03-11 03:39:26 +00005068 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005069 std::string R;
5070 switch (*Constraint) {
5071 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005072 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005073 Constraint++;
5074 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005075 case 'p': // 'p' should be translated to 'r' by default.
5076 R = std::string("r");
5077 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005078 default:
5079 return std::string(1, *Constraint);
5080 }
5081 return R;
5082 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005083 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005084 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005085 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005086 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005087 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005088
Bill Wendling9d1ee112012-10-25 23:28:48 +00005089 // Strip off constraint modifiers.
5090 while (Constraint[0] == '=' ||
5091 Constraint[0] == '+' ||
5092 Constraint[0] == '&')
5093 Constraint = Constraint.substr(1);
5094
5095 switch (Constraint[0]) {
5096 default: break;
5097 case 'r': {
5098 switch (Modifier) {
5099 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005100 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005101 case 'q':
5102 // A register of size 32 cannot fit a vector type.
5103 return false;
5104 }
5105 }
5106 }
5107
5108 return true;
5109 }
Craig Topper3164f332014-03-11 03:39:26 +00005110 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005111 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005112 return "";
5113 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005114
Craig Topper3164f332014-03-11 03:39:26 +00005115 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005116 switch (CC) {
5117 case CC_AAPCS:
5118 case CC_AAPCS_VFP:
5119 case CC_Swift:
5120 return CCCR_OK;
5121 default:
5122 return CCCR_Warning;
5123 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005124 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005125
Craig Topper3164f332014-03-11 03:39:26 +00005126 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005127 if (RegNo == 0) return 0;
5128 if (RegNo == 1) return 1;
5129 return -1;
5130 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005131
5132 bool hasSjLjLowering() const override {
5133 return true;
5134 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005135};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005136
Rafael Espindolaeb265472013-08-21 21:59:03 +00005137bool ARMTargetInfo::setFPMath(StringRef Name) {
5138 if (Name == "neon") {
5139 FPMath = FP_Neon;
5140 return true;
5141 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5142 Name == "vfp4") {
5143 FPMath = FP_VFP;
5144 return true;
5145 }
5146 return false;
5147}
5148
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005149const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005150 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005151 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005152 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5153
5154 // Float registers
5155 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5156 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5157 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005158 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005159
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005160 // Double registers
5161 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5162 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005163 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5164 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005165
5166 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005167 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5168 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005169};
5170
Craig Topperf054e3a2015-10-19 03:52:27 +00005171ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5172 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005173}
5174
5175const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005176 { { "a1" }, "r0" },
5177 { { "a2" }, "r1" },
5178 { { "a3" }, "r2" },
5179 { { "a4" }, "r3" },
5180 { { "v1" }, "r4" },
5181 { { "v2" }, "r5" },
5182 { { "v3" }, "r6" },
5183 { { "v4" }, "r7" },
5184 { { "v5" }, "r8" },
5185 { { "v6", "rfp" }, "r9" },
5186 { { "sl" }, "r10" },
5187 { { "fp" }, "r11" },
5188 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005189 { { "r13" }, "sp" },
5190 { { "r14" }, "lr" },
5191 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005192 // The S, D and Q registers overlap, but aren't really aliases; we
5193 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005194};
5195
Craig Topperf054e3a2015-10-19 03:52:27 +00005196ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5197 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005198}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005199
5200const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005201#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005202 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005203#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5204 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005205#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005206
Craig Topper07d3b622015-08-07 05:14:44 +00005207#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005208 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005209#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005210 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005211#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5212 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005213#include "clang/Basic/BuiltinsARM.def"
5214};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005215
5216class ARMleTargetInfo : public ARMTargetInfo {
5217public:
5218 ARMleTargetInfo(const llvm::Triple &Triple)
5219 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005220 void getTargetDefines(const LangOptions &Opts,
5221 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005222 Builder.defineMacro("__ARMEL__");
5223 ARMTargetInfo::getTargetDefines(Opts, Builder);
5224 }
5225};
5226
5227class ARMbeTargetInfo : public ARMTargetInfo {
5228public:
5229 ARMbeTargetInfo(const llvm::Triple &Triple)
5230 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005231 void getTargetDefines(const LangOptions &Opts,
5232 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005233 Builder.defineMacro("__ARMEB__");
5234 Builder.defineMacro("__ARM_BIG_ENDIAN");
5235 ARMTargetInfo::getTargetDefines(Opts, Builder);
5236 }
5237};
Chris Lattner17df24e2008-04-21 18:56:49 +00005238
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005239class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5240 const llvm::Triple Triple;
5241public:
5242 WindowsARMTargetInfo(const llvm::Triple &Triple)
5243 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005244 WCharType = UnsignedShort;
5245 SizeType = UnsignedInt;
James Y Knighta3518ad2016-01-27 01:04:51 +00005246 UserLabelPrefix = "";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005247 }
5248 void getVisualStudioDefines(const LangOptions &Opts,
5249 MacroBuilder &Builder) const {
5250 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5251
5252 // FIXME: this is invalid for WindowsCE
5253 Builder.defineMacro("_M_ARM_NT", "1");
5254 Builder.defineMacro("_M_ARMT", "_M_ARM");
5255 Builder.defineMacro("_M_THUMB", "_M_ARM");
5256
5257 assert((Triple.getArch() == llvm::Triple::arm ||
5258 Triple.getArch() == llvm::Triple::thumb) &&
5259 "invalid architecture for Windows ARM target info");
5260 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5261 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5262
5263 // TODO map the complete set of values
5264 // 31: VFPv3 40: VFPv4
5265 Builder.defineMacro("_M_ARM_FP", "31");
5266 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005267 BuiltinVaListKind getBuiltinVaListKind() const override {
5268 return TargetInfo::CharPtrBuiltinVaList;
5269 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005270 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5271 switch (CC) {
5272 case CC_X86StdCall:
5273 case CC_X86ThisCall:
5274 case CC_X86FastCall:
5275 case CC_X86VectorCall:
5276 return CCCR_Ignore;
5277 case CC_C:
5278 return CCCR_OK;
5279 default:
5280 return CCCR_Warning;
5281 }
5282 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005283};
5284
5285// Windows ARM + Itanium C++ ABI Target
5286class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5287public:
5288 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5289 : WindowsARMTargetInfo(Triple) {
5290 TheCXXABI.set(TargetCXXABI::GenericARM);
5291 }
5292
5293 void getTargetDefines(const LangOptions &Opts,
5294 MacroBuilder &Builder) const override {
5295 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5296
5297 if (Opts.MSVCCompat)
5298 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5299 }
5300};
5301
5302// Windows ARM, MS (C++) ABI
5303class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5304public:
5305 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5306 : WindowsARMTargetInfo(Triple) {
5307 TheCXXABI.set(TargetCXXABI::Microsoft);
5308 }
5309
5310 void getTargetDefines(const LangOptions &Opts,
5311 MacroBuilder &Builder) const override {
5312 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5313 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5314 }
5315};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005316
Yaron Keren321249c2015-07-15 13:32:23 +00005317// ARM MinGW target
5318class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5319public:
5320 MinGWARMTargetInfo(const llvm::Triple &Triple)
5321 : WindowsARMTargetInfo(Triple) {
5322 TheCXXABI.set(TargetCXXABI::GenericARM);
5323 }
5324
5325 void getTargetDefines(const LangOptions &Opts,
5326 MacroBuilder &Builder) const override {
5327 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5328 DefineStd(Builder, "WIN32", Opts);
5329 DefineStd(Builder, "WINNT", Opts);
5330 Builder.defineMacro("_ARM_");
5331 addMinGWDefines(Opts, Builder);
5332 }
5333};
5334
5335// ARM Cygwin target
5336class CygwinARMTargetInfo : public ARMleTargetInfo {
5337public:
5338 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5339 TLSSupported = false;
5340 WCharType = UnsignedShort;
5341 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005342 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005343 }
5344 void getTargetDefines(const LangOptions &Opts,
5345 MacroBuilder &Builder) const override {
5346 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5347 Builder.defineMacro("_ARM_");
5348 Builder.defineMacro("__CYGWIN__");
5349 Builder.defineMacro("__CYGWIN32__");
5350 DefineStd(Builder, "unix", Opts);
5351 if (Opts.CPlusPlus)
5352 Builder.defineMacro("_GNU_SOURCE");
5353 }
5354};
5355
Mike Stump11289f42009-09-09 15:08:12 +00005356class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005357 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005358protected:
Craig Topper3164f332014-03-11 03:39:26 +00005359 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5360 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005361 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005362 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005363
Torok Edwinb2b37c62009-06-30 17:10:35 +00005364public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005365 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005366 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005367 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005368 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005369 // FIXME: This should be based off of the target features in
5370 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005371 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005372
Tim Northoverd88ecb32016-01-27 19:32:40 +00005373 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005374 // Darwin on iOS uses a variant of the ARM C++ ABI.
5375 TheCXXABI.set(TargetCXXABI::WatchOS);
5376
5377 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5378 // size_t is long, it's a bit weird for it to be int.
5379 PtrDiffType = SignedLong;
5380
5381 // BOOL should be a real boolean on the new ABI
5382 UseSignedCharForObjCBool = false;
5383 } else
5384 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005385 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005386};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005387
Tim Northover573cbee2014-05-24 12:52:07 +00005388class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005389 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005390 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5391 static const char *const GCCRegNames[];
5392
James Molloy75f5f9e2014-04-16 15:33:48 +00005393 enum FPUModeEnum {
5394 FPUMode,
5395 NeonMode
5396 };
5397
5398 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005399 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005400 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005401 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005402 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005403
Tim Northovera2ee4332014-03-29 15:09:45 +00005404 static const Builtin::Info BuiltinInfo[];
5405
5406 std::string ABI;
5407
5408public:
Tim Northover573cbee2014-05-24 12:52:07 +00005409 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005410 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005411
5412 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5413 WCharType = SignedInt;
5414
5415 // NetBSD apparently prefers consistency across ARM targets to consistency
5416 // across 64-bit targets.
5417 Int64Type = SignedLongLong;
5418 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005419 } else {
5420 WCharType = UnsignedInt;
5421 Int64Type = SignedLong;
5422 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005423 }
5424
Tim Northovera2ee4332014-03-29 15:09:45 +00005425 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005426 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005427 MaxAtomicInlineWidth = 128;
5428 MaxAtomicPromoteWidth = 128;
5429
Tim Northovera6a19f12015-02-06 01:25:07 +00005430 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005431 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5432
Tim Northovera2ee4332014-03-29 15:09:45 +00005433 // {} in inline assembly are neon specifiers, not assembly variant
5434 // specifiers.
5435 NoAsmVariants = true;
5436
Tim Northover7ad87af2015-01-16 18:44:04 +00005437 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5438 // contributes to the alignment of the containing aggregate in the same way
5439 // a plain (non bit-field) member of that type would, without exception for
5440 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005441 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005442 UseZeroLengthBitfieldAlignment = true;
5443
Tim Northover573cbee2014-05-24 12:52:07 +00005444 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005445 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5446 }
5447
Alp Toker4925ba72014-06-07 23:30:42 +00005448 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005449 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005450 if (Name != "aapcs" && Name != "darwinpcs")
5451 return false;
5452
5453 ABI = Name;
5454 return true;
5455 }
5456
David Blaikie1cbb9712014-11-14 19:09:44 +00005457 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005458 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005459 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005460 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5461 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005462 .Case("cyclone", true)
Chad Rosierb0ce1952016-02-11 18:09:31 +00005463 .Case("kryo", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005464 .Default(false);
5465 return CPUKnown;
5466 }
5467
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005468 void getTargetDefines(const LangOptions &Opts,
5469 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005470 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005471 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005472
5473 // Target properties.
5474 Builder.defineMacro("_LP64");
5475 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005476
5477 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5478 Builder.defineMacro("__ARM_ACLE", "200");
5479 Builder.defineMacro("__ARM_ARCH", "8");
5480 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5481
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005482 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005483 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005484 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005485
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005486 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5487 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5488 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5489 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005490 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005491 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5492 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005493
5494 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5495
5496 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005497 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005498
5499 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5500 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005501 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5502 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005503
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005504 if (Opts.UnsafeFPMath)
5505 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005506
5507 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5508
5509 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5510 Opts.ShortEnums ? "1" : "4");
5511
James Molloy75f5f9e2014-04-16 15:33:48 +00005512 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005513 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005514 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005515 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005516 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005517
Bradley Smith418c5932014-05-02 15:17:51 +00005518 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005519 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005520
James Molloy75f5f9e2014-04-16 15:33:48 +00005521 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005522 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5523
5524 if (Unaligned)
5525 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005526
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005527 if (V8_1A)
5528 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5529
Reid Klecknerd167d422015-05-06 15:31:46 +00005530 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5531 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5532 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5533 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5534 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005535 }
5536
Craig Topper6c03a542015-10-19 04:51:35 +00005537 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5538 return llvm::makeArrayRef(BuiltinInfo,
5539 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005540 }
5541
David Blaikie1cbb9712014-11-14 19:09:44 +00005542 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005543 return Feature == "aarch64" ||
5544 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005545 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005546 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005547 }
5548
James Molloy5e73df52014-04-16 15:06:20 +00005549 bool handleTargetFeatures(std::vector<std::string> &Features,
5550 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005551 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005552 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005553 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005554 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005555 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005556
Eric Christopher610fe112015-08-26 08:21:55 +00005557 for (const auto &Feature : Features) {
5558 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005559 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005560 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005561 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005562 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005563 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005564 if (Feature == "+strict-align")
5565 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005566 if (Feature == "+v8.1a")
5567 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005568 }
5569
Eric Christopher964a5f32015-08-05 23:48:05 +00005570 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005571
5572 return true;
5573 }
5574
John McCall477f2bb2016-03-03 06:39:32 +00005575 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5576 switch (CC) {
5577 case CC_C:
5578 case CC_Swift:
5579 return CCCR_OK;
5580 default:
5581 return CCCR_Warning;
5582 }
5583 }
5584
David Blaikie1cbb9712014-11-14 19:09:44 +00005585 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005586
David Blaikie1cbb9712014-11-14 19:09:44 +00005587 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005588 return TargetInfo::AArch64ABIBuiltinVaList;
5589 }
5590
Craig Topperf054e3a2015-10-19 03:52:27 +00005591 ArrayRef<const char *> getGCCRegNames() const override;
5592 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005593
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005594 bool validateAsmConstraint(const char *&Name,
5595 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005596 switch (*Name) {
5597 default:
5598 return false;
5599 case 'w': // Floating point and SIMD registers (V0-V31)
5600 Info.setAllowsRegister();
5601 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005602 case 'I': // Constant that can be used with an ADD instruction
5603 case 'J': // Constant that can be used with a SUB instruction
5604 case 'K': // Constant that can be used with a 32-bit logical instruction
5605 case 'L': // Constant that can be used with a 64-bit logical instruction
5606 case 'M': // Constant that can be used as a 32-bit MOV immediate
5607 case 'N': // Constant that can be used as a 64-bit MOV immediate
5608 case 'Y': // Floating point constant zero
5609 case 'Z': // Integer constant zero
5610 return true;
5611 case 'Q': // A memory reference with base register and no offset
5612 Info.setAllowsMemory();
5613 return true;
5614 case 'S': // A symbolic address
5615 Info.setAllowsRegister();
5616 return true;
5617 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005618 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5619 // Utf: A memory address suitable for ldp/stp in TF mode.
5620 // Usa: An absolute symbolic address.
5621 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5622 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005623 case 'z': // Zero register, wzr or xzr
5624 Info.setAllowsRegister();
5625 return true;
5626 case 'x': // Floating point and SIMD registers (V0-V15)
5627 Info.setAllowsRegister();
5628 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005629 }
5630 return false;
5631 }
5632
Akira Hatanaka987f1862014-08-22 06:05:21 +00005633 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005634 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005635 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005636 // Strip off constraint modifiers.
5637 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5638 Constraint = Constraint.substr(1);
5639
5640 switch (Constraint[0]) {
5641 default:
5642 return true;
5643 case 'z':
5644 case 'r': {
5645 switch (Modifier) {
5646 case 'x':
5647 case 'w':
5648 // For now assume that the person knows what they're
5649 // doing with the modifier.
5650 return true;
5651 default:
5652 // By default an 'r' constraint will be in the 'x'
5653 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005654 if (Size == 64)
5655 return true;
5656
5657 SuggestedModifier = "w";
5658 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005659 }
5660 }
5661 }
5662 }
5663
David Blaikie1cbb9712014-11-14 19:09:44 +00005664 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005665
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005666 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005667 if (RegNo == 0)
5668 return 0;
5669 if (RegNo == 1)
5670 return 1;
5671 return -1;
5672 }
5673};
5674
Tim Northover573cbee2014-05-24 12:52:07 +00005675const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005676 // 32-bit Integer registers
5677 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5678 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5679 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5680
5681 // 64-bit Integer registers
5682 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5683 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5684 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5685
5686 // 32-bit floating point regsisters
5687 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5688 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5689 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5690
5691 // 64-bit floating point regsisters
5692 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5693 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5694 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5695
5696 // Vector registers
5697 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5698 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5699 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5700};
5701
Craig Topperf054e3a2015-10-19 03:52:27 +00005702ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5703 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005704}
5705
Tim Northover573cbee2014-05-24 12:52:07 +00005706const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005707 { { "w31" }, "wsp" },
5708 { { "x29" }, "fp" },
5709 { { "x30" }, "lr" },
5710 { { "x31" }, "sp" },
5711 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5712 // don't want to substitute one of these for a different-sized one.
5713};
5714
Craig Topperf054e3a2015-10-19 03:52:27 +00005715ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5716 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005717}
5718
Tim Northover573cbee2014-05-24 12:52:07 +00005719const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005720#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005721 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005722#include "clang/Basic/BuiltinsNEON.def"
5723
5724#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005725 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005726#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005727};
James Molloy5e73df52014-04-16 15:06:20 +00005728
Tim Northover573cbee2014-05-24 12:52:07 +00005729class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005730 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005731 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005732 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005733 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005734 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005735 }
5736
5737public:
Tim Northover573cbee2014-05-24 12:52:07 +00005738 AArch64leTargetInfo(const llvm::Triple &Triple)
5739 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005740 BigEndian = false;
5741 }
5742 void getTargetDefines(const LangOptions &Opts,
5743 MacroBuilder &Builder) const override {
5744 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005745 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005746 }
5747};
5748
Tim Northover573cbee2014-05-24 12:52:07 +00005749class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005750 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005751 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005752 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005753 }
5754
5755public:
Tim Northover573cbee2014-05-24 12:52:07 +00005756 AArch64beTargetInfo(const llvm::Triple &Triple)
5757 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005758 void getTargetDefines(const LangOptions &Opts,
5759 MacroBuilder &Builder) const override {
5760 Builder.defineMacro("__AARCH64EB__");
5761 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5762 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005763 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005764 }
5765};
Tim Northovera2ee4332014-03-29 15:09:45 +00005766
Tim Northover573cbee2014-05-24 12:52:07 +00005767class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005768protected:
5769 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5770 MacroBuilder &Builder) const override {
5771 Builder.defineMacro("__AARCH64_SIMD__");
5772 Builder.defineMacro("__ARM64_ARCH_8__");
5773 Builder.defineMacro("__ARM_NEON__");
5774 Builder.defineMacro("__LITTLE_ENDIAN__");
5775 Builder.defineMacro("__REGISTER_PREFIX__", "");
5776 Builder.defineMacro("__arm64", "1");
5777 Builder.defineMacro("__arm64__", "1");
5778
5779 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5780 }
5781
Tim Northovera2ee4332014-03-29 15:09:45 +00005782public:
Tim Northover573cbee2014-05-24 12:52:07 +00005783 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5784 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005785 Int64Type = SignedLongLong;
5786 WCharType = SignedInt;
5787 UseSignedCharForObjCBool = false;
5788
Tim Northovera6a19f12015-02-06 01:25:07 +00005789 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005790 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5791
5792 TheCXXABI.set(TargetCXXABI::iOS64);
5793 }
5794
David Blaikie1cbb9712014-11-14 19:09:44 +00005795 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005796 return TargetInfo::CharPtrBuiltinVaList;
5797 }
5798};
Tim Northovera2ee4332014-03-29 15:09:45 +00005799
Tony Linthicum76329bf2011-12-12 21:14:55 +00005800// Hexagon abstract base class
5801class HexagonTargetInfo : public TargetInfo {
5802 static const Builtin::Info BuiltinInfo[];
5803 static const char * const GCCRegNames[];
5804 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5805 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005806 bool HasHVX, HasHVXDouble;
5807
Tony Linthicum76329bf2011-12-12 21:14:55 +00005808public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005809 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005810 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00005811 // Specify the vector alignment explicitly. For v512x1, the calculated
5812 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
5813 // the required minimum of 64 bytes.
5814 DataLayoutString = "e-m:e-p:32:32:32-a:0-n16:32-"
5815 "i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-"
5816 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048";
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005817 SizeType = UnsignedInt;
5818 PtrDiffType = SignedInt;
5819 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005820
5821 // {} in inline assembly are packet specifiers, not assembly variant
5822 // specifiers.
5823 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005824
5825 LargeArrayMinWidth = 64;
5826 LargeArrayAlign = 64;
5827 UseBitFieldTypeAlignment = true;
5828 ZeroLengthBitfieldBoundary = 32;
5829 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005830 }
5831
Craig Topper6c03a542015-10-19 04:51:35 +00005832 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5833 return llvm::makeArrayRef(BuiltinInfo,
5834 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005835 }
5836
Craig Topper3164f332014-03-11 03:39:26 +00005837 bool validateAsmConstraint(const char *&Name,
5838 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005839 return true;
5840 }
5841
Craig Topper3164f332014-03-11 03:39:26 +00005842 void getTargetDefines(const LangOptions &Opts,
5843 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005844
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005845 bool isCLZForZeroUndef() const override { return false; }
5846
Craig Topper3164f332014-03-11 03:39:26 +00005847 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005848 return llvm::StringSwitch<bool>(Feature)
5849 .Case("hexagon", true)
5850 .Case("hvx", HasHVX)
5851 .Case("hvx-double", HasHVXDouble)
5852 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005853 }
Craig Topper3164f332014-03-11 03:39:26 +00005854
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005855 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5856 StringRef CPU, const std::vector<std::string> &FeaturesVec)
5857 const override;
5858
5859 bool handleTargetFeatures(std::vector<std::string> &Features,
5860 DiagnosticsEngine &Diags) override;
5861
Craig Topper3164f332014-03-11 03:39:26 +00005862 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005863 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005864 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005865 ArrayRef<const char *> getGCCRegNames() const override;
5866 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005867 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005868 return "";
5869 }
Sebastian Pop86500282012-01-13 20:37:10 +00005870
5871 static const char *getHexagonCPUSuffix(StringRef Name) {
5872 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005873 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005874 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005875 .Case("hexagonv55", "55")
5876 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00005877 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005878 }
5879
Craig Topper3164f332014-03-11 03:39:26 +00005880 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005881 if (!getHexagonCPUSuffix(Name))
5882 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005883 CPU = Name;
5884 return true;
5885 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005886
5887 int getEHDataRegisterNumber(unsigned RegNo) const override {
5888 return RegNo < 2 ? RegNo : -1;
5889 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005890};
5891
5892void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005893 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005894 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005895 Builder.defineMacro("__hexagon__", "1");
5896
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005897 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005898 Builder.defineMacro("__HEXAGON_V4__");
5899 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005900 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005901 Builder.defineMacro("__QDSP6_V4__");
5902 Builder.defineMacro("__QDSP6_ARCH__", "4");
5903 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005904 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005905 Builder.defineMacro("__HEXAGON_V5__");
5906 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5907 if(Opts.HexagonQdsp6Compat) {
5908 Builder.defineMacro("__QDSP6_V5__");
5909 Builder.defineMacro("__QDSP6_ARCH__", "5");
5910 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005911 } else if (CPU == "hexagonv60") {
5912 Builder.defineMacro("__HEXAGON_V60__");
5913 Builder.defineMacro("__HEXAGON_ARCH__", "60");
5914 Builder.defineMacro("__QDSP6_V60__");
5915 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005916 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005917}
5918
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005919bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
5920 DiagnosticsEngine &Diags) {
5921 for (auto &F : Features) {
5922 if (F == "+hvx")
5923 HasHVX = true;
5924 else if (F == "-hvx")
5925 HasHVX = HasHVXDouble = false;
5926 else if (F == "+hvx-double")
5927 HasHVX = HasHVXDouble = true;
5928 else if (F == "-hvx-double")
5929 HasHVXDouble = false;
5930 }
5931 return true;
5932}
5933
5934bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
5935 DiagnosticsEngine &Diags, StringRef CPU,
5936 const std::vector<std::string> &FeaturesVec) const {
5937 // Default for v60: -hvx, -hvx-double.
5938 Features["hvx"] = false;
5939 Features["hvx-double"] = false;
5940
5941 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
5942}
5943
5944
5945const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005946 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5947 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5948 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5949 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5950 "p0", "p1", "p2", "p3",
5951 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5952};
5953
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005954ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00005955 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005956}
5957
Tony Linthicum76329bf2011-12-12 21:14:55 +00005958const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5959 { { "sp" }, "r29" },
5960 { { "fp" }, "r30" },
5961 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005962};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005963
Craig Topperf054e3a2015-10-19 03:52:27 +00005964ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
5965 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005966}
5967
5968
5969const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005970#define BUILTIN(ID, TYPE, ATTRS) \
5971 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5972#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5973 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005974#include "clang/Basic/BuiltinsHexagon.def"
5975};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005976
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005977// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5978class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005979 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5980 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005981 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005982public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005983 SparcTargetInfo(const llvm::Triple &Triple)
James Y Knighta3518ad2016-01-27 01:04:51 +00005984 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005985
Craig Topper3164f332014-03-11 03:39:26 +00005986 bool handleTargetFeatures(std::vector<std::string> &Features,
5987 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005988 // The backend doesn't actually handle soft float yet, but in case someone
5989 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005990 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5991 if (Feature != Features.end()) {
5992 SoftFloat = true;
5993 Features.erase(Feature);
5994 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005995 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005996 }
Craig Topper3164f332014-03-11 03:39:26 +00005997 void getTargetDefines(const LangOptions &Opts,
5998 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005999 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006000 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006001
6002 if (SoftFloat)
6003 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006004 }
Craig Topper3164f332014-03-11 03:39:26 +00006005
6006 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006007 return llvm::StringSwitch<bool>(Feature)
6008 .Case("softfloat", SoftFloat)
6009 .Case("sparc", true)
6010 .Default(false);
6011 }
Craig Topper3164f332014-03-11 03:39:26 +00006012
Craig Topper6c03a542015-10-19 04:51:35 +00006013 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006014 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006015 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006016 }
Craig Topper3164f332014-03-11 03:39:26 +00006017 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006018 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006019 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006020 ArrayRef<const char *> getGCCRegNames() const override;
6021 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006022 bool validateAsmConstraint(const char *&Name,
6023 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006024 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006025 switch (*Name) {
6026 case 'I': // Signed 13-bit constant
6027 case 'J': // Zero
6028 case 'K': // 32-bit constant with the low 12 bits clear
6029 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6030 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6031 case 'N': // Same as 'K' but zext (required for SIMode)
6032 case 'O': // The constant 4096
6033 return true;
6034 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006035 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006036 }
Craig Topper3164f332014-03-11 03:39:26 +00006037 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006038 // FIXME: Implement!
6039 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006040 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006041
6042 // No Sparc V7 for now, the backend doesn't support it anyway.
6043 enum CPUKind {
6044 CK_GENERIC,
6045 CK_V8,
6046 CK_SUPERSPARC,
6047 CK_SPARCLITE,
6048 CK_F934,
6049 CK_HYPERSPARC,
6050 CK_SPARCLITE86X,
6051 CK_SPARCLET,
6052 CK_TSC701,
6053 CK_V9,
6054 CK_ULTRASPARC,
6055 CK_ULTRASPARC3,
6056 CK_NIAGARA,
6057 CK_NIAGARA2,
6058 CK_NIAGARA3,
6059 CK_NIAGARA4
6060 } CPU = CK_GENERIC;
6061
6062 enum CPUGeneration {
6063 CG_V8,
6064 CG_V9,
6065 };
6066
6067 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6068 switch (Kind) {
6069 case CK_GENERIC:
6070 case CK_V8:
6071 case CK_SUPERSPARC:
6072 case CK_SPARCLITE:
6073 case CK_F934:
6074 case CK_HYPERSPARC:
6075 case CK_SPARCLITE86X:
6076 case CK_SPARCLET:
6077 case CK_TSC701:
6078 return CG_V8;
6079 case CK_V9:
6080 case CK_ULTRASPARC:
6081 case CK_ULTRASPARC3:
6082 case CK_NIAGARA:
6083 case CK_NIAGARA2:
6084 case CK_NIAGARA3:
6085 case CK_NIAGARA4:
6086 return CG_V9;
6087 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006088 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006089 }
6090
6091 CPUKind getCPUKind(StringRef Name) const {
6092 return llvm::StringSwitch<CPUKind>(Name)
6093 .Case("v8", CK_V8)
6094 .Case("supersparc", CK_SUPERSPARC)
6095 .Case("sparclite", CK_SPARCLITE)
6096 .Case("f934", CK_F934)
6097 .Case("hypersparc", CK_HYPERSPARC)
6098 .Case("sparclite86x", CK_SPARCLITE86X)
6099 .Case("sparclet", CK_SPARCLET)
6100 .Case("tsc701", CK_TSC701)
6101 .Case("v9", CK_V9)
6102 .Case("ultrasparc", CK_ULTRASPARC)
6103 .Case("ultrasparc3", CK_ULTRASPARC3)
6104 .Case("niagara", CK_NIAGARA)
6105 .Case("niagara2", CK_NIAGARA2)
6106 .Case("niagara3", CK_NIAGARA3)
6107 .Case("niagara4", CK_NIAGARA4)
6108 .Default(CK_GENERIC);
6109 }
6110
6111 bool setCPU(const std::string &Name) override {
6112 CPU = getCPUKind(Name);
6113 return CPU != CK_GENERIC;
6114 }
Gabor Greif49991682008-02-21 16:29:08 +00006115};
6116
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006117const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006118 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6119 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6120 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6121 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6122};
6123
Craig Topperf054e3a2015-10-19 03:52:27 +00006124ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6125 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006126}
6127
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006128const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006129 { { "g0" }, "r0" },
6130 { { "g1" }, "r1" },
6131 { { "g2" }, "r2" },
6132 { { "g3" }, "r3" },
6133 { { "g4" }, "r4" },
6134 { { "g5" }, "r5" },
6135 { { "g6" }, "r6" },
6136 { { "g7" }, "r7" },
6137 { { "o0" }, "r8" },
6138 { { "o1" }, "r9" },
6139 { { "o2" }, "r10" },
6140 { { "o3" }, "r11" },
6141 { { "o4" }, "r12" },
6142 { { "o5" }, "r13" },
6143 { { "o6", "sp" }, "r14" },
6144 { { "o7" }, "r15" },
6145 { { "l0" }, "r16" },
6146 { { "l1" }, "r17" },
6147 { { "l2" }, "r18" },
6148 { { "l3" }, "r19" },
6149 { { "l4" }, "r20" },
6150 { { "l5" }, "r21" },
6151 { { "l6" }, "r22" },
6152 { { "l7" }, "r23" },
6153 { { "i0" }, "r24" },
6154 { { "i1" }, "r25" },
6155 { { "i2" }, "r26" },
6156 { { "i3" }, "r27" },
6157 { { "i4" }, "r28" },
6158 { { "i5" }, "r29" },
6159 { { "i6", "fp" }, "r30" },
6160 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006161};
6162
Craig Topperf054e3a2015-10-19 03:52:27 +00006163ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6164 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006165}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006166
6167// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6168class SparcV8TargetInfo : public SparcTargetInfo {
6169public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006170 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00006171 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00006172 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6173 switch (getTriple().getOS()) {
6174 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006175 SizeType = UnsignedInt;
6176 IntPtrType = SignedInt;
6177 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006178 break;
6179 case llvm::Triple::NetBSD:
6180 case llvm::Triple::OpenBSD:
6181 SizeType = UnsignedLong;
6182 IntPtrType = SignedLong;
6183 PtrDiffType = SignedLong;
6184 break;
Brad Smith56495d52015-08-13 22:00:53 +00006185 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006186 }
6187
Craig Topper3164f332014-03-11 03:39:26 +00006188 void getTargetDefines(const LangOptions &Opts,
6189 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006190 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006191 switch (getCPUGeneration(CPU)) {
6192 case CG_V8:
6193 Builder.defineMacro("__sparcv8");
6194 if (getTriple().getOS() != llvm::Triple::Solaris)
6195 Builder.defineMacro("__sparcv8__");
6196 break;
6197 case CG_V9:
6198 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006199 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006200 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006201 Builder.defineMacro("__sparc_v9__");
6202 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006203 break;
6204 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006205 }
6206};
6207
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006208// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6209class SparcV8elTargetInfo : public SparcV8TargetInfo {
6210 public:
6211 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00006212 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006213 BigEndian = false;
6214 }
6215};
6216
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006217// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6218class SparcV9TargetInfo : public SparcTargetInfo {
6219public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006220 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006221 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00006222 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006223 // This is an LP64 platform.
6224 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006225
6226 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006227 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006228 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006229 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006230 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006231 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006232
6233 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6234 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6235 LongDoubleWidth = 128;
6236 LongDoubleAlign = 128;
6237 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006238 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006239 }
6240
Craig Topper3164f332014-03-11 03:39:26 +00006241 void getTargetDefines(const LangOptions &Opts,
6242 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006243 SparcTargetInfo::getTargetDefines(Opts, Builder);
6244 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006245 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006246 // Solaris doesn't need these variants, but the BSDs do.
6247 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006248 Builder.defineMacro("__sparc64__");
6249 Builder.defineMacro("__sparc_v9__");
6250 Builder.defineMacro("__sparcv9__");
6251 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006252 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006253
Craig Topper3164f332014-03-11 03:39:26 +00006254 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006255 if (!SparcTargetInfo::setCPU(Name))
6256 return false;
6257 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006258 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006259};
6260
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006261class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006262 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006263 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006264 std::string CPU;
6265 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006266 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006267
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006268public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006269 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00006270 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6271 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006272 IntMaxType = SignedLong;
6273 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006274 TLSSupported = true;
6275 IntWidth = IntAlign = 32;
6276 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6277 PointerWidth = PointerAlign = 64;
6278 LongDoubleWidth = 128;
6279 LongDoubleAlign = 64;
6280 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006281 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006282 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00006283 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006284 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6285 }
6286 void getTargetDefines(const LangOptions &Opts,
6287 MacroBuilder &Builder) const override {
6288 Builder.defineMacro("__s390__");
6289 Builder.defineMacro("__s390x__");
6290 Builder.defineMacro("__zarch__");
6291 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006292
6293 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6294 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6295 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6296 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6297
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006298 if (HasTransactionalExecution)
6299 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006300 if (Opts.ZVector)
6301 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006302 }
Craig Topper6c03a542015-10-19 04:51:35 +00006303 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6304 return llvm::makeArrayRef(BuiltinInfo,
6305 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006306 }
6307
Craig Topperf054e3a2015-10-19 03:52:27 +00006308 ArrayRef<const char *> getGCCRegNames() const override;
6309 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006310 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006311 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006312 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006313 bool validateAsmConstraint(const char *&Name,
6314 TargetInfo::ConstraintInfo &info) const override;
6315 const char *getClobbers() const override {
6316 // FIXME: Is this really right?
6317 return "";
6318 }
6319 BuiltinVaListKind getBuiltinVaListKind() const override {
6320 return TargetInfo::SystemZBuiltinVaList;
6321 }
6322 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006323 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006324 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6325 .Case("z10", true)
6326 .Case("z196", true)
6327 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006328 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006329 .Default(false);
6330
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006331 return CPUKnown;
6332 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006333 bool
6334 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6335 StringRef CPU,
6336 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006337 if (CPU == "zEC12")
6338 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006339 if (CPU == "z13") {
6340 Features["transactional-execution"] = true;
6341 Features["vector"] = true;
6342 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006343 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006344 }
6345
6346 bool handleTargetFeatures(std::vector<std::string> &Features,
6347 DiagnosticsEngine &Diags) override {
6348 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006349 for (const auto &Feature : Features) {
6350 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006351 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006352 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006353 HasVector = true;
6354 }
6355 // If we use the vector ABI, vector types are 64-bit aligned.
6356 if (HasVector) {
6357 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006358 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6359 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006360 }
6361 return true;
6362 }
6363
6364 bool hasFeature(StringRef Feature) const override {
6365 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006366 .Case("systemz", true)
6367 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006368 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006369 .Default(false);
6370 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006371
6372 StringRef getABI() const override {
6373 if (HasVector)
6374 return "vector";
6375 return "";
6376 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006377
6378 bool useFloat128ManglingForLongDouble() const override {
6379 return true;
6380 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006381};
6382
6383const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6384#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006385 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006386#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006387};
6388
6389const char *const SystemZTargetInfo::GCCRegNames[] = {
6390 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6391 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6392 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6393 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6394};
6395
Craig Topperf054e3a2015-10-19 03:52:27 +00006396ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6397 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006398}
6399
6400bool SystemZTargetInfo::
6401validateAsmConstraint(const char *&Name,
6402 TargetInfo::ConstraintInfo &Info) const {
6403 switch (*Name) {
6404 default:
6405 return false;
6406
6407 case 'a': // Address register
6408 case 'd': // Data register (equivalent to 'r')
6409 case 'f': // Floating-point register
6410 Info.setAllowsRegister();
6411 return true;
6412
6413 case 'I': // Unsigned 8-bit constant
6414 case 'J': // Unsigned 12-bit constant
6415 case 'K': // Signed 16-bit constant
6416 case 'L': // Signed 20-bit displacement (on all targets we support)
6417 case 'M': // 0x7fffffff
6418 return true;
6419
6420 case 'Q': // Memory with base and unsigned 12-bit displacement
6421 case 'R': // Likewise, plus an index
6422 case 'S': // Memory with base and signed 20-bit displacement
6423 case 'T': // Likewise, plus an index
6424 Info.setAllowsMemory();
6425 return true;
6426 }
6427}
Ulrich Weigand47445072013-05-06 16:26:41 +00006428
Eric Christopherc48497a2015-09-18 21:26:24 +00006429class MSP430TargetInfo : public TargetInfo {
6430 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006431
Eric Christopherc48497a2015-09-18 21:26:24 +00006432public:
6433 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6434 BigEndian = false;
6435 TLSSupported = false;
6436 IntWidth = 16;
6437 IntAlign = 16;
6438 LongWidth = 32;
6439 LongLongWidth = 64;
6440 LongAlign = LongLongAlign = 16;
6441 PointerWidth = 16;
6442 PointerAlign = 16;
6443 SuitableAlign = 16;
6444 SizeType = UnsignedInt;
6445 IntMaxType = SignedLongLong;
6446 IntPtrType = SignedInt;
6447 PtrDiffType = SignedInt;
6448 SigAtomicType = SignedLong;
6449 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006450 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006451 void getTargetDefines(const LangOptions &Opts,
6452 MacroBuilder &Builder) const override {
6453 Builder.defineMacro("MSP430");
6454 Builder.defineMacro("__MSP430__");
6455 // FIXME: defines for different 'flavours' of MCU
6456 }
Craig Topper6c03a542015-10-19 04:51:35 +00006457 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006458 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006459 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006460 }
6461 bool hasFeature(StringRef Feature) const override {
6462 return Feature == "msp430";
6463 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006464 ArrayRef<const char *> getGCCRegNames() const override;
6465 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006466 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006467 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006468 }
6469 bool validateAsmConstraint(const char *&Name,
6470 TargetInfo::ConstraintInfo &info) const override {
6471 // FIXME: implement
6472 switch (*Name) {
6473 case 'K': // the constant 1
6474 case 'L': // constant -1^20 .. 1^19
6475 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006476 return true;
6477 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006478 // No target constraints for now.
6479 return false;
6480 }
6481 const char *getClobbers() const override {
6482 // FIXME: Is this really right?
6483 return "";
6484 }
6485 BuiltinVaListKind getBuiltinVaListKind() const override {
6486 // FIXME: implement
6487 return TargetInfo::CharPtrBuiltinVaList;
6488 }
6489};
6490
6491const char *const MSP430TargetInfo::GCCRegNames[] = {
6492 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6493 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6494
Craig Topperf054e3a2015-10-19 03:52:27 +00006495ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6496 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006497}
6498
6499// LLVM and Clang cannot be used directly to output native binaries for
6500// target, but is used to compile C code to llvm bitcode with correct
6501// type and alignment information.
6502//
6503// TCE uses the llvm bitcode as input and uses it for generating customized
6504// target processor and program binary. TCE co-design environment is
6505// publicly available in http://tce.cs.tut.fi
6506
6507static const unsigned TCEOpenCLAddrSpaceMap[] = {
6508 3, // opencl_global
6509 4, // opencl_local
6510 5, // opencl_constant
6511 // FIXME: generic has to be added to the target
6512 0, // opencl_generic
6513 0, // cuda_device
6514 0, // cuda_constant
6515 0 // cuda_shared
6516};
6517
6518class TCETargetInfo : public TargetInfo {
6519public:
6520 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6521 TLSSupported = false;
6522 IntWidth = 32;
6523 LongWidth = LongLongWidth = 32;
6524 PointerWidth = 32;
6525 IntAlign = 32;
6526 LongAlign = LongLongAlign = 32;
6527 PointerAlign = 32;
6528 SuitableAlign = 32;
6529 SizeType = UnsignedInt;
6530 IntMaxType = SignedLong;
6531 IntPtrType = SignedInt;
6532 PtrDiffType = SignedInt;
6533 FloatWidth = 32;
6534 FloatAlign = 32;
6535 DoubleWidth = 32;
6536 DoubleAlign = 32;
6537 LongDoubleWidth = 32;
6538 LongDoubleAlign = 32;
6539 FloatFormat = &llvm::APFloat::IEEEsingle;
6540 DoubleFormat = &llvm::APFloat::IEEEsingle;
6541 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6542 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6543 "-f64:32-v64:32-v128:32-a:0:32-n32";
6544 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6545 UseAddrSpaceMapMangling = true;
6546 }
6547
6548 void getTargetDefines(const LangOptions &Opts,
6549 MacroBuilder &Builder) const override {
6550 DefineStd(Builder, "tce", Opts);
6551 Builder.defineMacro("__TCE__");
6552 Builder.defineMacro("__TCE_V1__");
6553 }
6554 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6555
Craig Topper6c03a542015-10-19 04:51:35 +00006556 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006557 const char *getClobbers() const override { return ""; }
6558 BuiltinVaListKind getBuiltinVaListKind() const override {
6559 return TargetInfo::VoidPtrBuiltinVaList;
6560 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006561 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006562 bool validateAsmConstraint(const char *&Name,
6563 TargetInfo::ConstraintInfo &info) const override {
6564 return true;
6565 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006566 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6567 return None;
6568 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006569};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006570
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006571class BPFTargetInfo : public TargetInfo {
6572public:
6573 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6574 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6575 SizeType = UnsignedLong;
6576 PtrDiffType = SignedLong;
6577 IntPtrType = SignedLong;
6578 IntMaxType = SignedLong;
6579 Int64Type = SignedLong;
6580 RegParmMax = 5;
6581 if (Triple.getArch() == llvm::Triple::bpfeb) {
6582 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006583 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006584 } else {
6585 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006586 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006587 }
6588 MaxAtomicPromoteWidth = 64;
6589 MaxAtomicInlineWidth = 64;
6590 TLSSupported = false;
6591 }
6592 void getTargetDefines(const LangOptions &Opts,
6593 MacroBuilder &Builder) const override {
6594 DefineStd(Builder, "bpf", Opts);
6595 Builder.defineMacro("__BPF__");
6596 }
6597 bool hasFeature(StringRef Feature) const override {
6598 return Feature == "bpf";
6599 }
6600
Craig Topper6c03a542015-10-19 04:51:35 +00006601 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006602 const char *getClobbers() const override {
6603 return "";
6604 }
6605 BuiltinVaListKind getBuiltinVaListKind() const override {
6606 return TargetInfo::VoidPtrBuiltinVaList;
6607 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006608 ArrayRef<const char *> getGCCRegNames() const override {
6609 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006610 }
6611 bool validateAsmConstraint(const char *&Name,
6612 TargetInfo::ConstraintInfo &info) const override {
6613 return true;
6614 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006615 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6616 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006617 }
6618};
6619
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006620class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006621 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006622
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006623 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006624 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006625 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006626 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006627 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006628 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006629 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006630 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006631 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006632 enum DspRevEnum {
6633 NoDSP, DSP1, DSP2
6634 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006635 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006636
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006637protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006638 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006639 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006640
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006641public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006642 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6643 const std::string &CPUStr)
6644 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006645 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006646 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6647 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6648 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006649
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006650 bool isNaN2008Default() const {
6651 return CPU == "mips32r6" || CPU == "mips64r6";
6652 }
6653
6654 bool isFP64Default() const {
6655 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6656 }
6657
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006658 bool isNan2008() const override {
6659 return IsNan2008;
6660 }
6661
Alp Toker4925ba72014-06-07 23:30:42 +00006662 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006663 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006664 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6665 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006666 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006667 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006668 .Case("mips1", IsMips32)
6669 .Case("mips2", IsMips32)
6670 .Case("mips3", true)
6671 .Case("mips4", true)
6672 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006673 .Case("mips32", IsMips32)
6674 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006675 .Case("mips32r3", IsMips32)
6676 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006677 .Case("mips32r6", IsMips32)
6678 .Case("mips64", true)
6679 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006680 .Case("mips64r3", true)
6681 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006682 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006683 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006684 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006685 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006686 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006687 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006688 bool
6689 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6690 StringRef CPU,
6691 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00006692 if (CPU.empty())
6693 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006694 if (CPU == "octeon")
6695 Features["mips64r2"] = Features["cnmips"] = true;
6696 else
6697 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006698 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006699 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006700
Craig Topper3164f332014-03-11 03:39:26 +00006701 void getTargetDefines(const LangOptions &Opts,
6702 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006703 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006704 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006705 if (Opts.GNUMode)
6706 Builder.defineMacro("mips");
6707
Simon Atanasyan683535b2012-08-29 19:14:58 +00006708 Builder.defineMacro("__REGISTER_PREFIX__", "");
6709
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006710 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006711 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006712 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006713 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006714 case SoftFloat:
6715 Builder.defineMacro("__mips_soft_float", Twine(1));
6716 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006717 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006718
Simon Atanasyan16071912013-04-14 14:07:30 +00006719 if (IsSingleFloat)
6720 Builder.defineMacro("__mips_single_float", Twine(1));
6721
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006722 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6723 Builder.defineMacro("_MIPS_FPSET",
6724 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6725
Simon Atanasyan72244b62012-07-05 16:06:06 +00006726 if (IsMips16)
6727 Builder.defineMacro("__mips16", Twine(1));
6728
Simon Atanasyan60777612013-04-14 14:07:51 +00006729 if (IsMicromips)
6730 Builder.defineMacro("__mips_micromips", Twine(1));
6731
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006732 if (IsNan2008)
6733 Builder.defineMacro("__mips_nan2008", Twine(1));
6734
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006735 switch (DspRev) {
6736 default:
6737 break;
6738 case DSP1:
6739 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6740 Builder.defineMacro("__mips_dsp", Twine(1));
6741 break;
6742 case DSP2:
6743 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6744 Builder.defineMacro("__mips_dspr2", Twine(1));
6745 Builder.defineMacro("__mips_dsp", Twine(1));
6746 break;
6747 }
6748
Jack Carter44ff1e52013-08-12 17:20:29 +00006749 if (HasMSA)
6750 Builder.defineMacro("__mips_msa", Twine(1));
6751
Simon Atanasyan26f19672012-04-05 19:28:31 +00006752 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6753 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6754 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006755
6756 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6757 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00006758
6759 // These shouldn't be defined for MIPS-I but there's no need to check
6760 // for that since MIPS-I isn't supported.
6761 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6762 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6763 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006764 }
6765
Craig Topper6c03a542015-10-19 04:51:35 +00006766 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6767 return llvm::makeArrayRef(BuiltinInfo,
6768 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006769 }
Craig Topper3164f332014-03-11 03:39:26 +00006770 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006771 return llvm::StringSwitch<bool>(Feature)
6772 .Case("mips", true)
6773 .Case("fp64", HasFP64)
6774 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006775 }
Craig Topper3164f332014-03-11 03:39:26 +00006776 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006777 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006778 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006779 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006780 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006781 // CPU register names
6782 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006783 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6784 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6785 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006786 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6787 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006788 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6789 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6790 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6791 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006792 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006793 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006794 "$fcc5","$fcc6","$fcc7",
6795 // MSA register names
6796 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6797 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6798 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6799 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6800 // MSA control register names
6801 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6802 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006803 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006804 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006805 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006806 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006807 bool validateAsmConstraint(const char *&Name,
6808 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006809 switch (*Name) {
6810 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006811 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006812 case 'r': // CPU registers.
6813 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006814 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006815 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006816 case 'c': // $25 for indirect jumps
6817 case 'l': // lo register
6818 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006819 Info.setAllowsRegister();
6820 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006821 case 'I': // Signed 16-bit constant
6822 case 'J': // Integer 0
6823 case 'K': // Unsigned 16-bit constant
6824 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6825 case 'M': // Constants not loadable via lui, addiu, or ori
6826 case 'N': // Constant -1 to -65535
6827 case 'O': // A signed 15-bit constant
6828 case 'P': // A constant between 1 go 65535
6829 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006830 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006831 Info.setAllowsMemory();
6832 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006833 case 'Z':
6834 if (Name[1] == 'C') { // An address usable by ll, and sc.
6835 Info.setAllowsMemory();
6836 Name++; // Skip over 'Z'.
6837 return true;
6838 }
6839 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006840 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006841 }
6842
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006843 std::string convertConstraint(const char *&Constraint) const override {
6844 std::string R;
6845 switch (*Constraint) {
6846 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6847 if (Constraint[1] == 'C') {
6848 R = std::string("^") + std::string(Constraint, 2);
6849 Constraint++;
6850 return R;
6851 }
6852 break;
6853 }
6854 return TargetInfo::convertConstraint(Constraint);
6855 }
6856
Craig Topper3164f332014-03-11 03:39:26 +00006857 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006858 // In GCC, $1 is not widely used in generated code (it's used only in a few
6859 // specific situations), so there is no real need for users to add it to
6860 // the clobbers list if they want to use it in their inline assembly code.
6861 //
6862 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6863 // code generation, so using it in inline assembly without adding it to the
6864 // clobbers list can cause conflicts between the inline assembly code and
6865 // the surrounding generated code.
6866 //
6867 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6868 // operands, which will conflict with the ".set at" assembler option (which
6869 // we use only for inline assembly, in order to maintain compatibility with
6870 // GCC) and will also conflict with the user's usage of $1.
6871 //
6872 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6873 // register for generated code is to automatically clobber $1 for all inline
6874 // assembly code.
6875 //
6876 // FIXME: We should automatically clobber $1 only for inline assembly code
6877 // which actually uses it. This would allow LLVM to use $1 for inline
6878 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006879 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006880 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006881
Craig Topper3164f332014-03-11 03:39:26 +00006882 bool handleTargetFeatures(std::vector<std::string> &Features,
6883 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006884 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006885 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006886 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006887 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006888 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006889 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006890 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006891
Eric Christopher610fe112015-08-26 08:21:55 +00006892 for (const auto &Feature : Features) {
6893 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006894 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006895 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006896 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006897 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006898 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006899 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006900 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006901 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006902 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006903 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006904 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006905 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006906 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006907 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006908 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006909 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006910 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006911 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006912 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006913 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006914 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006915 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006916
Eric Christopher964a5f32015-08-05 23:48:05 +00006917 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006918
Rafael Espindolaeb265472013-08-21 21:59:03 +00006919 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006920 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006921
Craig Topper3164f332014-03-11 03:39:26 +00006922 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006923 if (RegNo == 0) return 4;
6924 if (RegNo == 1) return 5;
6925 return -1;
6926 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006927
6928 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006929};
6930
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006931const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006932#define BUILTIN(ID, TYPE, ATTRS) \
6933 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6934#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6935 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006936#include "clang/Basic/BuiltinsMips.def"
6937};
6938
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006939class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006940public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006941 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006942 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006943 SizeType = UnsignedInt;
6944 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006945 Int64Type = SignedLongLong;
6946 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006947 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006948 }
Craig Topper3164f332014-03-11 03:39:26 +00006949 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006950 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006951 ABI = Name;
6952 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006953 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006954 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006955 }
Craig Topper3164f332014-03-11 03:39:26 +00006956 void getTargetDefines(const LangOptions &Opts,
6957 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006958 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006959
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006960 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006961 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6962
6963 const std::string& CPUStr = getCPU();
6964 if (CPUStr == "mips32")
6965 Builder.defineMacro("__mips_isa_rev", "1");
6966 else if (CPUStr == "mips32r2")
6967 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006968 else if (CPUStr == "mips32r3")
6969 Builder.defineMacro("__mips_isa_rev", "3");
6970 else if (CPUStr == "mips32r5")
6971 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006972 else if (CPUStr == "mips32r6")
6973 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006974
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006975 if (ABI == "o32") {
6976 Builder.defineMacro("__mips_o32");
6977 Builder.defineMacro("_ABIO32", "1");
6978 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6979 }
6980 else if (ABI == "eabi")
6981 Builder.defineMacro("__mips_eabi");
6982 else
David Blaikie83d382b2011-09-23 05:06:16 +00006983 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006984 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006985 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006986 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6987 { { "at" }, "$1" },
6988 { { "v0" }, "$2" },
6989 { { "v1" }, "$3" },
6990 { { "a0" }, "$4" },
6991 { { "a1" }, "$5" },
6992 { { "a2" }, "$6" },
6993 { { "a3" }, "$7" },
6994 { { "t0" }, "$8" },
6995 { { "t1" }, "$9" },
6996 { { "t2" }, "$10" },
6997 { { "t3" }, "$11" },
6998 { { "t4" }, "$12" },
6999 { { "t5" }, "$13" },
7000 { { "t6" }, "$14" },
7001 { { "t7" }, "$15" },
7002 { { "s0" }, "$16" },
7003 { { "s1" }, "$17" },
7004 { { "s2" }, "$18" },
7005 { { "s3" }, "$19" },
7006 { { "s4" }, "$20" },
7007 { { "s5" }, "$21" },
7008 { { "s6" }, "$22" },
7009 { { "s7" }, "$23" },
7010 { { "t8" }, "$24" },
7011 { { "t9" }, "$25" },
7012 { { "k0" }, "$26" },
7013 { { "k1" }, "$27" },
7014 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007015 { { "sp","$sp" }, "$29" },
7016 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007017 { { "ra" }, "$31" }
7018 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007019 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007020 }
7021};
7022
7023class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00007024 void setDataLayoutString() override {
7025 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00007026 }
7027
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007028public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007029 Mips32EBTargetInfo(const llvm::Triple &Triple)
7030 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007031 }
Craig Topper3164f332014-03-11 03:39:26 +00007032 void getTargetDefines(const LangOptions &Opts,
7033 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007034 DefineStd(Builder, "MIPSEB", Opts);
7035 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007036 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007037 }
7038};
7039
7040class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00007041 void setDataLayoutString() override {
7042 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00007043 }
7044
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007045public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007046 Mips32ELTargetInfo(const llvm::Triple &Triple)
7047 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007048 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007049 }
Craig Topper3164f332014-03-11 03:39:26 +00007050 void getTargetDefines(const LangOptions &Opts,
7051 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007052 DefineStd(Builder, "MIPSEL", Opts);
7053 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007054 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007055 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007056};
Akira Hatanakabef17452011-09-20 19:21:49 +00007057
7058class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00007059public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007060 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00007061 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007062 LongDoubleWidth = LongDoubleAlign = 128;
7063 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00007064 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7065 LongDoubleWidth = LongDoubleAlign = 64;
7066 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7067 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007068 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00007069 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00007070 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00007071 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007072
7073 void setN64ABITypes() {
7074 LongWidth = LongAlign = 64;
7075 PointerWidth = PointerAlign = 64;
7076 SizeType = UnsignedLong;
7077 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007078 Int64Type = SignedLong;
7079 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007080 }
7081
7082 void setN32ABITypes() {
7083 LongWidth = LongAlign = 32;
7084 PointerWidth = PointerAlign = 32;
7085 SizeType = UnsignedInt;
7086 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00007087 Int64Type = SignedLongLong;
7088 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007089 }
7090
Craig Topper3164f332014-03-11 03:39:26 +00007091 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00007092 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007093 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007094 ABI = Name;
7095 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00007096 }
Simon Atanasyanad805952014-07-01 10:59:09 +00007097 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00007098 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00007099 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007100 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00007101 }
7102 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007103 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00007104
Craig Topper3164f332014-03-11 03:39:26 +00007105 void getTargetDefines(const LangOptions &Opts,
7106 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007107 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007108
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007109 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007110 Builder.defineMacro("__mips64");
7111 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007112 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7113
7114 const std::string& CPUStr = getCPU();
7115 if (CPUStr == "mips64")
7116 Builder.defineMacro("__mips_isa_rev", "1");
7117 else if (CPUStr == "mips64r2")
7118 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007119 else if (CPUStr == "mips64r3")
7120 Builder.defineMacro("__mips_isa_rev", "3");
7121 else if (CPUStr == "mips64r5")
7122 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007123 else if (CPUStr == "mips64r6")
7124 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007125
Akira Hatanakabef17452011-09-20 19:21:49 +00007126 if (ABI == "n32") {
7127 Builder.defineMacro("__mips_n32");
7128 Builder.defineMacro("_ABIN32", "2");
7129 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7130 }
7131 else if (ABI == "n64") {
7132 Builder.defineMacro("__mips_n64");
7133 Builder.defineMacro("_ABI64", "3");
7134 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7135 }
7136 else
David Blaikie83d382b2011-09-23 05:06:16 +00007137 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007138
7139 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007140 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007141 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007142 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7143 { { "at" }, "$1" },
7144 { { "v0" }, "$2" },
7145 { { "v1" }, "$3" },
7146 { { "a0" }, "$4" },
7147 { { "a1" }, "$5" },
7148 { { "a2" }, "$6" },
7149 { { "a3" }, "$7" },
7150 { { "a4" }, "$8" },
7151 { { "a5" }, "$9" },
7152 { { "a6" }, "$10" },
7153 { { "a7" }, "$11" },
7154 { { "t0" }, "$12" },
7155 { { "t1" }, "$13" },
7156 { { "t2" }, "$14" },
7157 { { "t3" }, "$15" },
7158 { { "s0" }, "$16" },
7159 { { "s1" }, "$17" },
7160 { { "s2" }, "$18" },
7161 { { "s3" }, "$19" },
7162 { { "s4" }, "$20" },
7163 { { "s5" }, "$21" },
7164 { { "s6" }, "$22" },
7165 { { "s7" }, "$23" },
7166 { { "t8" }, "$24" },
7167 { { "t9" }, "$25" },
7168 { { "k0" }, "$26" },
7169 { { "k1" }, "$27" },
7170 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007171 { { "sp","$sp" }, "$29" },
7172 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007173 { { "ra" }, "$31" }
7174 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007175 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007176 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007177
7178 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007179};
7180
7181class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00007182 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007183 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00007184 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00007185 else
Eric Christopher964a5f32015-08-05 23:48:05 +00007186 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00007187
Akira Hatanakabef17452011-09-20 19:21:49 +00007188 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007189
Akira Hatanakabef17452011-09-20 19:21:49 +00007190public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007191 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00007192 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00007193 void getTargetDefines(const LangOptions &Opts,
7194 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007195 DefineStd(Builder, "MIPSEB", Opts);
7196 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007197 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007198 }
7199};
7200
7201class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00007202 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007203 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00007204 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00007205 else
Eric Christopher964a5f32015-08-05 23:48:05 +00007206 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00007207 }
7208public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007209 Mips64ELTargetInfo(const llvm::Triple &Triple)
7210 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007211 // Default ABI is n64.
7212 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007213 }
Craig Topper3164f332014-03-11 03:39:26 +00007214 void getTargetDefines(const LangOptions &Opts,
7215 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007216 DefineStd(Builder, "MIPSEL", Opts);
7217 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007218 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007219 }
7220};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007221
Ivan Krasindd7403e2011-08-24 20:22:22 +00007222class PNaClTargetInfo : public TargetInfo {
7223public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007224 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007225 BigEndian = false;
James Y Knighta3518ad2016-01-27 01:04:51 +00007226 this->UserLabelPrefix = "";
Ivan Krasindd7403e2011-08-24 20:22:22 +00007227 this->LongAlign = 32;
7228 this->LongWidth = 32;
7229 this->PointerAlign = 32;
7230 this->PointerWidth = 32;
7231 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007232 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007233 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007234 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007235 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007236 this->SizeType = TargetInfo::UnsignedInt;
7237 this->PtrDiffType = TargetInfo::SignedInt;
7238 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007239 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007240 }
7241
Craig Toppere6f17d02014-03-11 04:07:52 +00007242 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007243 Builder.defineMacro("__le32__");
7244 Builder.defineMacro("__pnacl__");
7245 }
Craig Topper3164f332014-03-11 03:39:26 +00007246 void getTargetDefines(const LangOptions &Opts,
7247 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007248 getArchDefines(Opts, Builder);
7249 }
Craig Topper3164f332014-03-11 03:39:26 +00007250 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007251 return Feature == "pnacl";
7252 }
Craig Topper6c03a542015-10-19 04:51:35 +00007253 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007254 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007255 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007256 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007257 ArrayRef<const char *> getGCCRegNames() const override;
7258 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007259 bool validateAsmConstraint(const char *&Name,
7260 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007261 return false;
7262 }
7263
Craig Topper3164f332014-03-11 03:39:26 +00007264 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007265 return "";
7266 }
7267};
7268
Craig Topperf054e3a2015-10-19 03:52:27 +00007269ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7270 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007271}
7272
Craig Topperf054e3a2015-10-19 03:52:27 +00007273ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7274 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007275}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007276
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007277// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7278class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7279public:
7280 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00007281 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007282 }
7283
7284 BuiltinVaListKind getBuiltinVaListKind() const override {
7285 return TargetInfo::PNaClABIBuiltinVaList;
7286 }
7287};
7288
JF Bastien643817d2014-09-12 17:52:47 +00007289class Le64TargetInfo : public TargetInfo {
7290 static const Builtin::Info BuiltinInfo[];
7291
7292public:
7293 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7294 BigEndian = false;
7295 NoAsmVariants = true;
7296 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7297 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00007298 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00007299 }
7300
7301 void getTargetDefines(const LangOptions &Opts,
7302 MacroBuilder &Builder) const override {
7303 DefineStd(Builder, "unix", Opts);
7304 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7305 Builder.defineMacro("__ELF__");
7306 }
Craig Topper6c03a542015-10-19 04:51:35 +00007307 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7308 return llvm::makeArrayRef(BuiltinInfo,
7309 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007310 }
7311 BuiltinVaListKind getBuiltinVaListKind() const override {
7312 return TargetInfo::PNaClABIBuiltinVaList;
7313 }
7314 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007315 ArrayRef<const char *> getGCCRegNames() const override {
7316 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007317 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007318 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7319 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007320 }
7321 bool validateAsmConstraint(const char *&Name,
7322 TargetInfo::ConstraintInfo &Info) const override {
7323 return false;
7324 }
7325
7326 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007327};
Dan Gohmanc2853072015-09-03 22:51:53 +00007328
7329class WebAssemblyTargetInfo : public TargetInfo {
7330 static const Builtin::Info BuiltinInfo[];
7331
7332 enum SIMDEnum {
7333 NoSIMD,
7334 SIMD128,
7335 } SIMDLevel;
7336
7337public:
7338 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
7339 : TargetInfo(T), SIMDLevel(NoSIMD) {
7340 BigEndian = false;
7341 NoAsmVariants = true;
7342 SuitableAlign = 128;
7343 LargeArrayMinWidth = 128;
7344 LargeArrayAlign = 128;
7345 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007346 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007347 LongDoubleWidth = LongDoubleAlign = 128;
7348 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007349 }
7350
7351protected:
7352 void getTargetDefines(const LangOptions &Opts,
7353 MacroBuilder &Builder) const override {
7354 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7355 if (SIMDLevel >= SIMD128)
7356 Builder.defineMacro("__wasm_simd128__");
7357 }
7358
7359private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007360 bool
7361 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7362 StringRef CPU,
7363 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007364 if (CPU == "bleeding-edge")
7365 Features["simd128"] = true;
7366 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7367 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007368 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007369 return llvm::StringSwitch<bool>(Feature)
7370 .Case("simd128", SIMDLevel >= SIMD128)
7371 .Default(false);
7372 }
7373 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007374 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007375 for (const auto &Feature : Features) {
7376 if (Feature == "+simd128") {
7377 SIMDLevel = std::max(SIMDLevel, SIMD128);
7378 continue;
7379 }
7380 if (Feature == "-simd128") {
7381 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7382 continue;
7383 }
7384
7385 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7386 << "-target-feature";
7387 return false;
7388 }
7389 return true;
7390 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007391 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007392 return llvm::StringSwitch<bool>(Name)
7393 .Case("mvp", true)
7394 .Case("bleeding-edge", true)
7395 .Case("generic", true)
7396 .Default(false);
7397 }
Craig Topper6c03a542015-10-19 04:51:35 +00007398 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7399 return llvm::makeArrayRef(BuiltinInfo,
7400 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007401 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007402 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007403 return VoidPtrBuiltinVaList;
7404 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007405 ArrayRef<const char *> getGCCRegNames() const final {
7406 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007407 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007408 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7409 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007410 }
7411 bool
7412 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007413 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007414 return false;
7415 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007416 const char *getClobbers() const final { return ""; }
7417 bool isCLZForZeroUndef() const final { return false; }
7418 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007419 IntType getIntTypeByWidth(unsigned BitWidth,
7420 bool IsSigned) const final {
7421 // WebAssembly prefers long long for explicitly 64-bit integers.
7422 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7423 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7424 }
7425 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7426 bool IsSigned) const final {
7427 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7428 return BitWidth == 64
7429 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7430 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7431 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007432};
7433
7434const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7435#define BUILTIN(ID, TYPE, ATTRS) \
7436 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7437#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7438 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7439#include "clang/Basic/BuiltinsWebAssembly.def"
7440};
7441
7442class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7443public:
7444 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7445 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007446 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohman0d75f2c2016-01-07 03:20:15 +00007447 DataLayoutString = "e-m:e-p:32:32-i64:64-n32:64-S128";
Dan Gohmanc2853072015-09-03 22:51:53 +00007448 }
7449
7450protected:
7451 void getTargetDefines(const LangOptions &Opts,
7452 MacroBuilder &Builder) const override {
7453 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7454 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7455 }
7456};
7457
7458class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7459public:
7460 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7461 : WebAssemblyTargetInfo(T) {
7462 LongAlign = LongWidth = 64;
7463 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007464 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohman0d75f2c2016-01-07 03:20:15 +00007465 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Dan Gohmanc2853072015-09-03 22:51:53 +00007466 }
7467
7468protected:
7469 void getTargetDefines(const LangOptions &Opts,
7470 MacroBuilder &Builder) const override {
7471 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7472 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7473 }
7474};
7475
JF Bastien643817d2014-09-12 17:52:47 +00007476const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7477#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007478 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007479#include "clang/Basic/BuiltinsLe64.def"
7480};
7481
Eric Christopherc48497a2015-09-18 21:26:24 +00007482static const unsigned SPIRAddrSpaceMap[] = {
7483 1, // opencl_global
7484 3, // opencl_local
7485 2, // opencl_constant
7486 4, // opencl_generic
7487 0, // cuda_device
7488 0, // cuda_constant
7489 0 // cuda_shared
7490};
7491class SPIRTargetInfo : public TargetInfo {
7492public:
7493 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7494 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7495 "SPIR target must use unknown OS");
7496 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7497 "SPIR target must use unknown environment type");
7498 BigEndian = false;
7499 TLSSupported = false;
7500 LongWidth = LongAlign = 64;
7501 AddrSpaceMap = &SPIRAddrSpaceMap;
7502 UseAddrSpaceMapMangling = true;
7503 // Define available target features
7504 // These must be defined in sorted order!
7505 NoAsmVariants = true;
7506 }
7507 void getTargetDefines(const LangOptions &Opts,
7508 MacroBuilder &Builder) const override {
7509 DefineStd(Builder, "SPIR", Opts);
7510 }
7511 bool hasFeature(StringRef Feature) const override {
7512 return Feature == "spir";
7513 }
Craig Topper3164f332014-03-11 03:39:26 +00007514
Craig Topper6c03a542015-10-19 04:51:35 +00007515 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007516 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007517 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007518 bool validateAsmConstraint(const char *&Name,
7519 TargetInfo::ConstraintInfo &info) const override {
7520 return true;
7521 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007522 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7523 return None;
7524 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007525 BuiltinVaListKind getBuiltinVaListKind() const override {
7526 return TargetInfo::VoidPtrBuiltinVaList;
7527 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007528
Eric Christopherc48497a2015-09-18 21:26:24 +00007529 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7530 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7531 : CCCR_Warning;
7532 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007533
Eric Christopherc48497a2015-09-18 21:26:24 +00007534 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7535 return CC_SpirFunction;
7536 }
7537};
Guy Benyeib798fc92012-12-11 21:38:14 +00007538
Eric Christopherc48497a2015-09-18 21:26:24 +00007539class SPIR32TargetInfo : public SPIRTargetInfo {
7540public:
7541 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7542 PointerWidth = PointerAlign = 32;
7543 SizeType = TargetInfo::UnsignedInt;
7544 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7545 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7546 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7547 }
7548 void getTargetDefines(const LangOptions &Opts,
7549 MacroBuilder &Builder) const override {
7550 DefineStd(Builder, "SPIR32", Opts);
7551 }
7552};
Guy Benyeib798fc92012-12-11 21:38:14 +00007553
Eric Christopherc48497a2015-09-18 21:26:24 +00007554class SPIR64TargetInfo : public SPIRTargetInfo {
7555public:
7556 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7557 PointerWidth = PointerAlign = 64;
7558 SizeType = TargetInfo::UnsignedLong;
7559 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7560 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7561 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7562 }
7563 void getTargetDefines(const LangOptions &Opts,
7564 MacroBuilder &Builder) const override {
7565 DefineStd(Builder, "SPIR64", Opts);
7566 }
7567};
Guy Benyeib798fc92012-12-11 21:38:14 +00007568
Robert Lytton0e076492013-08-13 09:43:10 +00007569class XCoreTargetInfo : public TargetInfo {
7570 static const Builtin::Info BuiltinInfo[];
7571public:
7572 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7573 BigEndian = false;
7574 NoAsmVariants = true;
7575 LongLongAlign = 32;
7576 SuitableAlign = 32;
7577 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007578 SizeType = UnsignedInt;
7579 PtrDiffType = SignedInt;
7580 IntPtrType = SignedInt;
7581 WCharType = UnsignedChar;
7582 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007583 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007584 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7585 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007586 }
Craig Topper3164f332014-03-11 03:39:26 +00007587 void getTargetDefines(const LangOptions &Opts,
7588 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007589 Builder.defineMacro("__XS1B__");
7590 }
Craig Topper6c03a542015-10-19 04:51:35 +00007591 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7592 return llvm::makeArrayRef(BuiltinInfo,
7593 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007594 }
Craig Topper3164f332014-03-11 03:39:26 +00007595 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007596 return TargetInfo::VoidPtrBuiltinVaList;
7597 }
Craig Topper3164f332014-03-11 03:39:26 +00007598 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007599 return "";
7600 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007601 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007602 static const char * const GCCRegNames[] = {
7603 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7604 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7605 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007606 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007607 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007608 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7609 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007610 }
Craig Topper3164f332014-03-11 03:39:26 +00007611 bool validateAsmConstraint(const char *&Name,
7612 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007613 return false;
7614 }
Craig Topper3164f332014-03-11 03:39:26 +00007615 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007616 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7617 return (RegNo < 2)? RegNo : -1;
7618 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00007619 bool allowsLargerPreferedTypeAlignment() const override {
7620 return false;
7621 }
Robert Lytton0e076492013-08-13 09:43:10 +00007622};
7623
7624const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007625#define BUILTIN(ID, TYPE, ATTRS) \
7626 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7627#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7628 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007629#include "clang/Basic/BuiltinsXCore.def"
7630};
Robert Lytton0e076492013-08-13 09:43:10 +00007631
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007632// x86_32 Android target
7633class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7634public:
7635 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7636 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7637 SuitableAlign = 32;
7638 LongDoubleWidth = 64;
7639 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7640 }
7641};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007642
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007643// x86_64 Android target
7644class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7645public:
7646 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7647 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7648 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7649 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007650
7651 bool useFloat128ManglingForLongDouble() const override {
7652 return true;
7653 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007654};
7655} // end anonymous namespace
7656
Chris Lattner5ba61f02006-10-14 07:39:34 +00007657//===----------------------------------------------------------------------===//
7658// Driver code
7659//===----------------------------------------------------------------------===//
7660
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007661static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007662 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007663
Daniel Dunbar52322032009-08-18 05:47:58 +00007664 switch (Triple.getArch()) {
7665 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007666 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007667
Tim Northover2a0783d2014-05-30 14:14:07 +00007668 case llvm::Triple::xcore:
7669 return new XCoreTargetInfo(Triple);
7670
7671 case llvm::Triple::hexagon:
7672 return new HexagonTargetInfo(Triple);
7673
7674 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007675 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007676 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007677
7678 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007679 case llvm::Triple::CloudABI:
7680 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple);
Ed Maste6a9eda52014-11-13 16:55:42 +00007681 case llvm::Triple::FreeBSD:
7682 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007683 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007684 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007685 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007686 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007687 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007688 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007689 }
7690
Christian Pirker9b019ae2014-02-25 13:51:00 +00007691 case llvm::Triple::aarch64_be:
7692 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007693 case llvm::Triple::FreeBSD:
7694 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007695 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007696 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007697 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007698 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007699 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007700 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007701 }
7702
Daniel Dunbar52322032009-08-18 05:47:58 +00007703 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007704 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007705 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007706 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007707
Daniel Dunbar52322032009-08-18 05:47:58 +00007708 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007709 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007710 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007711 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007712 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007713 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007714 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007715 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007716 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007717 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007718 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007719 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007720 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007721 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007722 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007723 case llvm::Triple::Win32:
7724 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007725 case llvm::Triple::Cygnus:
7726 return new CygwinARMTargetInfo(Triple);
7727 case llvm::Triple::GNU:
7728 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007729 case llvm::Triple::Itanium:
7730 return new ItaniumWindowsARMleTargetInfo(Triple);
7731 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007732 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007733 return new MicrosoftARMleTargetInfo(Triple);
7734 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007735 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007736 return new ARMleTargetInfo(Triple);
7737 }
7738
7739 case llvm::Triple::armeb:
7740 case llvm::Triple::thumbeb:
7741 if (Triple.isOSDarwin())
7742 return new DarwinARMTargetInfo(Triple);
7743
7744 switch (os) {
7745 case llvm::Triple::Linux:
7746 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7747 case llvm::Triple::FreeBSD:
7748 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7749 case llvm::Triple::NetBSD:
7750 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7751 case llvm::Triple::OpenBSD:
7752 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7753 case llvm::Triple::Bitrig:
7754 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7755 case llvm::Triple::RTEMS:
7756 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7757 case llvm::Triple::NaCl:
7758 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7759 default:
7760 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007761 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007762
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007763 case llvm::Triple::bpfeb:
7764 case llvm::Triple::bpfel:
7765 return new BPFTargetInfo(Triple);
7766
Daniel Dunbar52322032009-08-18 05:47:58 +00007767 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007768 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007769
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007770 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007771 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007772 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007773 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007774 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007775 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007776 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007777 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007778 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007779 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007780 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007781 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007782 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007783
7784 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007785 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007786 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007787 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007788 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007789 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007790 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007791 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007792 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007793 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007794 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007795 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007796 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007797 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007798 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007799
Akira Hatanakabef17452011-09-20 19:21:49 +00007800 case llvm::Triple::mips64:
7801 switch (os) {
7802 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007803 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007804 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007805 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007806 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007807 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007808 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007809 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007810 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007811 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007812 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007813 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007814 }
7815
7816 case llvm::Triple::mips64el:
7817 switch (os) {
7818 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007819 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007820 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007821 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007822 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007823 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007824 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007825 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007826 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007827 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007828 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007829 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007830 }
7831
Ivan Krasindd7403e2011-08-24 20:22:22 +00007832 case llvm::Triple::le32:
7833 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007834 case llvm::Triple::NaCl:
7835 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7836 default:
7837 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007838 }
7839
JF Bastien643817d2014-09-12 17:52:47 +00007840 case llvm::Triple::le64:
7841 return new Le64TargetInfo(Triple);
7842
Daniel Dunbar52322032009-08-18 05:47:58 +00007843 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007844 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007845 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007846 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007847 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007848 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007849 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007850 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007851 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007852 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007853 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007854 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007855 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007856 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007857 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007858 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007859 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007860
7861 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007862 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007863 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007864 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007865 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007866 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007867 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007868 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007869 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007870 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007871 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007872 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007873 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007874 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007875 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007876
Bill Schmidt778d3872013-07-26 01:36:11 +00007877 case llvm::Triple::ppc64le:
7878 switch (os) {
7879 case llvm::Triple::Linux:
7880 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007881 case llvm::Triple::NetBSD:
7882 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007883 default:
7884 return new PPC64TargetInfo(Triple);
7885 }
7886
Peter Collingbournec947aae2012-05-20 23:28:41 +00007887 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007888 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007889 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007890 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007891
Tom Stellardd8e38a32015-01-06 20:34:47 +00007892 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007893 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007894 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007895
Daniel Dunbar52322032009-08-18 05:47:58 +00007896 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007897 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007898 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007899 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007900 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007901 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007902 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007903 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007904 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007905 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007906 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007907 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007908 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007909 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007910 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007911
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007912 // The 'sparcel' architecture copies all the above cases except for Solaris.
7913 case llvm::Triple::sparcel:
7914 switch (os) {
7915 case llvm::Triple::Linux:
7916 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7917 case llvm::Triple::NetBSD:
7918 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7919 case llvm::Triple::OpenBSD:
7920 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7921 case llvm::Triple::RTEMS:
7922 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7923 default:
7924 return new SparcV8elTargetInfo(Triple);
7925 }
7926
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007927 case llvm::Triple::sparcv9:
7928 switch (os) {
7929 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007930 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007931 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007932 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007933 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007934 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007935 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007936 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007937 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007938 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007939 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007940 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007941 }
7942
Ulrich Weigand47445072013-05-06 16:26:41 +00007943 case llvm::Triple::systemz:
7944 switch (os) {
7945 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007946 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007947 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007948 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007949 }
7950
Eli Friedmana9c3d712009-08-19 20:47:07 +00007951 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007952 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007953
Daniel Dunbar52322032009-08-18 05:47:58 +00007954 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007955 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007956 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007957
Daniel Dunbar52322032009-08-18 05:47:58 +00007958 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007959 case llvm::Triple::CloudABI:
7960 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007961 case llvm::Triple::Linux: {
7962 switch (Triple.getEnvironment()) {
7963 default:
7964 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7965 case llvm::Triple::Android:
7966 return new AndroidX86_32TargetInfo(Triple);
7967 }
7968 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007969 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007970 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007971 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007972 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007973 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007974 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007975 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007976 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007977 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007978 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007979 case llvm::Triple::KFreeBSD:
7980 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007981 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007982 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007983 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007984 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007985 case llvm::Triple::Win32: {
7986 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007987 case llvm::Triple::Cygnus:
7988 return new CygwinX86_32TargetInfo(Triple);
7989 case llvm::Triple::GNU:
7990 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007991 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007992 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007993 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007994 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007995 }
7996 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007997 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007998 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007999 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008000 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008001 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008002 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008003 case llvm::Triple::ELFIAMCU:
8004 return new MCUX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008005 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008006 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008007 }
8008
8009 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008010 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008011 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008012
Daniel Dunbar52322032009-08-18 05:47:58 +00008013 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008014 case llvm::Triple::CloudABI:
8015 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008016 case llvm::Triple::Linux: {
8017 switch (Triple.getEnvironment()) {
8018 default:
8019 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
8020 case llvm::Triple::Android:
8021 return new AndroidX86_64TargetInfo(Triple);
8022 }
8023 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008024 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008025 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008026 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008027 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008028 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008029 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00008030 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008031 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008032 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008033 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008034 case llvm::Triple::KFreeBSD:
8035 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008036 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008037 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008038 case llvm::Triple::Win32: {
8039 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008040 case llvm::Triple::Cygnus:
8041 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008042 case llvm::Triple::GNU:
8043 return new MinGWX86_64TargetInfo(Triple);
8044 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008045 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00008046 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008047 }
8048 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00008049 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008050 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008051 case llvm::Triple::PS4:
8052 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008053 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00008054 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008055 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008056
Douglas Katzman78d7c542015-05-12 21:18:10 +00008057 case llvm::Triple::spir: {
8058 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8059 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8060 return nullptr;
8061 return new SPIR32TargetInfo(Triple);
8062 }
8063 case llvm::Triple::spir64: {
8064 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8065 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8066 return nullptr;
8067 return new SPIR64TargetInfo(Triple);
8068 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008069 case llvm::Triple::wasm32:
8070 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8071 return nullptr;
8072 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
8073 case llvm::Triple::wasm64:
8074 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8075 return nullptr;
8076 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00008077 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008078}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008079
8080/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008081/// options.
Alp Toker80758082014-07-06 05:26:44 +00008082TargetInfo *
8083TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
8084 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008085 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008086
8087 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00008088 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008089 if (!Target) {
8090 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008091 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008092 }
Alp Toker80758082014-07-06 05:26:44 +00008093 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008094
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008095 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008096 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8097 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008098 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008099 }
8100
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008101 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008102 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8103 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008104 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008105 }
8106
Rafael Espindolaeb265472013-08-21 21:59:03 +00008107 // Set the fp math unit.
8108 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8109 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008110 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008111 }
8112
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008113 // Compute the default target features, we need the target to handle this
8114 // because features may have dependencies on one another.
8115 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008116 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8117 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008118 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008119
8120 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008121 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008122 for (const auto &F : Features)
8123 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8124
Eric Christopher3ff21b32013-10-16 21:26:26 +00008125 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008126 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008127
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008128 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008129}