blob: 3f4c1aa12c93e351ce29664b67ed9602bf892907 [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
609 switch (Triple.getArch()) {
610 default:
611 case llvm::Triple::x86_64:
612 this->MCountName = ".mcount";
613 break;
614 }
615 }
616};
617
Torok Edwinb2b37c62009-06-30 17:10:35 +0000618// Solaris target
619template<typename Target>
620class SolarisTargetInfo : public OSTargetInfo<Target> {
621protected:
Craig Topper3164f332014-03-11 03:39:26 +0000622 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
623 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000624 DefineStd(Builder, "sun", Opts);
625 DefineStd(Builder, "unix", Opts);
626 Builder.defineMacro("__ELF__");
627 Builder.defineMacro("__svr4__");
628 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000629 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
630 // newer, but to 500 for everything else. feature_test.h has a check to
631 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000632 // with a new version.
633 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000634 Builder.defineMacro("_XOPEN_SOURCE", "600");
635 else
636 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000637 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000638 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000639 Builder.defineMacro("_LARGEFILE_SOURCE");
640 Builder.defineMacro("_LARGEFILE64_SOURCE");
641 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000642 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000643 }
644public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000645 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000646 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000647 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000648 // FIXME: WIntType should be SignedLong
649 }
650};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000651
652// Windows target
653template<typename Target>
654class WindowsTargetInfo : public OSTargetInfo<Target> {
655protected:
Craig Topper3164f332014-03-11 03:39:26 +0000656 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
657 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000658 Builder.defineMacro("_WIN32");
659 }
660 void getVisualStudioDefines(const LangOptions &Opts,
661 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000662 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000663 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000664 Builder.defineMacro("_CPPRTTI");
665
Reid Kleckner16514352015-01-30 21:42:55 +0000666 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000667 Builder.defineMacro("_CPPUNWIND");
668 }
669
David Majnemer6a658902015-07-22 22:36:26 +0000670 if (Opts.Bool)
671 Builder.defineMacro("__BOOL_DEFINED");
672
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000673 if (!Opts.CharIsSigned)
674 Builder.defineMacro("_CHAR_UNSIGNED");
675
676 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
677 // but it works for now.
678 if (Opts.POSIXThreads)
679 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000680
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000681 if (Opts.MSCompatibilityVersion) {
682 Builder.defineMacro("_MSC_VER",
683 Twine(Opts.MSCompatibilityVersion / 100000));
684 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000685 // FIXME We cannot encode the revision information into 32-bits
686 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000687
David Majnemerb710a932015-05-11 03:57:49 +0000688 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000689 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000690 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000691
692 if (Opts.MicrosoftExt) {
693 Builder.defineMacro("_MSC_EXTENSIONS");
694
695 if (Opts.CPlusPlus11) {
696 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
697 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
698 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
699 }
700 }
701
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000702 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000703 }
704
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000705public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000706 WindowsTargetInfo(const llvm::Triple &Triple)
707 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000708};
709
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000710template <typename Target>
711class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000712protected:
Craig Topper3164f332014-03-11 03:39:26 +0000713 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
714 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000715 if (Opts.POSIXThreads)
716 Builder.defineMacro("_REENTRANT");
717 if (Opts.CPlusPlus)
718 Builder.defineMacro("_GNU_SOURCE");
719
720 DefineStd(Builder, "unix", Opts);
721 Builder.defineMacro("__ELF__");
722 Builder.defineMacro("__native_client__");
723 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000724
725public:
726 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +0000727 this->UserLabelPrefix = "";
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000728 this->LongAlign = 32;
729 this->LongWidth = 32;
730 this->PointerAlign = 32;
731 this->PointerWidth = 32;
732 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000733 this->Int64Type = TargetInfo::SignedLongLong;
734 this->DoubleAlign = 64;
735 this->LongDoubleWidth = 64;
736 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000737 this->LongLongWidth = 64;
738 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000739 this->SizeType = TargetInfo::UnsignedInt;
740 this->PtrDiffType = TargetInfo::SignedInt;
741 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000742 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000743 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000744 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000745 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000746 } else if (Triple.getArch() == llvm::Triple::x86) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000747 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000748 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000749 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000750 } else if (Triple.getArch() == llvm::Triple::mipsel) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000751 // Handled on mips' setDataLayoutString.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000752 } else {
753 assert(Triple.getArch() == llvm::Triple::le32);
Eric Christopher964a5f32015-08-05 23:48:05 +0000754 this->DataLayoutString = "e-p:32:32-i64:64";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000755 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000756 }
757};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000758
Dan Gohmanc2853072015-09-03 22:51:53 +0000759// WebAssembly target
760template <typename Target>
761class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
762 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000763 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000764 // A common platform macro.
765 if (Opts.POSIXThreads)
766 Builder.defineMacro("_REENTRANT");
767 // Follow g++ convention and predefine _GNU_SOURCE for C++.
768 if (Opts.CPlusPlus)
769 Builder.defineMacro("_GNU_SOURCE");
770 }
771
772 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000773 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000774 return ".text.__startup";
775 }
776
777public:
778 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
779 : OSTargetInfo<Target>(Triple) {
780 this->MCountName = "__mcount";
James Y Knighta3518ad2016-01-27 01:04:51 +0000781 this->UserLabelPrefix = "";
Dan Gohmanc2853072015-09-03 22:51:53 +0000782 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
783 }
784};
Dan Gohmanc2853072015-09-03 22:51:53 +0000785
Chris Lattner09d98f52008-10-05 21:50:58 +0000786//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000787// Specific target implementations.
788//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000789
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000790// PPC abstract base class
791class PPCTargetInfo : public TargetInfo {
792 static const Builtin::Info BuiltinInfo[];
793 static const char * const GCCRegNames[];
794 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000795 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000796
797 // Target cpu features.
798 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000799 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000800 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000801 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000802 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000803 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000804 bool HasBPERMD;
805 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000806
Ulrich Weigand8afad612014-07-28 13:17:52 +0000807protected:
808 std::string ABI;
809
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000810public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000811 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000812 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000813 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000814 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000815 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000816 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000817 LongDoubleWidth = LongDoubleAlign = 128;
818 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
819 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000820
Hal Finkel6b984f02012-07-03 16:51:04 +0000821 /// \brief Flags for architecture specific defines.
822 typedef enum {
823 ArchDefineNone = 0,
824 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
825 ArchDefinePpcgr = 1 << 1,
826 ArchDefinePpcsq = 1 << 2,
827 ArchDefine440 = 1 << 3,
828 ArchDefine603 = 1 << 4,
829 ArchDefine604 = 1 << 5,
830 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000831 ArchDefinePwr5 = 1 << 7,
832 ArchDefinePwr5x = 1 << 8,
833 ArchDefinePwr6 = 1 << 9,
834 ArchDefinePwr6x = 1 << 10,
835 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000836 ArchDefinePwr8 = 1 << 12,
837 ArchDefineA2 = 1 << 13,
838 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000839 } ArchDefineTypes;
840
Bill Schmidt38378a02013-02-01 20:23:10 +0000841 // Note: GCC recognizes the following additional cpus:
842 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
843 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
844 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000845 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000846 bool CPUKnown = llvm::StringSwitch<bool>(Name)
847 .Case("generic", true)
848 .Case("440", true)
849 .Case("450", true)
850 .Case("601", true)
851 .Case("602", true)
852 .Case("603", true)
853 .Case("603e", true)
854 .Case("603ev", true)
855 .Case("604", true)
856 .Case("604e", true)
857 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000858 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000859 .Case("g3", true)
860 .Case("7400", true)
861 .Case("g4", true)
862 .Case("7450", true)
863 .Case("g4+", true)
864 .Case("750", true)
865 .Case("970", true)
866 .Case("g5", true)
867 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000868 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000869 .Case("e500mc", true)
870 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000871 .Case("power3", true)
872 .Case("pwr3", true)
873 .Case("power4", true)
874 .Case("pwr4", true)
875 .Case("power5", true)
876 .Case("pwr5", true)
877 .Case("power5x", true)
878 .Case("pwr5x", true)
879 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000880 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000881 .Case("power6x", true)
882 .Case("pwr6x", true)
883 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000884 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000885 .Case("power8", true)
886 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000887 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000888 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000889 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000890 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000891 .Case("powerpc64le", true)
892 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000893 .Default(false);
894
895 if (CPUKnown)
896 CPU = Name;
897
898 return CPUKnown;
899 }
900
Ulrich Weigand8afad612014-07-28 13:17:52 +0000901
902 StringRef getABI() const override { return ABI; }
903
Craig Topper6c03a542015-10-19 04:51:35 +0000904 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
905 return llvm::makeArrayRef(BuiltinInfo,
906 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000907 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000908
Craig Topper3164f332014-03-11 03:39:26 +0000909 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000910
Craig Topper3164f332014-03-11 03:39:26 +0000911 void getTargetDefines(const LangOptions &Opts,
912 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000913
Eric Christopher8c47b422015-10-09 18:39:55 +0000914 bool
915 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
916 StringRef CPU,
917 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000918
Craig Topper3164f332014-03-11 03:39:26 +0000919 bool handleTargetFeatures(std::vector<std::string> &Features,
920 DiagnosticsEngine &Diags) override;
921 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000922 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
923 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000924
Craig Topperf054e3a2015-10-19 03:52:27 +0000925 ArrayRef<const char *> getGCCRegNames() const override;
926 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000927 bool validateAsmConstraint(const char *&Name,
928 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000929 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000930 default: return false;
931 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000932 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000933 case 'b': // Base register
934 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000935 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000936 break;
937 // FIXME: The following are added to allow parsing.
938 // I just took a guess at what the actions should be.
939 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000940 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000941 case 'v': // Altivec vector register
942 Info.setAllowsRegister();
943 break;
944 case 'w':
945 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000946 case 'd':// VSX vector register to hold vector double data
947 case 'f':// VSX vector register to hold vector float data
948 case 's':// VSX vector register to hold scalar float data
949 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000950 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000951 break;
952 default:
953 return false;
954 }
955 Info.setAllowsRegister();
956 Name++; // Skip over 'w'.
957 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000958 case 'h': // `MQ', `CTR', or `LINK' register
959 case 'q': // `MQ' register
960 case 'c': // `CTR' register
961 case 'l': // `LINK' register
962 case 'x': // `CR' register (condition register) number 0
963 case 'y': // `CR' register (condition register)
964 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000965 Info.setAllowsRegister();
966 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000967 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000968 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000969 // (use `L' instead for SImode constants)
970 case 'K': // Unsigned 16-bit constant
971 case 'L': // Signed 16-bit constant shifted left 16 bits
972 case 'M': // Constant larger than 31
973 case 'N': // Exact power of 2
974 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000975 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000976 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000977 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000978 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000979 break;
980 case 'm': // Memory operand. Note that on PowerPC targets, m can
981 // include addresses that update the base register. It
982 // is therefore only safe to use `m' in an asm statement
983 // if that asm statement accesses the operand exactly once.
984 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000985 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000986 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000987 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000988 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000989 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
990 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000991 // register to be updated.
992 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000993 if (Name[1] != 's')
994 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000995 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +0000996 // include any automodification of the base register. Unlike
997 // `m', this constraint can be used in asm statements that
998 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +0000999 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001000 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001001 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001002 break;
1003 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001004 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001005 case 'Z': // Memory operand that is an indexed or indirect from a
1006 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001007 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001008 Info.setAllowsMemory();
1009 Info.setAllowsRegister();
1010 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001011 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001012 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001013 // register (`p' is preferable for asm statements)
1014 case 'S': // Constant suitable as a 64-bit mask operand
1015 case 'T': // Constant suitable as a 32-bit mask operand
1016 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001017 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001018 // instructions
1019 case 'W': // Vector constant that does not require memory
1020 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001021 break;
1022 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001023 }
John Thompson07a61a42010-06-24 22:44:13 +00001024 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001025 }
Craig Topper3164f332014-03-11 03:39:26 +00001026 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001027 std::string R;
1028 switch (*Constraint) {
1029 case 'e':
1030 case 'w':
1031 // Two-character constraint; add "^" hint for later parsing.
1032 R = std::string("^") + std::string(Constraint, 2);
1033 Constraint++;
1034 break;
1035 default:
1036 return TargetInfo::convertConstraint(Constraint);
1037 }
1038 return R;
1039 }
Craig Topper3164f332014-03-11 03:39:26 +00001040 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001041 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001042 }
Craig Topper3164f332014-03-11 03:39:26 +00001043 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001044 if (RegNo == 0) return 3;
1045 if (RegNo == 1) return 4;
1046 return -1;
1047 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001048
1049 bool hasSjLjLowering() const override {
1050 return true;
1051 }
David Majnemer2617ea62015-06-09 18:05:33 +00001052
1053 bool useFloat128ManglingForLongDouble() const override {
1054 return LongDoubleWidth == 128 &&
1055 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1056 getTriple().isOSBinFormatELF();
1057 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001058};
Anders Carlssonf511f642007-11-27 04:11:28 +00001059
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001060const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001061#define BUILTIN(ID, TYPE, ATTRS) \
1062 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1063#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1064 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001065#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001066};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001067
Eric Christopher917e9522014-11-18 22:36:15 +00001068/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001069/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001070bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001071 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001072 for (const auto &Feature : Features) {
1073 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001074 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001075 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001076 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001077 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001078 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001079 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001080 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001081 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001082 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001083 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001084 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001085 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001086 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001087 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001088 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001089 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001090 // TODO: Finish this list and add an assert that we've handled them
1091 // all.
1092 }
Eric Christopher02c33352015-08-25 00:59:11 +00001093
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001094 return true;
1095}
1096
Chris Lattnerecd49032009-03-02 22:27:17 +00001097/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1098/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001099void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001100 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001101 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001102 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001103 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001104 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001105 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001106 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001107 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001108 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001109 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001110 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001111 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001112 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001113
Chris Lattnerecd49032009-03-02 22:27:17 +00001114 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001115 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1116 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001117 } else {
1118 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1119 getTriple().getOS() != llvm::Triple::OpenBSD)
1120 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001121 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001122
Ulrich Weigand8afad612014-07-28 13:17:52 +00001123 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001124 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001125 Builder.defineMacro("_CALL_ELF", "1");
1126 if (ABI == "elfv2")
1127 Builder.defineMacro("_CALL_ELF", "2");
1128
Chris Lattnerecd49032009-03-02 22:27:17 +00001129 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001130 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1131 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001132
Chris Lattnerecd49032009-03-02 22:27:17 +00001133 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001134 if (LongDoubleWidth == 128)
1135 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001136
John Thompsone467e192009-11-19 17:18:50 +00001137 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001138 Builder.defineMacro("__VEC__", "10206");
1139 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001140 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001141
1142 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001143 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1144 .Case("440", ArchDefineName)
1145 .Case("450", ArchDefineName | ArchDefine440)
1146 .Case("601", ArchDefineName)
1147 .Case("602", ArchDefineName | ArchDefinePpcgr)
1148 .Case("603", ArchDefineName | ArchDefinePpcgr)
1149 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1150 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1151 .Case("604", ArchDefineName | ArchDefinePpcgr)
1152 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1153 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001154 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001155 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1156 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1157 .Case("750", ArchDefineName | ArchDefinePpcgr)
1158 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1159 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001160 .Case("a2", ArchDefineA2)
1161 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001162 .Case("pwr3", ArchDefinePpcgr)
1163 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1164 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1165 | ArchDefinePpcsq)
1166 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1167 | ArchDefinePpcgr | ArchDefinePpcsq)
1168 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1169 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1170 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1171 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1172 | ArchDefinePpcsq)
1173 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1174 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001175 | ArchDefinePpcgr | ArchDefinePpcsq)
1176 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1177 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1178 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001179 .Case("power3", ArchDefinePpcgr)
1180 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1181 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1182 | ArchDefinePpcsq)
1183 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1184 | ArchDefinePpcgr | ArchDefinePpcsq)
1185 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1186 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1187 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1188 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1189 | ArchDefinePpcsq)
1190 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1191 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001192 | ArchDefinePpcgr | ArchDefinePpcsq)
1193 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1194 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1195 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001196 .Default(ArchDefineNone);
1197
1198 if (defs & ArchDefineName)
1199 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1200 if (defs & ArchDefinePpcgr)
1201 Builder.defineMacro("_ARCH_PPCGR");
1202 if (defs & ArchDefinePpcsq)
1203 Builder.defineMacro("_ARCH_PPCSQ");
1204 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001205 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001206 if (defs & ArchDefine603)
1207 Builder.defineMacro("_ARCH_603");
1208 if (defs & ArchDefine604)
1209 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001210 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001211 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001212 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001213 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001214 if (defs & ArchDefinePwr5x)
1215 Builder.defineMacro("_ARCH_PWR5X");
1216 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001217 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001218 if (defs & ArchDefinePwr6x)
1219 Builder.defineMacro("_ARCH_PWR6X");
1220 if (defs & ArchDefinePwr7)
1221 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001222 if (defs & ArchDefinePwr8)
1223 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001224 if (defs & ArchDefineA2)
1225 Builder.defineMacro("_ARCH_A2");
1226 if (defs & ArchDefineA2q) {
1227 Builder.defineMacro("_ARCH_A2Q");
1228 Builder.defineMacro("_ARCH_QP");
1229 }
1230
1231 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1232 Builder.defineMacro("__bg__");
1233 Builder.defineMacro("__THW_BLUEGENE__");
1234 Builder.defineMacro("__bgq__");
1235 Builder.defineMacro("__TOS_BGQ__");
1236 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001237
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001238 if (HasVSX)
1239 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001240 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001241 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001242 if (HasP8Crypto)
1243 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001244 if (HasHTM)
1245 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001246
1247 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1248 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1249 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1250 if (PointerWidth == 64)
1251 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001252
Bill Schmidt38378a02013-02-01 20:23:10 +00001253 // FIXME: The following are not yet generated here by Clang, but are
1254 // generated by GCC:
1255 //
1256 // _SOFT_FLOAT_
1257 // __RECIP_PRECISION__
1258 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001259 // __RECIP__
1260 // __RECIPF__
1261 // __RSQRTE__
1262 // __RSQRTEF__
1263 // _SOFT_DOUBLE_
1264 // __NO_LWSYNC__
1265 // __HAVE_BSWAP__
1266 // __LONGDOUBLE128
1267 // __CMODEL_MEDIUM__
1268 // __CMODEL_LARGE__
1269 // _CALL_SYSV
1270 // _CALL_DARWIN
1271 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001272}
1273
Eric Christophera8a14c32015-08-31 18:39:16 +00001274// Handle explicit options being passed to the compiler here: if we've
1275// explicitly turned off vsx and turned on power8-vector or direct-move then
1276// go ahead and error since the customer has expressed a somewhat incompatible
1277// set of options.
1278static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001279 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001280
1281 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1282 FeaturesVec.end()) {
1283 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1284 FeaturesVec.end()) {
1285 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1286 << "-mno-vsx";
1287 return false;
1288 }
1289
1290 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1291 FeaturesVec.end()) {
1292 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1293 << "-mno-vsx";
1294 return false;
1295 }
1296 }
1297
1298 return true;
1299}
1300
Eric Christopher8c47b422015-10-09 18:39:55 +00001301bool PPCTargetInfo::initFeatureMap(
1302 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1303 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001304 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1305 .Case("7400", true)
1306 .Case("g4", true)
1307 .Case("7450", true)
1308 .Case("g4+", true)
1309 .Case("970", true)
1310 .Case("g5", true)
1311 .Case("pwr6", true)
1312 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001313 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001314 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001315 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001316 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001317
1318 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001319 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1320 .Case("ppc64le", true)
1321 .Case("pwr8", true)
1322 .Default(false);
1323 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1324 .Case("ppc64le", true)
1325 .Case("pwr8", true)
1326 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001327 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1328 .Case("ppc64le", true)
1329 .Case("pwr8", true)
1330 .Case("pwr7", true)
1331 .Default(false);
1332 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1333 .Case("ppc64le", true)
1334 .Case("pwr8", true)
1335 .Case("pwr7", true)
1336 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001337 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1338 .Case("ppc64le", true)
1339 .Case("pwr8", true)
1340 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001341 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1342 .Case("ppc64le", true)
1343 .Case("pwr8", true)
1344 .Case("pwr7", true)
1345 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001346
Eric Christophera8a14c32015-08-31 18:39:16 +00001347 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1348 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001349
Eric Christopher007b0a02015-08-28 22:32:01 +00001350 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001351}
1352
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001353bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001354 return llvm::StringSwitch<bool>(Feature)
1355 .Case("powerpc", true)
1356 .Case("vsx", HasVSX)
1357 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001358 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001359 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001360 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001361 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001362 .Case("bpermd", HasBPERMD)
1363 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001364 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001365}
Chris Lattner17df24e2008-04-21 18:56:49 +00001366
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001367void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1368 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001369 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1370 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1371 // incompatible options.
1372 if (Enabled) {
1373 if (Name == "vsx") {
1374 Features[Name] = true;
1375 } else if (Name == "direct-move") {
1376 Features[Name] = Features["vsx"] = true;
1377 } else if (Name == "power8-vector") {
1378 Features[Name] = Features["vsx"] = true;
1379 } else {
1380 Features[Name] = true;
1381 }
1382 } else {
1383 if (Name == "vsx") {
1384 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1385 false;
1386 } else {
1387 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001388 }
1389 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001390}
1391
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001392const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001393 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1394 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1395 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1396 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1397 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1398 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1399 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1400 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001401 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001402 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001403 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001404 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1405 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1406 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1407 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001408 "vrsave", "vscr",
1409 "spe_acc", "spefscr",
1410 "sfp"
1411};
Chris Lattner10a5b382007-01-29 05:24:35 +00001412
Craig Topperf054e3a2015-10-19 03:52:27 +00001413ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1414 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001415}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001416
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001417const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1418 // While some of these aliases do map to different registers
1419 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001420 { { "0" }, "r0" },
1421 { { "1"}, "r1" },
1422 { { "2" }, "r2" },
1423 { { "3" }, "r3" },
1424 { { "4" }, "r4" },
1425 { { "5" }, "r5" },
1426 { { "6" }, "r6" },
1427 { { "7" }, "r7" },
1428 { { "8" }, "r8" },
1429 { { "9" }, "r9" },
1430 { { "10" }, "r10" },
1431 { { "11" }, "r11" },
1432 { { "12" }, "r12" },
1433 { { "13" }, "r13" },
1434 { { "14" }, "r14" },
1435 { { "15" }, "r15" },
1436 { { "16" }, "r16" },
1437 { { "17" }, "r17" },
1438 { { "18" }, "r18" },
1439 { { "19" }, "r19" },
1440 { { "20" }, "r20" },
1441 { { "21" }, "r21" },
1442 { { "22" }, "r22" },
1443 { { "23" }, "r23" },
1444 { { "24" }, "r24" },
1445 { { "25" }, "r25" },
1446 { { "26" }, "r26" },
1447 { { "27" }, "r27" },
1448 { { "28" }, "r28" },
1449 { { "29" }, "r29" },
1450 { { "30" }, "r30" },
1451 { { "31" }, "r31" },
1452 { { "fr0" }, "f0" },
1453 { { "fr1" }, "f1" },
1454 { { "fr2" }, "f2" },
1455 { { "fr3" }, "f3" },
1456 { { "fr4" }, "f4" },
1457 { { "fr5" }, "f5" },
1458 { { "fr6" }, "f6" },
1459 { { "fr7" }, "f7" },
1460 { { "fr8" }, "f8" },
1461 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001462 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001463 { { "fr11" }, "f11" },
1464 { { "fr12" }, "f12" },
1465 { { "fr13" }, "f13" },
1466 { { "fr14" }, "f14" },
1467 { { "fr15" }, "f15" },
1468 { { "fr16" }, "f16" },
1469 { { "fr17" }, "f17" },
1470 { { "fr18" }, "f18" },
1471 { { "fr19" }, "f19" },
1472 { { "fr20" }, "f20" },
1473 { { "fr21" }, "f21" },
1474 { { "fr22" }, "f22" },
1475 { { "fr23" }, "f23" },
1476 { { "fr24" }, "f24" },
1477 { { "fr25" }, "f25" },
1478 { { "fr26" }, "f26" },
1479 { { "fr27" }, "f27" },
1480 { { "fr28" }, "f28" },
1481 { { "fr29" }, "f29" },
1482 { { "fr30" }, "f30" },
1483 { { "fr31" }, "f31" },
1484 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001485};
1486
Craig Topperf054e3a2015-10-19 03:52:27 +00001487ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1488 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001489}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001490
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001491class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001492public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001493 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001494 DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001495
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001496 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001497 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001498 case llvm::Triple::FreeBSD:
1499 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001500 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001501 PtrDiffType = SignedInt;
1502 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001503 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001504 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001505 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001506 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001507
Roman Divacky3ffe7462012-03-13 19:20:17 +00001508 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1509 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001510 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001511 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001512
1513 // PPC32 supports atomics up to 4 bytes.
1514 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001515 }
1516
Craig Topper3164f332014-03-11 03:39:26 +00001517 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001518 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001519 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001520 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001521};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001522
Bill Schmidt778d3872013-07-26 01:36:11 +00001523// Note: ABI differences may eventually require us to have a separate
1524// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001525class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001526public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001527 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001528 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001529 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001530 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001531
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001532 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001533 DataLayoutString = "e-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001534 ABI = "elfv2";
1535 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001536 DataLayoutString = "E-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001537 ABI = "elfv1";
1538 }
1539
1540 switch (getTriple().getOS()) {
1541 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001542 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001543 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001544 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001545 case llvm::Triple::NetBSD:
1546 IntMaxType = SignedLongLong;
1547 Int64Type = SignedLongLong;
1548 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001549 default:
1550 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001551 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001552
1553 // PPC64 supports atomics up to 8 bytes.
1554 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001555 }
Craig Topper3164f332014-03-11 03:39:26 +00001556 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001557 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001558 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001559 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001560 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001561 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001562 ABI = Name;
1563 return true;
1564 }
1565 return false;
1566 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001567};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001568
Roman Divacky965b0b72011-01-06 08:27:10 +00001569class DarwinPPC32TargetInfo :
1570 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001571public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001572 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1573 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001574 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001575 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001576 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001577 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001578 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001579 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001580 }
Craig Topper3164f332014-03-11 03:39:26 +00001581 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001582 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001583 }
1584};
1585
1586class DarwinPPC64TargetInfo :
1587 public DarwinTargetInfo<PPC64TargetInfo> {
1588public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001589 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1590 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001591 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001592 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001593 DataLayoutString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001594 }
1595};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001596
Eric Christopherc48497a2015-09-18 21:26:24 +00001597static const unsigned NVPTXAddrSpaceMap[] = {
1598 1, // opencl_global
1599 3, // opencl_local
1600 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001601 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001602 0, // opencl_generic
1603 1, // cuda_device
1604 4, // cuda_constant
1605 3, // cuda_shared
1606};
1607
1608class NVPTXTargetInfo : public TargetInfo {
1609 static const char *const GCCRegNames[];
1610 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001611
1612 // The GPU profiles supported by the NVPTX backend
1613 enum GPUKind {
1614 GK_NONE,
1615 GK_SM20,
1616 GK_SM21,
1617 GK_SM30,
1618 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001619 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001620 } GPU;
1621
Eric Christopherc48497a2015-09-18 21:26:24 +00001622public:
1623 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1624 BigEndian = false;
1625 TLSSupported = false;
1626 LongWidth = LongAlign = 64;
1627 AddrSpaceMap = &NVPTXAddrSpaceMap;
1628 UseAddrSpaceMapMangling = true;
1629 // Define available target features
1630 // These must be defined in sorted order!
1631 NoAsmVariants = true;
1632 // Set the default GPU to sm20
1633 GPU = GK_SM20;
1634 }
1635 void getTargetDefines(const LangOptions &Opts,
1636 MacroBuilder &Builder) const override {
1637 Builder.defineMacro("__PTX__");
1638 Builder.defineMacro("__NVPTX__");
1639 if (Opts.CUDAIsDevice) {
1640 // Set __CUDA_ARCH__ for the GPU specified.
1641 std::string CUDAArchCode;
1642 switch (GPU) {
1643 case GK_SM20:
1644 CUDAArchCode = "200";
1645 break;
1646 case GK_SM21:
1647 CUDAArchCode = "210";
1648 break;
1649 case GK_SM30:
1650 CUDAArchCode = "300";
1651 break;
1652 case GK_SM35:
1653 CUDAArchCode = "350";
1654 break;
1655 case GK_SM37:
1656 CUDAArchCode = "370";
1657 break;
1658 default:
1659 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001660 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001661 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001662 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001663 }
Craig Topper6c03a542015-10-19 04:51:35 +00001664 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1665 return llvm::makeArrayRef(BuiltinInfo,
1666 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001667 }
1668 bool hasFeature(StringRef Feature) const override {
1669 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001670 }
1671
Craig Topperf054e3a2015-10-19 03:52:27 +00001672 ArrayRef<const char *> getGCCRegNames() const override;
1673 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001674 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001675 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001676 }
1677 bool validateAsmConstraint(const char *&Name,
1678 TargetInfo::ConstraintInfo &Info) const override {
1679 switch (*Name) {
1680 default:
1681 return false;
1682 case 'c':
1683 case 'h':
1684 case 'r':
1685 case 'l':
1686 case 'f':
1687 case 'd':
1688 Info.setAllowsRegister();
1689 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001690 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001691 }
1692 const char *getClobbers() const override {
1693 // FIXME: Is this really right?
1694 return "";
1695 }
1696 BuiltinVaListKind getBuiltinVaListKind() const override {
1697 // FIXME: implement
1698 return TargetInfo::CharPtrBuiltinVaList;
1699 }
1700 bool setCPU(const std::string &Name) override {
1701 GPU = llvm::StringSwitch<GPUKind>(Name)
1702 .Case("sm_20", GK_SM20)
1703 .Case("sm_21", GK_SM21)
1704 .Case("sm_30", GK_SM30)
1705 .Case("sm_35", GK_SM35)
1706 .Case("sm_37", GK_SM37)
1707 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001708
Eric Christopherc48497a2015-09-18 21:26:24 +00001709 return GPU != GK_NONE;
1710 }
1711};
1712
1713const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1714#define BUILTIN(ID, TYPE, ATTRS) \
1715 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1716#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1717 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1718#include "clang/Basic/BuiltinsNVPTX.def"
1719};
1720
1721const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1722
Craig Topperf054e3a2015-10-19 03:52:27 +00001723ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1724 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001725}
1726
1727class NVPTX32TargetInfo : public NVPTXTargetInfo {
1728public:
1729 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001730 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001731 PointerWidth = PointerAlign = 32;
1732 SizeType = TargetInfo::UnsignedInt;
1733 PtrDiffType = TargetInfo::SignedInt;
1734 IntPtrType = TargetInfo::SignedInt;
1735 DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
1736 }
1737};
1738
1739class NVPTX64TargetInfo : public NVPTXTargetInfo {
1740public:
1741 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1742 PointerWidth = PointerAlign = 64;
1743 SizeType = TargetInfo::UnsignedLong;
1744 PtrDiffType = TargetInfo::SignedLong;
1745 IntPtrType = TargetInfo::SignedLong;
1746 DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64";
1747 }
1748};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001749
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001750static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001751 1, // opencl_global
1752 3, // opencl_local
1753 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001754 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001755 1, // cuda_device
1756 2, // cuda_constant
1757 3 // cuda_shared
1758};
1759
Tom Stellarda96344b2014-08-21 13:58:40 +00001760// If you edit the description strings, make sure you update
1761// getPointerWidthV().
1762
Craig Topper273dbc62015-10-18 05:29:26 +00001763static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001764 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1765 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001766
Craig Topper273dbc62015-10-18 05:29:26 +00001767static const char *const DataLayoutStringR600DoubleOps =
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 DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001772 "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 +00001773 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1774 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001775
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001776class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001777 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001778 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001779
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001780 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001781 enum GPUKind {
1782 GK_NONE,
1783 GK_R600,
1784 GK_R600_DOUBLE_OPS,
1785 GK_R700,
1786 GK_R700_DOUBLE_OPS,
1787 GK_EVERGREEN,
1788 GK_EVERGREEN_DOUBLE_OPS,
1789 GK_NORTHERN_ISLANDS,
1790 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001791 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001792 GK_SEA_ISLANDS,
1793 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001794 } GPU;
1795
Jan Veselyeebeaea2015-05-04 19:53:36 +00001796 bool hasFP64:1;
1797 bool hasFMAF:1;
1798 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001799
Eli Friedmand13b41e2012-10-12 23:32:00 +00001800public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001801 AMDGPUTargetInfo(const llvm::Triple &Triple)
1802 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001803
1804 if (Triple.getArch() == llvm::Triple::amdgcn) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001805 DataLayoutString = DataLayoutStringSI;
Tom Stellardd99fb952015-01-28 15:38:44 +00001806 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001807 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001808 hasFMAF = true;
1809 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001810 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001811 DataLayoutString = DataLayoutStringR600;
Tom Stellardd99fb952015-01-28 15:38:44 +00001812 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001813 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001814 hasFMAF = false;
1815 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001816 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001817 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001818 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001819 }
1820
Tom Stellarda96344b2014-08-21 13:58:40 +00001821 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1822 if (GPU <= GK_CAYMAN)
1823 return 32;
1824
1825 switch(AddrSpace) {
1826 default:
1827 return 64;
1828 case 0:
1829 case 3:
1830 case 5:
1831 return 32;
1832 }
1833 }
1834
Craig Topper3164f332014-03-11 03:39:26 +00001835 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001836 return "";
1837 }
1838
Craig Topperf054e3a2015-10-19 03:52:27 +00001839 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001840
Craig Topperf054e3a2015-10-19 03:52:27 +00001841 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1842 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001843 }
1844
Craig Topper3164f332014-03-11 03:39:26 +00001845 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00001846 TargetInfo::ConstraintInfo &Info) const override {
1847 switch (*Name) {
1848 default: break;
1849 case 'v': // vgpr
1850 case 's': // sgpr
1851 Info.setAllowsRegister();
1852 return true;
1853 }
1854 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001855 }
1856
Craig Topper6c03a542015-10-19 04:51:35 +00001857 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1858 return llvm::makeArrayRef(BuiltinInfo,
1859 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001860 }
1861
Craig Topper3164f332014-03-11 03:39:26 +00001862 void getTargetDefines(const LangOptions &Opts,
1863 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001864 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001865 if (hasFMAF)
1866 Builder.defineMacro("__HAS_FMAF__");
1867 if (hasLDEXPF)
1868 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001869 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001870 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001871 if (Opts.OpenCL) {
1872 if (GPU >= GK_NORTHERN_ISLANDS) {
1873 Builder.defineMacro("cl_khr_byte_addressable_store");
1874 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1875 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1876 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1877 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1878 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001879 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001880 }
1881
Craig Topper3164f332014-03-11 03:39:26 +00001882 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001883 return TargetInfo::CharPtrBuiltinVaList;
1884 }
1885
Craig Topper3164f332014-03-11 03:39:26 +00001886 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001887 GPU = llvm::StringSwitch<GPUKind>(Name)
1888 .Case("r600" , GK_R600)
1889 .Case("rv610", GK_R600)
1890 .Case("rv620", GK_R600)
1891 .Case("rv630", GK_R600)
1892 .Case("rv635", GK_R600)
1893 .Case("rs780", GK_R600)
1894 .Case("rs880", GK_R600)
1895 .Case("rv670", GK_R600_DOUBLE_OPS)
1896 .Case("rv710", GK_R700)
1897 .Case("rv730", GK_R700)
1898 .Case("rv740", GK_R700_DOUBLE_OPS)
1899 .Case("rv770", GK_R700_DOUBLE_OPS)
1900 .Case("palm", GK_EVERGREEN)
1901 .Case("cedar", GK_EVERGREEN)
1902 .Case("sumo", GK_EVERGREEN)
1903 .Case("sumo2", GK_EVERGREEN)
1904 .Case("redwood", GK_EVERGREEN)
1905 .Case("juniper", GK_EVERGREEN)
1906 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1907 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1908 .Case("barts", GK_NORTHERN_ISLANDS)
1909 .Case("turks", GK_NORTHERN_ISLANDS)
1910 .Case("caicos", GK_NORTHERN_ISLANDS)
1911 .Case("cayman", GK_CAYMAN)
1912 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001913 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001914 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1915 .Case("verde", GK_SOUTHERN_ISLANDS)
1916 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001917 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001918 .Case("bonaire", GK_SEA_ISLANDS)
1919 .Case("kabini", GK_SEA_ISLANDS)
1920 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001921 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001922 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001923 .Case("tonga", GK_VOLCANIC_ISLANDS)
1924 .Case("iceland", GK_VOLCANIC_ISLANDS)
1925 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001926 .Default(GK_NONE);
1927
1928 if (GPU == GK_NONE) {
1929 return false;
1930 }
1931
1932 // Set the correct data layout
1933 switch (GPU) {
1934 case GK_NONE:
1935 case GK_R600:
1936 case GK_R700:
1937 case GK_EVERGREEN:
1938 case GK_NORTHERN_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001939 DataLayoutString = DataLayoutStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001940 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001941 hasFMAF = false;
1942 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001943 break;
1944 case GK_R600_DOUBLE_OPS:
1945 case GK_R700_DOUBLE_OPS:
1946 case GK_EVERGREEN_DOUBLE_OPS:
1947 case GK_CAYMAN:
Eric Christopher964a5f32015-08-05 23:48:05 +00001948 DataLayoutString = DataLayoutStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001949 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001950 hasFMAF = true;
1951 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001952 break;
1953 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001954 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001955 case GK_VOLCANIC_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001956 DataLayoutString = DataLayoutStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001957 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001958 hasFMAF = true;
1959 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001960 break;
1961 }
1962
1963 return true;
1964 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001965};
1966
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001967const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001968#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001969 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001970#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001971};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001972const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001973 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1974 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1975 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1976 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1977 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1978 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1979 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1980 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1981 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1982 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1983 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1984 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1985 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1986 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1987 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1988 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1989 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1990 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1991 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1992 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1993 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1994 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1995 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
1996 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
1997 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
1998 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
1999 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2000 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2001 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2002 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2003 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2004 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2005 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2006 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2007 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2008 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2009 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2010 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2011 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2012 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2013 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2014 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2015 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2016 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2017 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2018 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2019 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
2020 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
2021 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
2022 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
2023};
2024
Craig Topperf054e3a2015-10-19 03:52:27 +00002025ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2026 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002027}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002028
Eli Friedman3fd920a2008-08-20 02:34:37 +00002029// Namespace for x86 abstract base class
2030const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002031#define BUILTIN(ID, TYPE, ATTRS) \
2032 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002033#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002034 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002035#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002036 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002037#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002038};
Eli Friedmanb5366062008-05-20 14:21:01 +00002039
Nuno Lopescfca1f02009-12-23 17:49:57 +00002040static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002041 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2042 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002043 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002044 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2045 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2046 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002047 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002048 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2049 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002050};
2051
Eric Christophercdd36352011-06-21 00:05:20 +00002052const TargetInfo::AddlRegName AddlRegNames[] = {
2053 { { "al", "ah", "eax", "rax" }, 0 },
2054 { { "bl", "bh", "ebx", "rbx" }, 3 },
2055 { { "cl", "ch", "ecx", "rcx" }, 2 },
2056 { { "dl", "dh", "edx", "rdx" }, 1 },
2057 { { "esi", "rsi" }, 4 },
2058 { { "edi", "rdi" }, 5 },
2059 { { "esp", "rsp" }, 7 },
2060 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002061 { { "r8d", "r8w", "r8b" }, 38 },
2062 { { "r9d", "r9w", "r9b" }, 39 },
2063 { { "r10d", "r10w", "r10b" }, 40 },
2064 { { "r11d", "r11w", "r11b" }, 41 },
2065 { { "r12d", "r12w", "r12b" }, 42 },
2066 { { "r13d", "r13w", "r13b" }, 43 },
2067 { { "r14d", "r14w", "r14b" }, 44 },
2068 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002069};
2070
2071// X86 target abstract base class; x86-32 and x86-64 are very close, so
2072// most of the implementation can be shared.
2073class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002074 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002075 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002076 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002077 enum MMX3DNowEnum {
2078 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002079 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002080 enum XOPEnum {
2081 NoXOP,
2082 SSE4A,
2083 FMA4,
2084 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002085 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002086
Craig Topper543f3bd2015-10-14 23:47:57 +00002087 bool HasAES = false;
2088 bool HasPCLMUL = false;
2089 bool HasLZCNT = false;
2090 bool HasRDRND = false;
2091 bool HasFSGSBASE = false;
2092 bool HasBMI = false;
2093 bool HasBMI2 = false;
2094 bool HasPOPCNT = false;
2095 bool HasRTM = false;
2096 bool HasPRFCHW = false;
2097 bool HasRDSEED = false;
2098 bool HasADX = false;
2099 bool HasTBM = false;
2100 bool HasFMA = false;
2101 bool HasF16C = false;
2102 bool HasAVX512CD = false;
2103 bool HasAVX512ER = false;
2104 bool HasAVX512PF = false;
2105 bool HasAVX512DQ = false;
2106 bool HasAVX512BW = false;
2107 bool HasAVX512VL = false;
2108 bool HasSHA = false;
2109 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002110 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002111 bool HasXSAVE = false;
2112 bool HasXSAVEOPT = false;
2113 bool HasXSAVEC = false;
2114 bool HasXSAVES = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002115 bool HasPKU = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002116
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002117 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2118 ///
2119 /// Each enumeration represents a particular CPU supported by Clang. These
2120 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2121 enum CPUKind {
2122 CK_Generic,
2123
2124 /// \name i386
2125 /// i386-generation processors.
2126 //@{
2127 CK_i386,
2128 //@}
2129
2130 /// \name i486
2131 /// i486-generation processors.
2132 //@{
2133 CK_i486,
2134 CK_WinChipC6,
2135 CK_WinChip2,
2136 CK_C3,
2137 //@}
2138
2139 /// \name i586
2140 /// i586-generation processors, P5 microarchitecture based.
2141 //@{
2142 CK_i586,
2143 CK_Pentium,
2144 CK_PentiumMMX,
2145 //@}
2146
2147 /// \name i686
2148 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2149 //@{
2150 CK_i686,
2151 CK_PentiumPro,
2152 CK_Pentium2,
2153 CK_Pentium3,
2154 CK_Pentium3M,
2155 CK_PentiumM,
2156 CK_C3_2,
2157
2158 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2159 /// Clang however has some logic to suport this.
2160 // FIXME: Warn, deprecate, and potentially remove this.
2161 CK_Yonah,
2162 //@}
2163
2164 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002165 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002166 //@{
2167 CK_Pentium4,
2168 CK_Pentium4M,
2169 CK_Prescott,
2170 CK_Nocona,
2171 //@}
2172
2173 /// \name Core
2174 /// Core microarchitecture based processors.
2175 //@{
2176 CK_Core2,
2177
2178 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2179 /// codename which GCC no longer accepts as an option to -march, but Clang
2180 /// has some logic for recognizing it.
2181 // FIXME: Warn, deprecate, and potentially remove this.
2182 CK_Penryn,
2183 //@}
2184
2185 /// \name Atom
2186 /// Atom processors
2187 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002188 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002189 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002190 //@}
2191
2192 /// \name Nehalem
2193 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002194 CK_Nehalem,
2195
2196 /// \name Westmere
2197 /// Westmere microarchitecture based processors.
2198 CK_Westmere,
2199
2200 /// \name Sandy Bridge
2201 /// Sandy Bridge microarchitecture based processors.
2202 CK_SandyBridge,
2203
2204 /// \name Ivy Bridge
2205 /// Ivy Bridge microarchitecture based processors.
2206 CK_IvyBridge,
2207
2208 /// \name Haswell
2209 /// Haswell microarchitecture based processors.
2210 CK_Haswell,
2211
2212 /// \name Broadwell
2213 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002214 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002215
2216 /// \name Skylake
2217 /// Skylake microarchitecture based processors.
2218 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002219
Craig Topper449314e2013-08-20 07:09:39 +00002220 /// \name Knights Landing
2221 /// Knights Landing processor.
2222 CK_KNL,
2223
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002224 /// \name K6
2225 /// K6 architecture processors.
2226 //@{
2227 CK_K6,
2228 CK_K6_2,
2229 CK_K6_3,
2230 //@}
2231
2232 /// \name K7
2233 /// K7 architecture processors.
2234 //@{
2235 CK_Athlon,
2236 CK_AthlonThunderbird,
2237 CK_Athlon4,
2238 CK_AthlonXP,
2239 CK_AthlonMP,
2240 //@}
2241
2242 /// \name K8
2243 /// K8 architecture processors.
2244 //@{
2245 CK_Athlon64,
2246 CK_Athlon64SSE3,
2247 CK_AthlonFX,
2248 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002249 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002250 CK_Opteron,
2251 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002252 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002253 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002254
Benjamin Kramer569f2152012-01-10 11:50:18 +00002255 /// \name Bobcat
2256 /// Bobcat architecture processors.
2257 //@{
2258 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002259 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002260 //@}
2261
2262 /// \name Bulldozer
2263 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002264 //@{
2265 CK_BDVER1,
2266 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002267 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002268 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002269 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002270
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002271 /// This specification is deprecated and will be removed in the future.
2272 /// Users should prefer \see CK_K8.
2273 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002274 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002275 CK_x86_64,
2276 //@}
2277
2278 /// \name Geode
2279 /// Geode processors.
2280 //@{
2281 CK_Geode
2282 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002283 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002284
Eric Christopherc50738f2015-08-27 00:05:50 +00002285 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002286 return llvm::StringSwitch<CPUKind>(CPU)
2287 .Case("i386", CK_i386)
2288 .Case("i486", CK_i486)
2289 .Case("winchip-c6", CK_WinChipC6)
2290 .Case("winchip2", CK_WinChip2)
2291 .Case("c3", CK_C3)
2292 .Case("i586", CK_i586)
2293 .Case("pentium", CK_Pentium)
2294 .Case("pentium-mmx", CK_PentiumMMX)
2295 .Case("i686", CK_i686)
2296 .Case("pentiumpro", CK_PentiumPro)
2297 .Case("pentium2", CK_Pentium2)
2298 .Case("pentium3", CK_Pentium3)
2299 .Case("pentium3m", CK_Pentium3M)
2300 .Case("pentium-m", CK_PentiumM)
2301 .Case("c3-2", CK_C3_2)
2302 .Case("yonah", CK_Yonah)
2303 .Case("pentium4", CK_Pentium4)
2304 .Case("pentium4m", CK_Pentium4M)
2305 .Case("prescott", CK_Prescott)
2306 .Case("nocona", CK_Nocona)
2307 .Case("core2", CK_Core2)
2308 .Case("penryn", CK_Penryn)
2309 .Case("bonnell", CK_Bonnell)
2310 .Case("atom", CK_Bonnell) // Legacy name.
2311 .Case("silvermont", CK_Silvermont)
2312 .Case("slm", CK_Silvermont) // Legacy name.
2313 .Case("nehalem", CK_Nehalem)
2314 .Case("corei7", CK_Nehalem) // Legacy name.
2315 .Case("westmere", CK_Westmere)
2316 .Case("sandybridge", CK_SandyBridge)
2317 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2318 .Case("ivybridge", CK_IvyBridge)
2319 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2320 .Case("haswell", CK_Haswell)
2321 .Case("core-avx2", CK_Haswell) // Legacy name.
2322 .Case("broadwell", CK_Broadwell)
2323 .Case("skylake", CK_Skylake)
2324 .Case("skx", CK_Skylake) // Legacy name.
2325 .Case("knl", CK_KNL)
2326 .Case("k6", CK_K6)
2327 .Case("k6-2", CK_K6_2)
2328 .Case("k6-3", CK_K6_3)
2329 .Case("athlon", CK_Athlon)
2330 .Case("athlon-tbird", CK_AthlonThunderbird)
2331 .Case("athlon-4", CK_Athlon4)
2332 .Case("athlon-xp", CK_AthlonXP)
2333 .Case("athlon-mp", CK_AthlonMP)
2334 .Case("athlon64", CK_Athlon64)
2335 .Case("athlon64-sse3", CK_Athlon64SSE3)
2336 .Case("athlon-fx", CK_AthlonFX)
2337 .Case("k8", CK_K8)
2338 .Case("k8-sse3", CK_K8SSE3)
2339 .Case("opteron", CK_Opteron)
2340 .Case("opteron-sse3", CK_OpteronSSE3)
2341 .Case("barcelona", CK_AMDFAM10)
2342 .Case("amdfam10", CK_AMDFAM10)
2343 .Case("btver1", CK_BTVER1)
2344 .Case("btver2", CK_BTVER2)
2345 .Case("bdver1", CK_BDVER1)
2346 .Case("bdver2", CK_BDVER2)
2347 .Case("bdver3", CK_BDVER3)
2348 .Case("bdver4", CK_BDVER4)
2349 .Case("x86-64", CK_x86_64)
2350 .Case("geode", CK_Geode)
2351 .Default(CK_Generic);
2352 }
2353
Rafael Espindolaeb265472013-08-21 21:59:03 +00002354 enum FPMathKind {
2355 FP_Default,
2356 FP_SSE,
2357 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002358 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002359
Eli Friedman3fd920a2008-08-20 02:34:37 +00002360public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002361 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002362 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002363 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002364 }
Craig Topper3164f332014-03-11 03:39:26 +00002365 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002366 // X87 evaluates with 80 bits "long double" precision.
2367 return SSELevel == NoSSE ? 2 : 0;
2368 }
Craig Topper6c03a542015-10-19 04:51:35 +00002369 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2370 return llvm::makeArrayRef(BuiltinInfo,
2371 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002372 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002373 ArrayRef<const char *> getGCCRegNames() const override {
2374 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002375 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002376 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2377 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002378 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002379 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2380 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002381 }
Eric Christopherd9832702015-06-29 21:00:05 +00002382 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002383 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002384 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002385
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002386 bool validateGlobalRegisterVariable(StringRef RegName,
2387 unsigned RegSize,
2388 bool &HasSizeMismatch) const override {
2389 // esp and ebp are the only 32-bit registers the x86 backend can currently
2390 // handle.
2391 if (RegName.equals("esp") || RegName.equals("ebp")) {
2392 // Check that the register size is 32-bit.
2393 HasSizeMismatch = RegSize != 32;
2394 return true;
2395 }
2396
2397 return false;
2398 }
2399
Akira Hatanaka974131e2014-09-18 18:17:18 +00002400 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2401
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002402 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2403
Akira Hatanaka974131e2014-09-18 18:17:18 +00002404 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2405
Craig Topper3164f332014-03-11 03:39:26 +00002406 std::string convertConstraint(const char *&Constraint) const override;
2407 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002408 return "~{dirflag},~{fpsr},~{flags}";
2409 }
Craig Topper3164f332014-03-11 03:39:26 +00002410 void getTargetDefines(const LangOptions &Opts,
2411 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002412 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2413 bool Enabled);
2414 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2415 bool Enabled);
2416 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2417 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002418 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2419 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002420 setFeatureEnabledImpl(Features, Name, Enabled);
2421 }
2422 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002423 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002424 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2425 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002426 bool
2427 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2428 StringRef CPU,
2429 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002430 bool hasFeature(StringRef Feature) const override;
2431 bool handleTargetFeatures(std::vector<std::string> &Features,
2432 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002433 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002434 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2435 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002436 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002437 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002438 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002439 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002440 return "no-mmx";
2441 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002442 }
Craig Topper3164f332014-03-11 03:39:26 +00002443 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002444 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002445
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002446 // Perform any per-CPU checks necessary to determine if this CPU is
2447 // acceptable.
2448 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2449 // invalid without explaining *why*.
2450 switch (CPU) {
2451 case CK_Generic:
2452 // No processor selected!
2453 return false;
2454
2455 case CK_i386:
2456 case CK_i486:
2457 case CK_WinChipC6:
2458 case CK_WinChip2:
2459 case CK_C3:
2460 case CK_i586:
2461 case CK_Pentium:
2462 case CK_PentiumMMX:
2463 case CK_i686:
2464 case CK_PentiumPro:
2465 case CK_Pentium2:
2466 case CK_Pentium3:
2467 case CK_Pentium3M:
2468 case CK_PentiumM:
2469 case CK_Yonah:
2470 case CK_C3_2:
2471 case CK_Pentium4:
2472 case CK_Pentium4M:
2473 case CK_Prescott:
2474 case CK_K6:
2475 case CK_K6_2:
2476 case CK_K6_3:
2477 case CK_Athlon:
2478 case CK_AthlonThunderbird:
2479 case CK_Athlon4:
2480 case CK_AthlonXP:
2481 case CK_AthlonMP:
2482 case CK_Geode:
2483 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002484 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002485 return false;
2486
2487 // Fallthrough
2488 case CK_Nocona:
2489 case CK_Core2:
2490 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002491 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002492 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002493 case CK_Nehalem:
2494 case CK_Westmere:
2495 case CK_SandyBridge:
2496 case CK_IvyBridge:
2497 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002498 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002499 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002500 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002501 case CK_Athlon64:
2502 case CK_Athlon64SSE3:
2503 case CK_AthlonFX:
2504 case CK_K8:
2505 case CK_K8SSE3:
2506 case CK_Opteron:
2507 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002508 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002509 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002510 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002511 case CK_BDVER1:
2512 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002513 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002514 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002515 case CK_x86_64:
2516 return true;
2517 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002518 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002519 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002520
Craig Topper3164f332014-03-11 03:39:26 +00002521 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002522
Craig Topper3164f332014-03-11 03:39:26 +00002523 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002524 // We accept all non-ARM calling conventions
2525 return (CC == CC_X86ThisCall ||
2526 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002527 CC == CC_X86StdCall ||
2528 CC == CC_X86VectorCall ||
2529 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002530 CC == CC_X86Pascal ||
2531 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002532 }
2533
Craig Topper3164f332014-03-11 03:39:26 +00002534 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002535 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002536 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002537
2538 bool hasSjLjLowering() const override {
2539 return true;
2540 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002541};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002542
Rafael Espindolaeb265472013-08-21 21:59:03 +00002543bool X86TargetInfo::setFPMath(StringRef Name) {
2544 if (Name == "387") {
2545 FPMath = FP_387;
2546 return true;
2547 }
2548 if (Name == "sse") {
2549 FPMath = FP_SSE;
2550 return true;
2551 }
2552 return false;
2553}
2554
Eric Christopher007b0a02015-08-28 22:32:01 +00002555bool X86TargetInfo::initFeatureMap(
2556 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002557 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002558 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002559 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002560 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002561 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002562
Eric Christopher2b4a7252015-08-27 00:05:52 +00002563 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002564 case CK_Generic:
2565 case CK_i386:
2566 case CK_i486:
2567 case CK_i586:
2568 case CK_Pentium:
2569 case CK_i686:
2570 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002571 break;
2572 case CK_PentiumMMX:
2573 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002574 case CK_K6:
2575 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002576 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002577 break;
2578 case CK_Pentium3:
2579 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002580 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002581 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002582 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002583 break;
2584 case CK_PentiumM:
2585 case CK_Pentium4:
2586 case CK_Pentium4M:
2587 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002588 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002589 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002590 break;
2591 case CK_Yonah:
2592 case CK_Prescott:
2593 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002594 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002595 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002596 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002597 break;
2598 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002599 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002600 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002601 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002602 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002603 break;
2604 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002605 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002606 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002607 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002608 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002609 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002610 setFeatureEnabledImpl(Features, "avx512f", true);
2611 setFeatureEnabledImpl(Features, "avx512cd", true);
2612 setFeatureEnabledImpl(Features, "avx512dq", true);
2613 setFeatureEnabledImpl(Features, "avx512bw", true);
2614 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002615 setFeatureEnabledImpl(Features, "xsavec", true);
2616 setFeatureEnabledImpl(Features, "xsaves", true);
Asaf Badouha9d1e182015-12-31 14:14:07 +00002617 setFeatureEnabledImpl(Features, "pku", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002618 // FALLTHROUGH
2619 case CK_Broadwell:
2620 setFeatureEnabledImpl(Features, "rdseed", true);
2621 setFeatureEnabledImpl(Features, "adx", true);
2622 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002623 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002624 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002625 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002626 setFeatureEnabledImpl(Features, "bmi", true);
2627 setFeatureEnabledImpl(Features, "bmi2", true);
2628 setFeatureEnabledImpl(Features, "rtm", true);
2629 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002630 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002631 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002632 setFeatureEnabledImpl(Features, "rdrnd", true);
2633 setFeatureEnabledImpl(Features, "f16c", true);
2634 setFeatureEnabledImpl(Features, "fsgsbase", true);
2635 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002636 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002637 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002638 setFeatureEnabledImpl(Features, "xsave", true);
2639 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002640 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002641 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002642 case CK_Silvermont:
2643 setFeatureEnabledImpl(Features, "aes", true);
2644 setFeatureEnabledImpl(Features, "pclmul", true);
2645 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002646 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002647 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002648 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002649 setFeatureEnabledImpl(Features, "cx16", true);
2650 break;
2651 case CK_KNL:
2652 setFeatureEnabledImpl(Features, "avx512f", true);
2653 setFeatureEnabledImpl(Features, "avx512cd", true);
2654 setFeatureEnabledImpl(Features, "avx512er", true);
2655 setFeatureEnabledImpl(Features, "avx512pf", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002656 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002657 setFeatureEnabledImpl(Features, "rdseed", true);
2658 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002659 setFeatureEnabledImpl(Features, "lzcnt", true);
2660 setFeatureEnabledImpl(Features, "bmi", true);
2661 setFeatureEnabledImpl(Features, "bmi2", true);
2662 setFeatureEnabledImpl(Features, "rtm", true);
2663 setFeatureEnabledImpl(Features, "fma", true);
2664 setFeatureEnabledImpl(Features, "rdrnd", true);
2665 setFeatureEnabledImpl(Features, "f16c", true);
2666 setFeatureEnabledImpl(Features, "fsgsbase", true);
2667 setFeatureEnabledImpl(Features, "aes", true);
2668 setFeatureEnabledImpl(Features, "pclmul", true);
2669 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002670 setFeatureEnabledImpl(Features, "xsaveopt", true);
2671 setFeatureEnabledImpl(Features, "xsave", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002672 break;
2673 case CK_K6_2:
2674 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002675 case CK_WinChip2:
2676 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002677 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002678 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002679 case CK_Athlon:
2680 case CK_AthlonThunderbird:
2681 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002682 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002683 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002684 case CK_Athlon4:
2685 case CK_AthlonXP:
2686 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002687 setFeatureEnabledImpl(Features, "sse", true);
2688 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002689 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002690 break;
2691 case CK_K8:
2692 case CK_Opteron:
2693 case CK_Athlon64:
2694 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002695 setFeatureEnabledImpl(Features, "sse2", true);
2696 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002697 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002698 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002699 case CK_AMDFAM10:
2700 setFeatureEnabledImpl(Features, "sse4a", true);
2701 setFeatureEnabledImpl(Features, "lzcnt", true);
2702 setFeatureEnabledImpl(Features, "popcnt", true);
2703 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002704 case CK_K8SSE3:
2705 case CK_OpteronSSE3:
2706 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002707 setFeatureEnabledImpl(Features, "sse3", true);
2708 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002709 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002710 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002711 case CK_BTVER2:
2712 setFeatureEnabledImpl(Features, "avx", true);
2713 setFeatureEnabledImpl(Features, "aes", true);
2714 setFeatureEnabledImpl(Features, "pclmul", true);
2715 setFeatureEnabledImpl(Features, "bmi", true);
2716 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002717 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002718 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002719 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002720 setFeatureEnabledImpl(Features, "ssse3", true);
2721 setFeatureEnabledImpl(Features, "sse4a", true);
2722 setFeatureEnabledImpl(Features, "lzcnt", true);
2723 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002724 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002725 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002726 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002727 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002728 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002729 case CK_BDVER4:
2730 setFeatureEnabledImpl(Features, "avx2", true);
2731 setFeatureEnabledImpl(Features, "bmi2", true);
2732 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002733 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002734 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002735 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002736 // FALLTHROUGH
2737 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002738 setFeatureEnabledImpl(Features, "bmi", true);
2739 setFeatureEnabledImpl(Features, "fma", true);
2740 setFeatureEnabledImpl(Features, "f16c", true);
2741 setFeatureEnabledImpl(Features, "tbm", true);
2742 // FALLTHROUGH
2743 case CK_BDVER1:
2744 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002745 setFeatureEnabledImpl(Features, "xop", true);
2746 setFeatureEnabledImpl(Features, "lzcnt", true);
2747 setFeatureEnabledImpl(Features, "aes", true);
2748 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002749 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002750 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002751 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002752 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002753 break;
Eli Friedman33465822011-07-08 23:31:17 +00002754 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002755 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2756 return false;
2757
2758 // Can't do this earlier because we need to be able to explicitly enable
2759 // or disable these features and the things that they depend upon.
2760
2761 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2762 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002763 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002764 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2765 FeaturesVec.end())
2766 Features["popcnt"] = true;
2767
2768 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2769 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002770 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002771 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2772 FeaturesVec.end())
2773 Features["prfchw"] = true;
2774
Eric Christophera7260af2015-10-08 20:10:18 +00002775 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2776 // then enable MMX.
2777 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002778 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002779 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2780 FeaturesVec.end())
2781 Features["mmx"] = true;
2782
Eric Christopherbbd746d2015-10-08 20:10:14 +00002783 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002784}
2785
Rafael Espindolae62e2792013-08-20 13:44:29 +00002786void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002787 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002788 if (Enabled) {
2789 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002790 case AVX512F:
2791 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002792 case AVX2:
2793 Features["avx2"] = true;
2794 case AVX:
2795 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002796 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002797 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002798 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002799 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002800 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002801 case SSSE3:
2802 Features["ssse3"] = true;
2803 case SSE3:
2804 Features["sse3"] = true;
2805 case SSE2:
2806 Features["sse2"] = true;
2807 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002808 Features["sse"] = true;
2809 case NoSSE:
2810 break;
2811 }
2812 return;
2813 }
2814
2815 switch (Level) {
2816 case NoSSE:
2817 case SSE1:
2818 Features["sse"] = false;
2819 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002820 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2821 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002822 case SSE3:
2823 Features["sse3"] = false;
2824 setXOPLevel(Features, NoXOP, false);
2825 case SSSE3:
2826 Features["ssse3"] = false;
2827 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002828 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002829 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002830 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002831 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002832 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2833 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002834 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002835 case AVX2:
2836 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002837 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002838 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002839 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2840 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002841 }
2842}
2843
2844void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002845 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002846 if (Enabled) {
2847 switch (Level) {
2848 case AMD3DNowAthlon:
2849 Features["3dnowa"] = true;
2850 case AMD3DNow:
2851 Features["3dnow"] = true;
2852 case MMX:
2853 Features["mmx"] = true;
2854 case NoMMX3DNow:
2855 break;
2856 }
2857 return;
2858 }
2859
2860 switch (Level) {
2861 case NoMMX3DNow:
2862 case MMX:
2863 Features["mmx"] = false;
2864 case AMD3DNow:
2865 Features["3dnow"] = false;
2866 case AMD3DNowAthlon:
2867 Features["3dnowa"] = false;
2868 }
2869}
2870
2871void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002872 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002873 if (Enabled) {
2874 switch (Level) {
2875 case XOP:
2876 Features["xop"] = true;
2877 case FMA4:
2878 Features["fma4"] = true;
2879 setSSELevel(Features, AVX, true);
2880 case SSE4A:
2881 Features["sse4a"] = true;
2882 setSSELevel(Features, SSE3, true);
2883 case NoXOP:
2884 break;
2885 }
2886 return;
2887 }
2888
2889 switch (Level) {
2890 case NoXOP:
2891 case SSE4A:
2892 Features["sse4a"] = false;
2893 case FMA4:
2894 Features["fma4"] = false;
2895 case XOP:
2896 Features["xop"] = false;
2897 }
2898}
2899
Craig Topper86d79ef2013-09-17 04:51:29 +00002900void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2901 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002902 // This is a bit of a hack to deal with the sse4 target feature when used
2903 // as part of the target attribute. We handle sse4 correctly everywhere
2904 // else. See below for more information on how we handle the sse4 options.
2905 if (Name != "sse4")
2906 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002907
Craig Topper29561122013-09-19 01:13:07 +00002908 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002909 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002910 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002911 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002912 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002913 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002914 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002915 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002916 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002917 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002918 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002919 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002920 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002921 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002922 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002923 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002924 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002925 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002926 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002927 if (Enabled)
2928 setSSELevel(Features, SSE2, Enabled);
2929 } else if (Name == "pclmul") {
2930 if (Enabled)
2931 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002932 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002933 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002934 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002935 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002936 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002937 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002938 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2939 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002940 if (Enabled)
2941 setSSELevel(Features, AVX512F, Enabled);
2942 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002943 if (Enabled)
2944 setSSELevel(Features, AVX, Enabled);
2945 } else if (Name == "fma4") {
2946 setXOPLevel(Features, FMA4, Enabled);
2947 } else if (Name == "xop") {
2948 setXOPLevel(Features, XOP, Enabled);
2949 } else if (Name == "sse4a") {
2950 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002951 } else if (Name == "f16c") {
2952 if (Enabled)
2953 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002954 } else if (Name == "sha") {
2955 if (Enabled)
2956 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002957 } else if (Name == "sse4") {
2958 // We can get here via the __target__ attribute since that's not controlled
2959 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2960 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2961 // disabled.
2962 if (Enabled)
2963 setSSELevel(Features, SSE42, Enabled);
2964 else
2965 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00002966 } else if (Name == "xsave") {
2967 if (Enabled)
2968 setSSELevel(Features, AVX, Enabled);
2969 else
2970 Features["xsaveopt"] = false;
2971 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
2972 if (Enabled) {
2973 Features["xsave"] = true;
2974 setSSELevel(Features, AVX, Enabled);
2975 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002976 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002977}
2978
Eric Christopher3ff21b32013-10-16 21:26:26 +00002979/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002980/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002981bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002982 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00002983 for (const auto &Feature : Features) {
2984 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00002985 continue;
2986
Eric Christopher610fe112015-08-26 08:21:55 +00002987 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002988 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002989 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00002990 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002991 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00002992 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002993 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00002994 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002995 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00002996 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002997 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00002998 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002999 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003000 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003001 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003002 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003003 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003004 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003005 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003006 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003007 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003008 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003009 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003010 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003011 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003012 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003013 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003014 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003015 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003016 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003017 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003018 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003019 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003020 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003021 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003022 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003023 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003024 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003025 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003026 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003027 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003028 HasAVX512VL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003029 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003030 HasSHA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003031 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003032 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003033 } else if (Feature == "+fxsr") {
3034 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003035 } else if (Feature == "+xsave") {
3036 HasXSAVE = true;
3037 } else if (Feature == "+xsaveopt") {
3038 HasXSAVEOPT = true;
3039 } else if (Feature == "+xsavec") {
3040 HasXSAVEC = true;
3041 } else if (Feature == "+xsaves") {
3042 HasXSAVES = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003043 } else if (Feature == "+pku") {
3044 HasPKU = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003045 }
3046
Benjamin Kramer27402c62012-03-05 15:10:44 +00003047 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003048 .Case("+avx512f", AVX512F)
3049 .Case("+avx2", AVX2)
3050 .Case("+avx", AVX)
3051 .Case("+sse4.2", SSE42)
3052 .Case("+sse4.1", SSE41)
3053 .Case("+ssse3", SSSE3)
3054 .Case("+sse3", SSE3)
3055 .Case("+sse2", SSE2)
3056 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003057 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003058 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003059
Eli Friedman33465822011-07-08 23:31:17 +00003060 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003061 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003062 .Case("+3dnowa", AMD3DNowAthlon)
3063 .Case("+3dnow", AMD3DNow)
3064 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003065 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003066 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003067
3068 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003069 .Case("+xop", XOP)
3070 .Case("+fma4", FMA4)
3071 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003072 .Default(NoXOP);
3073 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003074 }
Eli Friedman33465822011-07-08 23:31:17 +00003075
Rafael Espindolaeb265472013-08-21 21:59:03 +00003076 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3077 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003078 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3079 (FPMath == FP_387 && SSELevel >= SSE1)) {
3080 Diags.Report(diag::err_target_unsupported_fpmath) <<
3081 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003082 return false;
3083 }
3084
Alexey Bataev00396512015-07-02 03:40:19 +00003085 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003086 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003087 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003088}
Chris Lattnerecd49032009-03-02 22:27:17 +00003089
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003090/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3091/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003092void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003093 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003094 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003095 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003096 Builder.defineMacro("__amd64__");
3097 Builder.defineMacro("__amd64");
3098 Builder.defineMacro("__x86_64");
3099 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003100 if (getTriple().getArchName() == "x86_64h") {
3101 Builder.defineMacro("__x86_64h");
3102 Builder.defineMacro("__x86_64h__");
3103 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003104 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003105 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003106 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003107
Chris Lattnerecd49032009-03-02 22:27:17 +00003108 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003109 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3110 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003111 switch (CPU) {
3112 case CK_Generic:
3113 break;
3114 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003115 // The rest are coming from the i386 define above.
3116 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003117 break;
3118 case CK_i486:
3119 case CK_WinChipC6:
3120 case CK_WinChip2:
3121 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003122 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003123 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003124 case CK_PentiumMMX:
3125 Builder.defineMacro("__pentium_mmx__");
3126 Builder.defineMacro("__tune_pentium_mmx__");
3127 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003128 case CK_i586:
3129 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003130 defineCPUMacros(Builder, "i586");
3131 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003132 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003133 case CK_Pentium3:
3134 case CK_Pentium3M:
3135 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003136 Builder.defineMacro("__tune_pentium3__");
3137 // Fallthrough
3138 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003139 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003140 Builder.defineMacro("__tune_pentium2__");
3141 // Fallthrough
3142 case CK_PentiumPro:
3143 Builder.defineMacro("__tune_i686__");
3144 Builder.defineMacro("__tune_pentiumpro__");
3145 // Fallthrough
3146 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003147 Builder.defineMacro("__i686");
3148 Builder.defineMacro("__i686__");
3149 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3150 Builder.defineMacro("__pentiumpro");
3151 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003152 break;
3153 case CK_Pentium4:
3154 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003155 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003156 break;
3157 case CK_Yonah:
3158 case CK_Prescott:
3159 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003160 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003161 break;
3162 case CK_Core2:
3163 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003164 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003165 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003166 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003167 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003168 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003169 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003170 defineCPUMacros(Builder, "slm");
3171 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003172 case CK_Nehalem:
3173 case CK_Westmere:
3174 case CK_SandyBridge:
3175 case CK_IvyBridge:
3176 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003177 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003178 // FIXME: Historically, we defined this legacy name, it would be nice to
3179 // remove it at some point. We've never exposed fine-grained names for
3180 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003181 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003182 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003183 case CK_Skylake:
3184 // FIXME: Historically, we defined this legacy name, it would be nice to
3185 // remove it at some point. This is the only fine-grained CPU macro in the
3186 // main intel CPU line, and it would be better to not have these and force
3187 // people to use ISA macros.
3188 defineCPUMacros(Builder, "skx");
3189 break;
Craig Topper449314e2013-08-20 07:09:39 +00003190 case CK_KNL:
3191 defineCPUMacros(Builder, "knl");
3192 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003193 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003194 Builder.defineMacro("__k6_2__");
3195 Builder.defineMacro("__tune_k6_2__");
3196 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003197 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003198 if (CPU != CK_K6_2) { // In case of fallthrough
3199 // FIXME: GCC may be enabling these in cases where some other k6
3200 // architecture is specified but -m3dnow is explicitly provided. The
3201 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003202 Builder.defineMacro("__k6_3__");
3203 Builder.defineMacro("__tune_k6_3__");
3204 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003205 // Fallthrough
3206 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003207 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003208 break;
3209 case CK_Athlon:
3210 case CK_AthlonThunderbird:
3211 case CK_Athlon4:
3212 case CK_AthlonXP:
3213 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003214 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003215 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003216 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003217 Builder.defineMacro("__tune_athlon_sse__");
3218 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003219 break;
3220 case CK_K8:
3221 case CK_K8SSE3:
3222 case CK_x86_64:
3223 case CK_Opteron:
3224 case CK_OpteronSSE3:
3225 case CK_Athlon64:
3226 case CK_Athlon64SSE3:
3227 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003228 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003229 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003230 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003231 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003232 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003233 case CK_BTVER1:
3234 defineCPUMacros(Builder, "btver1");
3235 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003236 case CK_BTVER2:
3237 defineCPUMacros(Builder, "btver2");
3238 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003239 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003240 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003241 break;
3242 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003243 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003244 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003245 case CK_BDVER3:
3246 defineCPUMacros(Builder, "bdver3");
3247 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003248 case CK_BDVER4:
3249 defineCPUMacros(Builder, "bdver4");
3250 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003251 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003252 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003253 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003254 }
Chris Lattner96e43572009-03-02 22:40:39 +00003255
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003256 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003257 Builder.defineMacro("__REGISTER_PREFIX__", "");
3258
Chris Lattner6df41af2009-04-19 17:32:33 +00003259 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3260 // functions in glibc header files that use FP Stack inline asm which the
3261 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003262 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003263
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003264 if (HasAES)
3265 Builder.defineMacro("__AES__");
3266
Craig Topper3f122a72012-05-31 05:18:48 +00003267 if (HasPCLMUL)
3268 Builder.defineMacro("__PCLMUL__");
3269
Craig Topper22967d42011-12-25 05:06:45 +00003270 if (HasLZCNT)
3271 Builder.defineMacro("__LZCNT__");
3272
Benjamin Kramer1e250392012-07-07 09:39:18 +00003273 if (HasRDRND)
3274 Builder.defineMacro("__RDRND__");
3275
Craig Topper8c7f2512014-11-03 06:51:41 +00003276 if (HasFSGSBASE)
3277 Builder.defineMacro("__FSGSBASE__");
3278
Craig Topper22967d42011-12-25 05:06:45 +00003279 if (HasBMI)
3280 Builder.defineMacro("__BMI__");
3281
3282 if (HasBMI2)
3283 Builder.defineMacro("__BMI2__");
3284
Craig Topper1de83482011-12-29 16:10:46 +00003285 if (HasPOPCNT)
3286 Builder.defineMacro("__POPCNT__");
3287
Michael Liao625a8752012-11-10 05:17:46 +00003288 if (HasRTM)
3289 Builder.defineMacro("__RTM__");
3290
Michael Liao74f4eaf2013-03-26 17:52:08 +00003291 if (HasPRFCHW)
3292 Builder.defineMacro("__PRFCHW__");
3293
Michael Liaoffaae352013-03-29 05:17:55 +00003294 if (HasRDSEED)
3295 Builder.defineMacro("__RDSEED__");
3296
Robert Khasanov50e6f582014-09-19 09:53:48 +00003297 if (HasADX)
3298 Builder.defineMacro("__ADX__");
3299
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003300 if (HasTBM)
3301 Builder.defineMacro("__TBM__");
3302
Rafael Espindolae62e2792013-08-20 13:44:29 +00003303 switch (XOPLevel) {
3304 case XOP:
3305 Builder.defineMacro("__XOP__");
3306 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003307 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003308 case SSE4A:
3309 Builder.defineMacro("__SSE4A__");
3310 case NoXOP:
3311 break;
3312 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003313
Craig Topperbba778b2012-06-03 21:46:30 +00003314 if (HasFMA)
3315 Builder.defineMacro("__FMA__");
3316
Manman Rena45358c2012-10-11 00:59:55 +00003317 if (HasF16C)
3318 Builder.defineMacro("__F16C__");
3319
Craig Topper679b53a2013-08-21 05:29:10 +00003320 if (HasAVX512CD)
3321 Builder.defineMacro("__AVX512CD__");
3322 if (HasAVX512ER)
3323 Builder.defineMacro("__AVX512ER__");
3324 if (HasAVX512PF)
3325 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003326 if (HasAVX512DQ)
3327 Builder.defineMacro("__AVX512DQ__");
3328 if (HasAVX512BW)
3329 Builder.defineMacro("__AVX512BW__");
3330 if (HasAVX512VL)
3331 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003332
Ben Langmuir58078d02013-09-19 13:22:04 +00003333 if (HasSHA)
3334 Builder.defineMacro("__SHA__");
3335
Craig Toppere33f51f2015-10-16 06:22:36 +00003336 if (HasFXSR)
3337 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003338 if (HasXSAVE)
3339 Builder.defineMacro("__XSAVE__");
3340 if (HasXSAVEOPT)
3341 Builder.defineMacro("__XSAVEOPT__");
3342 if (HasXSAVEC)
3343 Builder.defineMacro("__XSAVEC__");
3344 if (HasXSAVES)
3345 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003346 if (HasPKU)
3347 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003348 if (HasCX16)
3349 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3350
Chris Lattner96e43572009-03-02 22:40:39 +00003351 // Each case falls through to the previous one here.
3352 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003353 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003354 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003355 case AVX2:
3356 Builder.defineMacro("__AVX2__");
3357 case AVX:
3358 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003359 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003360 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003361 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003362 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003363 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003364 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003365 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003366 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003367 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003368 Builder.defineMacro("__SSE2__");
3369 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003370 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003371 Builder.defineMacro("__SSE__");
3372 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003373 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003374 break;
3375 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003376
Derek Schuffc7dd7222012-10-11 15:52:22 +00003377 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003378 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003379 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003380 case AVX2:
3381 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003382 case SSE42:
3383 case SSE41:
3384 case SSSE3:
3385 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003386 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003387 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003388 break;
3389 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003390 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003391 break;
3392 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003393 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003394 }
3395 }
3396
Anders Carlssone437c682010-01-27 03:47:49 +00003397 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003398 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003399 case AMD3DNowAthlon:
3400 Builder.defineMacro("__3dNOW_A__");
3401 case AMD3DNow:
3402 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003403 case MMX:
3404 Builder.defineMacro("__MMX__");
3405 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003406 break;
3407 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003408
3409 if (CPU >= CK_i486) {
3410 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3411 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3412 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3413 }
3414 if (CPU >= CK_i586)
3415 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003416}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003417
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003418bool X86TargetInfo::hasFeature(StringRef Feature) const {
3419 return llvm::StringSwitch<bool>(Feature)
3420 .Case("aes", HasAES)
3421 .Case("avx", SSELevel >= AVX)
3422 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003423 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003424 .Case("avx512cd", HasAVX512CD)
3425 .Case("avx512er", HasAVX512ER)
3426 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003427 .Case("avx512dq", HasAVX512DQ)
3428 .Case("avx512bw", HasAVX512BW)
3429 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003430 .Case("bmi", HasBMI)
3431 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003432 .Case("cx16", HasCX16)
3433 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003434 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003435 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003436 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003437 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003438 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003439 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3440 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3441 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003442 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003443 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003444 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003445 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003446 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003447 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003448 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003449 .Case("sse", SSELevel >= SSE1)
3450 .Case("sse2", SSELevel >= SSE2)
3451 .Case("sse3", SSELevel >= SSE3)
3452 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003453 .Case("sse4.1", SSELevel >= SSE41)
3454 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003455 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003456 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003457 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003458 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3459 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003460 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003461 .Case("xsave", HasXSAVE)
3462 .Case("xsavec", HasXSAVEC)
3463 .Case("xsaves", HasXSAVES)
3464 .Case("xsaveopt", HasXSAVEOPT)
Asaf Badouha9d1e182015-12-31 14:14:07 +00003465 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003466 .Default(false);
3467}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003468
Eric Christopherd9832702015-06-29 21:00:05 +00003469// We can't use a generic validation scheme for the features accepted here
3470// versus subtarget features accepted in the target attribute because the
3471// bitfield structure that's initialized in the runtime only supports the
3472// below currently rather than the full range of subtarget features. (See
3473// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3474bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3475 return llvm::StringSwitch<bool>(FeatureStr)
3476 .Case("cmov", true)
3477 .Case("mmx", true)
3478 .Case("popcnt", true)
3479 .Case("sse", true)
3480 .Case("sse2", true)
3481 .Case("sse3", true)
3482 .Case("sse4.1", true)
3483 .Case("sse4.2", true)
3484 .Case("avx", true)
3485 .Case("avx2", true)
3486 .Case("sse4a", true)
3487 .Case("fma4", true)
3488 .Case("xop", true)
3489 .Case("fma", true)
3490 .Case("avx512f", true)
3491 .Case("bmi", true)
3492 .Case("bmi2", true)
3493 .Default(false);
3494}
3495
Eli Friedman3fd920a2008-08-20 02:34:37 +00003496bool
Anders Carlsson58436352009-02-28 17:11:49 +00003497X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003498 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003499 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003500 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003501 // Constant constraints.
3502 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3503 // instructions.
3504 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3505 // x86_64 instructions.
3506 case 's':
3507 Info.setRequiresImmediate();
3508 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003509 case 'I':
3510 Info.setRequiresImmediate(0, 31);
3511 return true;
3512 case 'J':
3513 Info.setRequiresImmediate(0, 63);
3514 return true;
3515 case 'K':
3516 Info.setRequiresImmediate(-128, 127);
3517 return true;
3518 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003519 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003520 return true;
3521 case 'M':
3522 Info.setRequiresImmediate(0, 3);
3523 return true;
3524 case 'N':
3525 Info.setRequiresImmediate(0, 255);
3526 return true;
3527 case 'O':
3528 Info.setRequiresImmediate(0, 127);
3529 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003530 // Register constraints.
3531 case 'Y': // 'Y' is the first character for several 2-character constraints.
3532 // Shift the pointer to the second character of the constraint.
3533 Name++;
3534 switch (*Name) {
3535 default:
3536 return false;
3537 case '0': // First SSE register.
3538 case 't': // Any SSE register, when SSE2 is enabled.
3539 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3540 case 'm': // Any MMX register, when inter-unit moves enabled.
3541 Info.setAllowsRegister();
3542 return true;
3543 }
3544 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003545 // Constraint 'f' cannot be used for output operands.
3546 if (Info.ConstraintStr[0] == '=')
3547 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003548 Info.setAllowsRegister();
3549 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003550 case 'a': // eax.
3551 case 'b': // ebx.
3552 case 'c': // ecx.
3553 case 'd': // edx.
3554 case 'S': // esi.
3555 case 'D': // edi.
3556 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003557 case 't': // Top of floating point stack.
3558 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003559 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003560 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003561 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003562 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003563 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3564 case 'l': // "Index" registers: any general register that can be used as an
3565 // index in a base+index memory access.
3566 Info.setAllowsRegister();
3567 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003568 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003569 case 'C': // SSE floating point constant.
3570 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003571 return true;
3572 }
3573}
3574
Akira Hatanaka974131e2014-09-18 18:17:18 +00003575bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3576 unsigned Size) const {
3577 // Strip off constraint modifiers.
3578 while (Constraint[0] == '=' ||
3579 Constraint[0] == '+' ||
3580 Constraint[0] == '&')
3581 Constraint = Constraint.substr(1);
3582
3583 return validateOperandSize(Constraint, Size);
3584}
3585
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003586bool X86TargetInfo::validateInputSize(StringRef Constraint,
3587 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003588 return validateOperandSize(Constraint, Size);
3589}
3590
3591bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3592 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003593 switch (Constraint[0]) {
3594 default: break;
3595 case 'y':
3596 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003597 case 'f':
3598 case 't':
3599 case 'u':
3600 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003601 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003602 if (SSELevel >= AVX512F)
3603 // 512-bit zmm registers can be used if target supports AVX512F.
3604 return Size <= 512U;
3605 else if (SSELevel >= AVX)
3606 // 256-bit ymm registers can be used if target supports AVX.
3607 return Size <= 256U;
3608 return Size <= 128U;
3609 case 'Y':
3610 // 'Y' is the first character for several 2-character constraints.
3611 switch (Constraint[1]) {
3612 default: break;
3613 case 'm':
3614 // 'Ym' is synonymous with 'y'.
3615 return Size <= 64;
3616 case 'i':
3617 case 't':
3618 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3619 if (SSELevel >= AVX512F)
3620 return Size <= 512U;
3621 else if (SSELevel >= AVX)
3622 return Size <= 256U;
3623 return SSELevel >= SSE2 && Size <= 128U;
3624 }
3625
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003626 }
3627
3628 return true;
3629}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003630
Eli Friedman3fd920a2008-08-20 02:34:37 +00003631std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003632X86TargetInfo::convertConstraint(const char *&Constraint) const {
3633 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003634 case 'a': return std::string("{ax}");
3635 case 'b': return std::string("{bx}");
3636 case 'c': return std::string("{cx}");
3637 case 'd': return std::string("{dx}");
3638 case 'S': return std::string("{si}");
3639 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003640 case 'p': // address
3641 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003642 case 't': // top of floating point stack.
3643 return std::string("{st}");
3644 case 'u': // second from top of floating point stack.
3645 return std::string("{st(1)}"); // second from top of floating point stack.
3646 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003647 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003648 }
3649}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003650
Eli Friedman3fd920a2008-08-20 02:34:37 +00003651// X86-32 generic target
3652class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003653public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003654 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003655 DoubleAlign = LongLongAlign = 32;
3656 LongDoubleWidth = 96;
3657 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003658 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003659 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003660 SizeType = UnsignedInt;
3661 PtrDiffType = SignedInt;
3662 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003663 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003664
3665 // Use fpret for all types.
3666 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3667 (1 << TargetInfo::Double) |
3668 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003669
3670 // x86-32 has atomics up to 8 bytes
3671 // FIXME: Check that we actually have cmpxchg8b before setting
3672 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3673 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003674 }
Craig Topper3164f332014-03-11 03:39:26 +00003675 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003676 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003677 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003678
Craig Topper3164f332014-03-11 03:39:26 +00003679 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003680 if (RegNo == 0) return 0;
3681 if (RegNo == 1) return 2;
3682 return -1;
3683 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003684 bool validateOperandSize(StringRef Constraint,
3685 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003686 switch (Constraint[0]) {
3687 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003688 case 'R':
3689 case 'q':
3690 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003691 case 'a':
3692 case 'b':
3693 case 'c':
3694 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003695 case 'S':
3696 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003697 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003698 case 'A':
3699 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003700 }
3701
Akira Hatanaka974131e2014-09-18 18:17:18 +00003702 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003703 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003704};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003705
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003706class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3707public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003708 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3709 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003710
Craig Topper3164f332014-03-11 03:39:26 +00003711 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003712 unsigned Major, Minor, Micro;
3713 getTriple().getOSVersion(Major, Minor, Micro);
3714 // New NetBSD uses the default rounding mode.
3715 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3716 return X86_32TargetInfo::getFloatEvalMethod();
3717 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003718 return 1;
3719 }
3720};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003721
Eli Friedmane3aa4542009-07-05 18:47:56 +00003722class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3723public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003724 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3725 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003726 SizeType = UnsignedLong;
3727 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003728 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003729 }
3730};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003731
Eli Friedman9fa28852012-08-08 23:57:20 +00003732class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3733public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003734 BitrigI386TargetInfo(const llvm::Triple &Triple)
3735 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003736 SizeType = UnsignedLong;
3737 IntPtrType = SignedLong;
3738 PtrDiffType = SignedLong;
3739 }
3740};
Eli Friedman9fa28852012-08-08 23:57:20 +00003741
Torok Edwinb2b37c62009-06-30 17:10:35 +00003742class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003743public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003744 DarwinI386TargetInfo(const llvm::Triple &Triple)
3745 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003746 LongDoubleWidth = 128;
3747 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003748 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00003749 MaxVectorAlign = 256;
3750 // The watchOS simulator uses the builtin bool type for Objective-C.
3751 llvm::Triple T = llvm::Triple(Triple);
3752 if (T.isWatchOS())
3753 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003754 SizeType = UnsignedLong;
3755 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003756 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003757 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003758 }
3759
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003760 bool handleTargetFeatures(std::vector<std::string> &Features,
3761 DiagnosticsEngine &Diags) override {
3762 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3763 Diags))
3764 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003765 // We now know the features we have: we can decide how to align vectors.
3766 MaxVectorAlign =
3767 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003768 return true;
3769 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003770};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003771
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003772// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003773class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003774public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003775 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3776 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003777 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003778 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003779 bool IsWinCOFF =
3780 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003781 DataLayoutString = IsWinCOFF
3782 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3783 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003784 }
Craig Topper3164f332014-03-11 03:39:26 +00003785 void getTargetDefines(const LangOptions &Opts,
3786 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003787 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3788 }
3789};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003790
3791// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003792class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003793public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003794 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003795 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003796 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003797 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3798 }
Craig Topper3164f332014-03-11 03:39:26 +00003799 void getTargetDefines(const LangOptions &Opts,
3800 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003801 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3802 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3803 // The value of the following reflects processor type.
3804 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3805 // We lost the original triple, so we use the default.
3806 Builder.defineMacro("_M_IX86", "600");
3807 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003808};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003809
David Majnemerae1ed0e2015-05-28 04:36:18 +00003810static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003811 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3812 // supports __declspec natively under -fms-extensions, but we define a no-op
3813 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003814 if (Opts.MicrosoftExt)
3815 Builder.defineMacro("__declspec", "__declspec");
3816 else
3817 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3818
3819 if (!Opts.MicrosoftExt) {
3820 // Provide macros for all the calling convention keywords. Provide both
3821 // single and double underscore prefixed variants. These are available on
3822 // x64 as well as x86, even though they have no effect.
3823 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3824 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003825 std::string GCCSpelling = "__attribute__((__";
3826 GCCSpelling += CC;
3827 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003828 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3829 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3830 }
3831 }
3832}
3833
David Majnemerae1ed0e2015-05-28 04:36:18 +00003834static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3835 Builder.defineMacro("__MSVCRT__");
3836 Builder.defineMacro("__MINGW32__");
3837 addCygMingDefines(Opts, Builder);
3838}
3839
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003840// x86-32 MinGW target
3841class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3842public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003843 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003844 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003845 void getTargetDefines(const LangOptions &Opts,
3846 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003847 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003848 DefineStd(Builder, "WIN32", Opts);
3849 DefineStd(Builder, "WINNT", Opts);
3850 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003851 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003852 }
3853};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003854
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003855// x86-32 Cygwin target
3856class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3857public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003858 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3859 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003860 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003861 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003862 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 +00003863 }
Craig Topper3164f332014-03-11 03:39:26 +00003864 void getTargetDefines(const LangOptions &Opts,
3865 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003866 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003867 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003868 Builder.defineMacro("__CYGWIN__");
3869 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003870 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003871 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003872 if (Opts.CPlusPlus)
3873 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003874 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003875};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003876
Chris Lattnerb986aba2010-04-11 19:29:39 +00003877// x86-32 Haiku target
3878class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3879public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003880 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003881 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003882 IntPtrType = SignedLong;
3883 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003884 ProcessIDType = SignedLong;
James Y Knighta3518ad2016-01-27 01:04:51 +00003885 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003886 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003887 }
Craig Topper3164f332014-03-11 03:39:26 +00003888 void getTargetDefines(const LangOptions &Opts,
3889 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003890 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3891 Builder.defineMacro("__INTEL__");
3892 Builder.defineMacro("__HAIKU__");
3893 }
3894};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003895
Alexey Bataevc99b0492015-11-25 09:24:26 +00003896// X86-32 MCU target
3897class MCUX86_32TargetInfo : public X86_32TargetInfo {
3898public:
3899 MCUX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3900 LongDoubleWidth = 64;
3901 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Andrey Bokhanko4f8867f2016-01-14 10:59:36 +00003902 UserLabelPrefix = "";
Alexey Bataevc99b0492015-11-25 09:24:26 +00003903 }
3904
3905 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3906 // On MCU we support only C calling convention.
3907 return CC == CC_C ? CCCR_OK : CCCR_Warning;
3908 }
3909
3910 void getTargetDefines(const LangOptions &Opts,
3911 MacroBuilder &Builder) const override {
3912 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3913 Builder.defineMacro("__iamcu");
3914 Builder.defineMacro("__iamcu__");
3915 }
3916};
3917
Douglas Gregor9fabd852011-07-01 22:41:14 +00003918// RTEMS Target
3919template<typename Target>
3920class RTEMSTargetInfo : public OSTargetInfo<Target> {
3921protected:
Craig Topper3164f332014-03-11 03:39:26 +00003922 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3923 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003924 // RTEMS defines; list based off of gcc output
3925
Douglas Gregor9fabd852011-07-01 22:41:14 +00003926 Builder.defineMacro("__rtems__");
3927 Builder.defineMacro("__ELF__");
3928 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003929
Douglas Gregor9fabd852011-07-01 22:41:14 +00003930public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003931 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +00003932 this->UserLabelPrefix = "";
3933
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003934 switch (Triple.getArch()) {
3935 default:
3936 case llvm::Triple::x86:
3937 // this->MCountName = ".mcount";
3938 break;
3939 case llvm::Triple::mips:
3940 case llvm::Triple::mipsel:
3941 case llvm::Triple::ppc:
3942 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003943 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003944 // this->MCountName = "_mcount";
3945 break;
3946 case llvm::Triple::arm:
3947 // this->MCountName = "__mcount";
3948 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003949 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003950 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003951};
3952
Douglas Gregor9fabd852011-07-01 22:41:14 +00003953// x86-32 RTEMS target
3954class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3955public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003956 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003957 SizeType = UnsignedLong;
3958 IntPtrType = SignedLong;
3959 PtrDiffType = SignedLong;
James Y Knighta3518ad2016-01-27 01:04:51 +00003960 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003961 }
Craig Topper3164f332014-03-11 03:39:26 +00003962 void getTargetDefines(const LangOptions &Opts,
3963 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003964 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3965 Builder.defineMacro("__INTEL__");
3966 Builder.defineMacro("__rtems__");
3967 }
3968};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003969
Eli Friedman3fd920a2008-08-20 02:34:37 +00003970// x86-64 generic target
3971class X86_64TargetInfo : public X86TargetInfo {
3972public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003973 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003974 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003975 bool IsWinCOFF =
3976 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003977 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003978 LongDoubleWidth = 128;
3979 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003980 LargeArrayMinWidth = 128;
3981 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003982 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003983 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3984 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3985 IntPtrType = IsX32 ? SignedInt : SignedLong;
3986 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003987 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003988 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003989
Eric Christopher917e9522014-11-18 22:36:15 +00003990 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003991 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3992 : IsWinCOFF
3993 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
3994 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003995
3996 // Use fpret only for long double.
3997 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003998
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00003999 // Use fp2ret for _Complex long double.
4000 ComplexLongDoubleUsesFP2Ret = true;
4001
Charles Davisc7d5c942015-09-17 20:55:33 +00004002 // Make __builtin_ms_va_list available.
4003 HasBuiltinMSVaList = true;
4004
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004005 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004006 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004007 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004008 }
Craig Topper3164f332014-03-11 03:39:26 +00004009 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004010 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004011 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004012
Craig Topper3164f332014-03-11 03:39:26 +00004013 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004014 if (RegNo == 0) return 0;
4015 if (RegNo == 1) return 1;
4016 return -1;
4017 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004018
Craig Topper3164f332014-03-11 03:39:26 +00004019 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00004020 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00004021 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00004022 CC == CC_IntelOclBicc ||
4023 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004024 }
4025
Craig Topper3164f332014-03-11 03:39:26 +00004026 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004027 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004028 }
4029
Pavel Chupinfd223e12014-08-04 12:39:43 +00004030 // for x32 we need it here explicitly
4031 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004032 unsigned getUnwindWordWidth() const override { return 64; }
4033 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004034
4035 bool validateGlobalRegisterVariable(StringRef RegName,
4036 unsigned RegSize,
4037 bool &HasSizeMismatch) const override {
4038 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4039 // handle.
4040 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4041 // Check that the register size is 64-bit.
4042 HasSizeMismatch = RegSize != 64;
4043 return true;
4044 }
4045
4046 // Check if the register is a 32-bit register the backend can handle.
4047 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4048 HasSizeMismatch);
4049 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004050};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004051
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004052// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004053class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004054public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004055 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
4056 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004057 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004058 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004059 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004060 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004061 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004062 SizeType = UnsignedLongLong;
4063 PtrDiffType = SignedLongLong;
4064 IntPtrType = SignedLongLong;
James Y Knighta3518ad2016-01-27 01:04:51 +00004065 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004066 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004067
Craig Topper3164f332014-03-11 03:39:26 +00004068 void getTargetDefines(const LangOptions &Opts,
4069 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004070 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004071 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004072 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004073
Craig Topper3164f332014-03-11 03:39:26 +00004074 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004075 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004076 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004077
Craig Topper3164f332014-03-11 03:39:26 +00004078 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004079 switch (CC) {
4080 case CC_X86StdCall:
4081 case CC_X86ThisCall:
4082 case CC_X86FastCall:
4083 return CCCR_Ignore;
4084 case CC_C:
4085 case CC_X86VectorCall:
4086 case CC_IntelOclBicc:
4087 case CC_X86_64SysV:
4088 return CCCR_OK;
4089 default:
4090 return CCCR_Warning;
4091 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004092 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004093};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004094
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004095// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004096class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004097public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004098 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004099 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00004100 LongDoubleWidth = LongDoubleAlign = 64;
4101 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004102 }
Craig Topper3164f332014-03-11 03:39:26 +00004103 void getTargetDefines(const LangOptions &Opts,
4104 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004105 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4106 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004107 Builder.defineMacro("_M_X64", "100");
4108 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004109 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004110};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004111
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004112// x86-64 MinGW target
4113class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4114public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004115 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Reid Kleckner11a17192015-10-28 22:29:52 +00004116 : WindowsX86_64TargetInfo(Triple) {
4117 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4118 // with x86 FP ops. Weird.
4119 LongDoubleWidth = LongDoubleAlign = 128;
4120 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4121 }
4122
Craig Topper3164f332014-03-11 03:39:26 +00004123 void getTargetDefines(const LangOptions &Opts,
4124 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004125 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004126 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004127 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004128 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004129
4130 // GCC defines this macro when it is using __gxx_personality_seh0.
4131 if (!Opts.SjLjExceptions)
4132 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004133 }
4134};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004135
Yaron Kerend030d112015-07-22 17:38:19 +00004136// x86-64 Cygwin target
4137class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4138public:
4139 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4140 : X86_64TargetInfo(Triple) {
4141 TLSSupported = false;
4142 WCharType = UnsignedShort;
4143 }
4144 void getTargetDefines(const LangOptions &Opts,
4145 MacroBuilder &Builder) const override {
4146 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4147 Builder.defineMacro("__x86_64__");
4148 Builder.defineMacro("__CYGWIN__");
4149 Builder.defineMacro("__CYGWIN64__");
4150 addCygMingDefines(Opts, Builder);
4151 DefineStd(Builder, "unix", Opts);
4152 if (Opts.CPlusPlus)
4153 Builder.defineMacro("_GNU_SOURCE");
4154
4155 // GCC defines this macro when it is using __gxx_personality_seh0.
4156 if (!Opts.SjLjExceptions)
4157 Builder.defineMacro("__SEH__");
4158 }
4159};
4160
Eli Friedman2857ccb2009-07-01 03:36:11 +00004161class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4162public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004163 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4164 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004165 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004166 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4167 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004168 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004169 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004170 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004171 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004172
4173 bool handleTargetFeatures(std::vector<std::string> &Features,
4174 DiagnosticsEngine &Diags) override {
4175 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4176 Diags))
4177 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004178 // We now know the features we have: we can decide how to align vectors.
4179 MaxVectorAlign =
4180 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004181 return true;
4182 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004183};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004184
Eli Friedman245f2292009-07-05 22:31:18 +00004185class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4186public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004187 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4188 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004189 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004190 Int64Type = SignedLongLong;
4191 }
4192};
Eli Friedman245f2292009-07-05 22:31:18 +00004193
Eli Friedman9fa28852012-08-08 23:57:20 +00004194class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4195public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004196 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4197 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4198 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004199 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004200 }
4201};
Tim Northover9bb857a2013-01-31 12:13:10 +00004202
Eli Friedmanf05b7722008-08-20 07:44:10 +00004203class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004204 // Possible FPU choices.
4205 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004206 VFP2FPU = (1 << 0),
4207 VFP3FPU = (1 << 1),
4208 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004209 NeonFPU = (1 << 3),
4210 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004211 };
4212
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004213 // Possible HWDiv features.
4214 enum HWDivMode {
4215 HWDivThumb = (1 << 0),
4216 HWDivARM = (1 << 1)
4217 };
4218
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004219 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004220 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004221 }
4222
4223 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4224 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004225
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004226 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004227
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004228 StringRef CPUProfile;
4229 StringRef CPUAttr;
4230
Rafael Espindolaeb265472013-08-21 21:59:03 +00004231 enum {
4232 FP_Default,
4233 FP_VFP,
4234 FP_Neon
4235 } FPMath;
4236
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004237 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004238 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004239 unsigned ArchProfile;
4240 unsigned ArchVersion;
4241
Bernard Ogdenda13af32013-10-24 18:32:51 +00004242 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004243
Logan Chien57086ce2012-10-10 06:56:20 +00004244 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004245 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004246
4247 // Initialized via features.
4248 unsigned SoftFloat : 1;
4249 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004250
Bernard Ogden18b57012013-10-29 09:47:51 +00004251 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004252 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004253 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004254 unsigned Unaligned : 1;
4255
4256 enum {
4257 LDREX_B = (1 << 0), /// byte (8-bit)
4258 LDREX_H = (1 << 1), /// half (16-bit)
4259 LDREX_W = (1 << 2), /// word (32-bit)
4260 LDREX_D = (1 << 3), /// double (64-bit)
4261 };
4262
4263 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004264
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004265 // ACLE 6.5.1 Hardware floating point
4266 enum {
4267 HW_FP_HP = (1 << 1), /// half (16-bit)
4268 HW_FP_SP = (1 << 2), /// single (32-bit)
4269 HW_FP_DP = (1 << 3), /// double (64-bit)
4270 };
4271 uint32_t HW_FP;
4272
Chris Lattner5cc15e02010-03-03 19:03:45 +00004273 static const Builtin::Info BuiltinInfo[];
4274
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004275 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004276 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004277
4278 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004279 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004280
Renato Golin9ba39232015-02-27 16:35:48 +00004281 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4282 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4283 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004284 SizeType = UnsignedLong;
4285 else
4286 SizeType = UnsignedInt;
4287
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004288 switch (T.getOS()) {
4289 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004290 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004291 break;
4292 case llvm::Triple::Win32:
4293 WCharType = UnsignedShort;
4294 break;
4295 case llvm::Triple::Linux:
4296 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004297 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4298 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004299 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004300 }
4301
4302 UseBitFieldTypeAlignment = true;
4303
4304 ZeroLengthBitfieldBoundary = 0;
4305
Tim Northover147cd2f2014-10-14 22:12:21 +00004306 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4307 // so set preferred for small types to 32.
4308 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004309 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004310 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4311 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4312 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004313 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004314 DataLayoutString = "e"
4315 "-m:w"
4316 "-p:32:32"
4317 "-i64:64"
4318 "-v128:64:128"
4319 "-a:0:32"
4320 "-n32"
4321 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004322 } else if (T.isOSNaCl()) {
4323 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004324 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004325 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004326 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004327 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4328 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004329 }
4330
4331 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004332 }
4333
Tim Northover5627d392015-10-30 16:30:45 +00004334 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004335 const llvm::Triple &T = getTriple();
4336
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004337 IsAAPCS = false;
4338
Tim Northover5627d392015-10-30 16:30:45 +00004339 if (IsAAPCS16)
4340 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4341 else
4342 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004343
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004344 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004345 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004346 SizeType = UnsignedInt;
4347 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004348 SizeType = UnsignedLong;
4349
4350 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4351 WCharType = SignedInt;
4352
4353 // Do not respect the alignment of bit-field types when laying out
4354 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4355 UseBitFieldTypeAlignment = false;
4356
4357 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4358 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4359 /// gcc.
4360 ZeroLengthBitfieldBoundary = 32;
4361
Tim Northover5627d392015-10-30 16:30:45 +00004362 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4363 assert(!BigEndian && "AAPCS16 does not support big-endian");
4364 DataLayoutString = "e-m:o-p:32:32-i64:64-a:0:32-n32-S128";
4365 } else if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004366 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004367 BigEndian
4368 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4369 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4370 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004371 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004372 BigEndian
4373 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4374 : "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 +00004375
4376 // FIXME: Override "preferred align" for double and long long.
4377 }
4378
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004379 void setArchInfo() {
4380 StringRef ArchName = getTriple().getArchName();
4381
Renato Goline84b0002015-10-08 16:43:26 +00004382 ArchISA = llvm::ARM::parseArchISA(ArchName);
4383 CPU = llvm::ARM::getDefaultCPU(ArchName);
4384 unsigned AK = llvm::ARM::parseArch(ArchName);
4385 if (AK != llvm::ARM::AK_INVALID)
4386 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004387 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004388 }
4389
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004390 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004391 StringRef SubArch;
4392
4393 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004394 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004395 SubArch = llvm::ARM::getSubArch(ArchKind);
4396 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4397 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004398
4399 // cache CPU related strings
4400 CPUAttr = getCPUAttr();
4401 CPUProfile = getCPUProfile();
4402 }
4403
4404 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004405 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004406 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004407 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004408 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4409 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004410 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004411 if (ArchProfile == llvm::ARM::PK_M) {
4412 MaxAtomicPromoteWidth = 32;
4413 if (ShouldUseInlineAtomic)
4414 MaxAtomicInlineWidth = 32;
4415 }
4416 else {
4417 MaxAtomicPromoteWidth = 64;
4418 if (ShouldUseInlineAtomic)
4419 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004420 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004421 }
4422
4423 bool isThumb() const {
4424 return (ArchISA == llvm::ARM::IK_THUMB);
4425 }
4426
4427 bool supportsThumb() const {
4428 return CPUAttr.count('T') || ArchVersion >= 6;
4429 }
4430
4431 bool supportsThumb2() const {
4432 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4433 }
4434
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004435 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004436 // For most sub-arches, the build attribute CPU name is enough.
4437 // For Cortex variants, it's slightly different.
4438 switch(ArchKind) {
4439 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004440 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004441 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004442 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004443 case llvm::ARM::AK_ARMV7S:
4444 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004445 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004446 return "7A";
4447 case llvm::ARM::AK_ARMV7R:
4448 return "7R";
4449 case llvm::ARM::AK_ARMV7M:
4450 return "7M";
4451 case llvm::ARM::AK_ARMV7EM:
4452 return "7EM";
4453 case llvm::ARM::AK_ARMV8A:
4454 return "8A";
4455 case llvm::ARM::AK_ARMV8_1A:
4456 return "8_1A";
4457 }
4458 }
4459
4460 StringRef getCPUProfile() const {
4461 switch(ArchProfile) {
4462 case llvm::ARM::PK_A:
4463 return "A";
4464 case llvm::ARM::PK_R:
4465 return "R";
4466 case llvm::ARM::PK_M:
4467 return "M";
4468 default:
4469 return "";
4470 }
4471 }
4472
Chris Lattner17df24e2008-04-21 18:56:49 +00004473public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004474 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004475 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004476 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004477 BigEndian = IsBigEndian;
4478
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004479 switch (getTriple().getOS()) {
4480 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004481 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004482 break;
4483 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004484 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004485 break;
4486 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004487
Renato Goline84b0002015-10-08 16:43:26 +00004488 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004489 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004490
Chris Lattner1a8f3942010-04-23 16:29:58 +00004491 // {} in inline assembly are neon specifiers, not assembly variant
4492 // specifiers.
4493 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004494
Eric Christopher0e261882014-12-05 01:06:59 +00004495 // FIXME: This duplicates code from the driver that sets the -target-abi
4496 // option - this code is used if -target-abi isn't passed and should
4497 // be unified in some way.
4498 if (Triple.isOSBinFormatMachO()) {
4499 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4500 // the frontend matches that.
4501 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4502 Triple.getOS() == llvm::Triple::UnknownOS ||
4503 StringRef(CPU).startswith("cortex-m")) {
4504 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004505 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004506 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004507 } else {
4508 setABI("apcs-gnu");
4509 }
4510 } else if (Triple.isOSWindows()) {
4511 // FIXME: this is invalid for WindowsCE
4512 setABI("aapcs");
4513 } else {
4514 // Select the default based on the platform.
4515 switch (Triple.getEnvironment()) {
4516 case llvm::Triple::Android:
4517 case llvm::Triple::GNUEABI:
4518 case llvm::Triple::GNUEABIHF:
4519 setABI("aapcs-linux");
4520 break;
4521 case llvm::Triple::EABIHF:
4522 case llvm::Triple::EABI:
4523 setABI("aapcs");
4524 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004525 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004526 setABI("apcs-gnu");
4527 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004528 default:
4529 if (Triple.getOS() == llvm::Triple::NetBSD)
4530 setABI("apcs-gnu");
4531 else
4532 setABI("aapcs");
4533 break;
4534 }
4535 }
John McCall86353412010-08-21 22:46:04 +00004536
4537 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004538 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004539
Renato Golin15b86152015-07-03 16:41:13 +00004540 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004541 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004542
James Molloya7139222012-03-12 09:14:10 +00004543 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004544 // the alignment of the zero-length bitfield is greater than the member
4545 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004546 // zero length bitfield.
4547 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004548 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004549
Alp Toker4925ba72014-06-07 23:30:42 +00004550 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004551
Craig Topper3164f332014-03-11 03:39:26 +00004552 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004553 ABI = Name;
4554
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004555 // The defaults (above) are for AAPCS, check if we need to change them.
4556 //
4557 // FIXME: We need support for -meabi... we could just mangle it into the
4558 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004559 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004560 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004561 return true;
4562 }
4563 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4564 setABIAAPCS();
4565 return true;
4566 }
4567 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004568 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004569
Renato Golinf5c4dec2015-05-27 13:33:00 +00004570 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004571 bool
4572 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4573 StringRef CPU,
4574 const std::vector<std::string> &FeaturesVec) const override {
4575
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004576 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004577 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004578
4579 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004580 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004581 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4582
4583 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004584 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004585 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4586
4587 for (const char *Feature : TargetFeatures)
4588 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004589 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004590
Eric Christopher007b0a02015-08-28 22:32:01 +00004591 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004592 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004593
Craig Topper3164f332014-03-11 03:39:26 +00004594 bool handleTargetFeatures(std::vector<std::string> &Features,
4595 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004596 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004597 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004598 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004599 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004600 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004601 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004602 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004603
Ranjeet Singhac08e532015-06-24 23:39:25 +00004604 // This does not diagnose illegal cases like having both
4605 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4606 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004607 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004608 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004609 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004610 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004611 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004612 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004613 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004614 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004615 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004616 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004617 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004618 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004619 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004620 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004621 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004622 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004623 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004624 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004625 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004626 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004627 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004628 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004629 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004630 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004631 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004632 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004633 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004634 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004635 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004636 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004637 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004638 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004639 } else if (Feature == "+strict-align") {
4640 Unaligned = 0;
4641 } else if (Feature == "+fp16") {
4642 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004643 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004644 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004645 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004646
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004647 switch (ArchVersion) {
4648 case 6:
4649 if (ArchProfile == llvm::ARM::PK_M)
4650 LDREX = 0;
4651 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4652 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4653 else
4654 LDREX = LDREX_W;
4655 break;
4656 case 7:
4657 if (ArchProfile == llvm::ARM::PK_M)
4658 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4659 else
4660 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4661 break;
4662 case 8:
4663 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4664 }
4665
Rafael Espindolaeb265472013-08-21 21:59:03 +00004666 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4667 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4668 return false;
4669 }
4670
4671 if (FPMath == FP_Neon)
4672 Features.push_back("+neonfp");
4673 else if (FPMath == FP_VFP)
4674 Features.push_back("-neonfp");
4675
Daniel Dunbar893d4752009-12-19 04:15:38 +00004676 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004677 auto Feature =
4678 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4679 if (Feature != Features.end())
4680 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004681
Rafael Espindolaeb265472013-08-21 21:59:03 +00004682 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004683 }
4684
Craig Topper3164f332014-03-11 03:39:26 +00004685 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004686 return llvm::StringSwitch<bool>(Feature)
4687 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004688 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004689 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004690 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004691 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004692 .Case("hwdiv", HWDiv & HWDivThumb)
4693 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004694 .Default(false);
4695 }
Renato Golin15b86152015-07-03 16:41:13 +00004696
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004697 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004698 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004699 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004700
Renato Golin15b86152015-07-03 16:41:13 +00004701 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004702 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004703 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004704 CPU = Name;
4705 return true;
4706 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004707
Craig Topper3164f332014-03-11 03:39:26 +00004708 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004709
Craig Topper3164f332014-03-11 03:39:26 +00004710 void getTargetDefines(const LangOptions &Opts,
4711 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004712 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004713 Builder.defineMacro("__arm");
4714 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004715
Chris Lattnerecd49032009-03-02 22:27:17 +00004716 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004717 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00004718
4719 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
4720 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00004721 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00004722 Builder.defineMacro("__ARM_ARCH_7K__", "2");
4723
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004724 if (!CPUAttr.empty())
4725 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004726
4727 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004728 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00004729 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004730
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004731 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004732 // ACLE 6.5.7 Crypto Extension
4733 if (Crypto)
4734 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4735 // ACLE 6.5.8 CRC32 Extension
4736 if (CRC)
4737 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4738 // ACLE 6.5.10 Numeric Maximum and Minimum
4739 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4740 // ACLE 6.5.9 Directed Rounding
4741 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004742 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004743
4744 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4745 // is not defined for the M-profile.
4746 // NOTE that the deffault profile is assumed to be 'A'
4747 if (CPUProfile.empty() || CPUProfile != "M")
4748 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4749
4750 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4751 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4752 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004753 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004754 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004755 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004756 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4757
4758 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4759 // instruction set such as ARM or Thumb.
4760 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4761
4762 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4763
4764 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004765 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004766 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004767
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004768 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004769 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004770 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004771
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004772 // ACLE 6.4.4 LDREX/STREX
4773 if (LDREX)
4774 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4775
4776 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004777 if (ArchVersion == 5 ||
4778 (ArchVersion == 6 && CPUProfile != "M") ||
4779 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004780 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4781
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004782 // ACLE 6.5.1 Hardware Floating Point
4783 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004784 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004785
Yi Konga44c4d72014-06-27 21:25:42 +00004786 // ACLE predefines.
4787 Builder.defineMacro("__ARM_ACLE", "200");
4788
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004789 // FP16 support (we currently only support IEEE format).
4790 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4791 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4792
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004793 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4794 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4795 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4796
Mike Stump9d54bd72009-04-08 02:07:04 +00004797 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004798
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004799 // FIXME: It's more complicated than this and we don't really support
4800 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004801 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004802 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004803 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004804
David Tweed8f676532012-10-25 13:33:01 +00004805 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004806 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004807 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4808 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004809 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004810 Builder.defineMacro("__ARM_PCS", "1");
4811
David Tweed8f676532012-10-25 13:33:01 +00004812 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004813 Builder.defineMacro("__ARM_PCS_VFP", "1");
4814 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004815
Daniel Dunbar893d4752009-12-19 04:15:38 +00004816 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004817 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004818
4819 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004820 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004821
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004822 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004823 Builder.defineMacro("__THUMBEL__");
4824 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004825 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004826 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004827 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004828
4829 // ACLE 6.4.9 32-bit SIMD instructions
4830 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4831 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4832
4833 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004834 if (((HWDiv & HWDivThumb) && isThumb()) ||
4835 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004836 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004837 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004838 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004839
4840 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004841 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004842
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004843 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004844 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004845 if (FPU & VFP2FPU)
4846 Builder.defineMacro("__ARM_VFPV2__");
4847 if (FPU & VFP3FPU)
4848 Builder.defineMacro("__ARM_VFPV3__");
4849 if (FPU & VFP4FPU)
4850 Builder.defineMacro("__ARM_VFPV4__");
4851 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004852
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004853 // This only gets set when Neon instructions are actually available, unlike
4854 // the VFP define, hence the soft float and arch check. This is subtly
4855 // different from gcc, we follow the intent which was that it should be set
4856 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004857 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004858 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004859 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004860 // current AArch32 NEON implementations do not support double-precision
4861 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004862 Builder.defineMacro("__ARM_NEON_FP",
4863 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004864 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004865
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004866 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4867 Opts.ShortWChar ? "2" : "4");
4868
4869 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4870 Opts.ShortEnums ? "1" : "4");
4871
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004872 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004873 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4874 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4875 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4876 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4877 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004878
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004879 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004880 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004881 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004882 }
4883
4884 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004885 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004886 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4887 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004888 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004889 }
4890
4891 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004892 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004893 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004894
4895 if (Opts.UnsafeFPMath)
4896 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00004897
4898 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
4899 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004900 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004901
Craig Topper6c03a542015-10-19 04:51:35 +00004902 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4903 return llvm::makeArrayRef(BuiltinInfo,
4904 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00004905 }
Craig Topper3164f332014-03-11 03:39:26 +00004906 bool isCLZForZeroUndef() const override { return false; }
4907 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00004908 return IsAAPCS
4909 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00004910 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
4911 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00004912 }
Craig Topperf054e3a2015-10-19 03:52:27 +00004913 ArrayRef<const char *> getGCCRegNames() const override;
4914 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00004915 bool validateAsmConstraint(const char *&Name,
4916 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004917 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004918 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004919 case 'l': // r0-r7
4920 case 'h': // r8-r15
4921 case 'w': // VFP Floating point register single precision
4922 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004923 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004924 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004925 case 'I':
4926 case 'J':
4927 case 'K':
4928 case 'L':
4929 case 'M':
4930 // FIXME
4931 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004932 case 'Q': // A memory address that is a single base register.
4933 Info.setAllowsMemory();
4934 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004935 case 'U': // a memory reference...
4936 switch (Name[1]) {
4937 case 'q': // ...ARMV4 ldrsb
4938 case 'v': // ...VFP load/store (reg+constant offset)
4939 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004940 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004941 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004942 case 'n': // valid address for Neon doubleword vector load/store
4943 case 'm': // valid address for Neon element and structure load/store
4944 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004945 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004946 Info.setAllowsMemory();
4947 Name++;
4948 return true;
4949 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004950 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004951 return false;
4952 }
Craig Topper3164f332014-03-11 03:39:26 +00004953 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004954 std::string R;
4955 switch (*Constraint) {
4956 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004957 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004958 Constraint++;
4959 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004960 case 'p': // 'p' should be translated to 'r' by default.
4961 R = std::string("r");
4962 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004963 default:
4964 return std::string(1, *Constraint);
4965 }
4966 return R;
4967 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004968 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004969 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004970 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004971 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004972 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004973
Bill Wendling9d1ee112012-10-25 23:28:48 +00004974 // Strip off constraint modifiers.
4975 while (Constraint[0] == '=' ||
4976 Constraint[0] == '+' ||
4977 Constraint[0] == '&')
4978 Constraint = Constraint.substr(1);
4979
4980 switch (Constraint[0]) {
4981 default: break;
4982 case 'r': {
4983 switch (Modifier) {
4984 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004985 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004986 case 'q':
4987 // A register of size 32 cannot fit a vector type.
4988 return false;
4989 }
4990 }
4991 }
4992
4993 return true;
4994 }
Craig Topper3164f332014-03-11 03:39:26 +00004995 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00004996 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00004997 return "";
4998 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004999
Craig Topper3164f332014-03-11 03:39:26 +00005000 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005001 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
5002 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005003
Craig Topper3164f332014-03-11 03:39:26 +00005004 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005005 if (RegNo == 0) return 0;
5006 if (RegNo == 1) return 1;
5007 return -1;
5008 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005009
5010 bool hasSjLjLowering() const override {
5011 return true;
5012 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005013};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005014
Rafael Espindolaeb265472013-08-21 21:59:03 +00005015bool ARMTargetInfo::setFPMath(StringRef Name) {
5016 if (Name == "neon") {
5017 FPMath = FP_Neon;
5018 return true;
5019 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5020 Name == "vfp4") {
5021 FPMath = FP_VFP;
5022 return true;
5023 }
5024 return false;
5025}
5026
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005027const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005028 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005029 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005030 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5031
5032 // Float registers
5033 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5034 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5035 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005036 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005037
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005038 // Double registers
5039 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5040 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005041 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5042 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005043
5044 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005045 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5046 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005047};
5048
Craig Topperf054e3a2015-10-19 03:52:27 +00005049ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5050 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005051}
5052
5053const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005054 { { "a1" }, "r0" },
5055 { { "a2" }, "r1" },
5056 { { "a3" }, "r2" },
5057 { { "a4" }, "r3" },
5058 { { "v1" }, "r4" },
5059 { { "v2" }, "r5" },
5060 { { "v3" }, "r6" },
5061 { { "v4" }, "r7" },
5062 { { "v5" }, "r8" },
5063 { { "v6", "rfp" }, "r9" },
5064 { { "sl" }, "r10" },
5065 { { "fp" }, "r11" },
5066 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005067 { { "r13" }, "sp" },
5068 { { "r14" }, "lr" },
5069 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005070 // The S, D and Q registers overlap, but aren't really aliases; we
5071 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005072};
5073
Craig Topperf054e3a2015-10-19 03:52:27 +00005074ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5075 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005076}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005077
5078const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005079#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005080 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005081#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5082 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005083#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005084
Craig Topper07d3b622015-08-07 05:14:44 +00005085#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005086 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005087#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005088 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005089#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5090 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005091#include "clang/Basic/BuiltinsARM.def"
5092};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005093
5094class ARMleTargetInfo : public ARMTargetInfo {
5095public:
5096 ARMleTargetInfo(const llvm::Triple &Triple)
5097 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005098 void getTargetDefines(const LangOptions &Opts,
5099 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005100 Builder.defineMacro("__ARMEL__");
5101 ARMTargetInfo::getTargetDefines(Opts, Builder);
5102 }
5103};
5104
5105class ARMbeTargetInfo : public ARMTargetInfo {
5106public:
5107 ARMbeTargetInfo(const llvm::Triple &Triple)
5108 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005109 void getTargetDefines(const LangOptions &Opts,
5110 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005111 Builder.defineMacro("__ARMEB__");
5112 Builder.defineMacro("__ARM_BIG_ENDIAN");
5113 ARMTargetInfo::getTargetDefines(Opts, Builder);
5114 }
5115};
Chris Lattner17df24e2008-04-21 18:56:49 +00005116
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005117class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5118 const llvm::Triple Triple;
5119public:
5120 WindowsARMTargetInfo(const llvm::Triple &Triple)
5121 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
5122 TLSSupported = false;
5123 WCharType = UnsignedShort;
5124 SizeType = UnsignedInt;
James Y Knighta3518ad2016-01-27 01:04:51 +00005125 UserLabelPrefix = "";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005126 }
5127 void getVisualStudioDefines(const LangOptions &Opts,
5128 MacroBuilder &Builder) const {
5129 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5130
5131 // FIXME: this is invalid for WindowsCE
5132 Builder.defineMacro("_M_ARM_NT", "1");
5133 Builder.defineMacro("_M_ARMT", "_M_ARM");
5134 Builder.defineMacro("_M_THUMB", "_M_ARM");
5135
5136 assert((Triple.getArch() == llvm::Triple::arm ||
5137 Triple.getArch() == llvm::Triple::thumb) &&
5138 "invalid architecture for Windows ARM target info");
5139 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5140 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5141
5142 // TODO map the complete set of values
5143 // 31: VFPv3 40: VFPv4
5144 Builder.defineMacro("_M_ARM_FP", "31");
5145 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005146 BuiltinVaListKind getBuiltinVaListKind() const override {
5147 return TargetInfo::CharPtrBuiltinVaList;
5148 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005149 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5150 switch (CC) {
5151 case CC_X86StdCall:
5152 case CC_X86ThisCall:
5153 case CC_X86FastCall:
5154 case CC_X86VectorCall:
5155 return CCCR_Ignore;
5156 case CC_C:
5157 return CCCR_OK;
5158 default:
5159 return CCCR_Warning;
5160 }
5161 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005162};
5163
5164// Windows ARM + Itanium C++ ABI Target
5165class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5166public:
5167 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5168 : WindowsARMTargetInfo(Triple) {
5169 TheCXXABI.set(TargetCXXABI::GenericARM);
5170 }
5171
5172 void getTargetDefines(const LangOptions &Opts,
5173 MacroBuilder &Builder) const override {
5174 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5175
5176 if (Opts.MSVCCompat)
5177 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5178 }
5179};
5180
5181// Windows ARM, MS (C++) ABI
5182class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5183public:
5184 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5185 : WindowsARMTargetInfo(Triple) {
5186 TheCXXABI.set(TargetCXXABI::Microsoft);
5187 }
5188
5189 void getTargetDefines(const LangOptions &Opts,
5190 MacroBuilder &Builder) const override {
5191 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5192 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5193 }
5194};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005195
Yaron Keren321249c2015-07-15 13:32:23 +00005196// ARM MinGW target
5197class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5198public:
5199 MinGWARMTargetInfo(const llvm::Triple &Triple)
5200 : WindowsARMTargetInfo(Triple) {
5201 TheCXXABI.set(TargetCXXABI::GenericARM);
5202 }
5203
5204 void getTargetDefines(const LangOptions &Opts,
5205 MacroBuilder &Builder) const override {
5206 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5207 DefineStd(Builder, "WIN32", Opts);
5208 DefineStd(Builder, "WINNT", Opts);
5209 Builder.defineMacro("_ARM_");
5210 addMinGWDefines(Opts, Builder);
5211 }
5212};
5213
5214// ARM Cygwin target
5215class CygwinARMTargetInfo : public ARMleTargetInfo {
5216public:
5217 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5218 TLSSupported = false;
5219 WCharType = UnsignedShort;
5220 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005221 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005222 }
5223 void getTargetDefines(const LangOptions &Opts,
5224 MacroBuilder &Builder) const override {
5225 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5226 Builder.defineMacro("_ARM_");
5227 Builder.defineMacro("__CYGWIN__");
5228 Builder.defineMacro("__CYGWIN32__");
5229 DefineStd(Builder, "unix", Opts);
5230 if (Opts.CPlusPlus)
5231 Builder.defineMacro("_GNU_SOURCE");
5232 }
5233};
5234
Mike Stump11289f42009-09-09 15:08:12 +00005235class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005236 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005237protected:
Craig Topper3164f332014-03-11 03:39:26 +00005238 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5239 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005240 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005241 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005242
Torok Edwinb2b37c62009-06-30 17:10:35 +00005243public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005244 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005245 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005246 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005247 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005248 // FIXME: This should be based off of the target features in
5249 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005250 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005251
Tim Northoverd88ecb32016-01-27 19:32:40 +00005252 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005253 // Darwin on iOS uses a variant of the ARM C++ ABI.
5254 TheCXXABI.set(TargetCXXABI::WatchOS);
5255
5256 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5257 // size_t is long, it's a bit weird for it to be int.
5258 PtrDiffType = SignedLong;
5259
5260 // BOOL should be a real boolean on the new ABI
5261 UseSignedCharForObjCBool = false;
5262 } else
5263 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005264 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005265};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005266
Tim Northover573cbee2014-05-24 12:52:07 +00005267class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005268 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005269 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5270 static const char *const GCCRegNames[];
5271
James Molloy75f5f9e2014-04-16 15:33:48 +00005272 enum FPUModeEnum {
5273 FPUMode,
5274 NeonMode
5275 };
5276
5277 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005278 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005279 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005280 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005281 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005282
Tim Northovera2ee4332014-03-29 15:09:45 +00005283 static const Builtin::Info BuiltinInfo[];
5284
5285 std::string ABI;
5286
5287public:
Tim Northover573cbee2014-05-24 12:52:07 +00005288 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005289 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005290
5291 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5292 WCharType = SignedInt;
5293
5294 // NetBSD apparently prefers consistency across ARM targets to consistency
5295 // across 64-bit targets.
5296 Int64Type = SignedLongLong;
5297 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005298 } else {
5299 WCharType = UnsignedInt;
5300 Int64Type = SignedLong;
5301 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005302 }
5303
Tim Northovera2ee4332014-03-29 15:09:45 +00005304 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005305 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005306 MaxAtomicInlineWidth = 128;
5307 MaxAtomicPromoteWidth = 128;
5308
Tim Northovera6a19f12015-02-06 01:25:07 +00005309 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005310 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5311
Tim Northovera2ee4332014-03-29 15:09:45 +00005312 // {} in inline assembly are neon specifiers, not assembly variant
5313 // specifiers.
5314 NoAsmVariants = true;
5315
Tim Northover7ad87af2015-01-16 18:44:04 +00005316 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5317 // contributes to the alignment of the containing aggregate in the same way
5318 // a plain (non bit-field) member of that type would, without exception for
5319 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005320 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005321 UseZeroLengthBitfieldAlignment = true;
5322
Tim Northover573cbee2014-05-24 12:52:07 +00005323 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005324 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5325 }
5326
Alp Toker4925ba72014-06-07 23:30:42 +00005327 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005328 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005329 if (Name != "aapcs" && Name != "darwinpcs")
5330 return false;
5331
5332 ABI = Name;
5333 return true;
5334 }
5335
David Blaikie1cbb9712014-11-14 19:09:44 +00005336 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005337 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005338 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005339 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5340 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005341 .Case("cyclone", true)
5342 .Default(false);
5343 return CPUKnown;
5344 }
5345
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005346 void getTargetDefines(const LangOptions &Opts,
5347 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005348 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005349 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005350
5351 // Target properties.
5352 Builder.defineMacro("_LP64");
5353 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005354
5355 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5356 Builder.defineMacro("__ARM_ACLE", "200");
5357 Builder.defineMacro("__ARM_ARCH", "8");
5358 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5359
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005360 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005361 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005362 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005363
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005364 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5365 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5366 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5367 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005368 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005369 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5370 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005371
5372 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5373
5374 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005375 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005376
5377 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5378 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005379 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5380 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005381
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005382 if (Opts.UnsafeFPMath)
5383 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005384
5385 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5386
5387 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5388 Opts.ShortEnums ? "1" : "4");
5389
James Molloy75f5f9e2014-04-16 15:33:48 +00005390 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005391 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005392 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005393 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005394 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005395
Bradley Smith418c5932014-05-02 15:17:51 +00005396 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005397 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005398
James Molloy75f5f9e2014-04-16 15:33:48 +00005399 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005400 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5401
5402 if (Unaligned)
5403 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005404
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005405 if (V8_1A)
5406 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5407
Reid Klecknerd167d422015-05-06 15:31:46 +00005408 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5409 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5410 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5411 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5412 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005413 }
5414
Craig Topper6c03a542015-10-19 04:51:35 +00005415 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5416 return llvm::makeArrayRef(BuiltinInfo,
5417 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005418 }
5419
David Blaikie1cbb9712014-11-14 19:09:44 +00005420 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005421 return Feature == "aarch64" ||
5422 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005423 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005424 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005425 }
5426
James Molloy5e73df52014-04-16 15:06:20 +00005427 bool handleTargetFeatures(std::vector<std::string> &Features,
5428 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005429 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005430 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005431 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005432 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005433 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005434
Eric Christopher610fe112015-08-26 08:21:55 +00005435 for (const auto &Feature : Features) {
5436 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005437 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005438 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005439 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005440 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005441 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005442 if (Feature == "+strict-align")
5443 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005444 if (Feature == "+v8.1a")
5445 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005446 }
5447
Eric Christopher964a5f32015-08-05 23:48:05 +00005448 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005449
5450 return true;
5451 }
5452
David Blaikie1cbb9712014-11-14 19:09:44 +00005453 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005454
David Blaikie1cbb9712014-11-14 19:09:44 +00005455 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005456 return TargetInfo::AArch64ABIBuiltinVaList;
5457 }
5458
Craig Topperf054e3a2015-10-19 03:52:27 +00005459 ArrayRef<const char *> getGCCRegNames() const override;
5460 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005461
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005462 bool validateAsmConstraint(const char *&Name,
5463 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005464 switch (*Name) {
5465 default:
5466 return false;
5467 case 'w': // Floating point and SIMD registers (V0-V31)
5468 Info.setAllowsRegister();
5469 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005470 case 'I': // Constant that can be used with an ADD instruction
5471 case 'J': // Constant that can be used with a SUB instruction
5472 case 'K': // Constant that can be used with a 32-bit logical instruction
5473 case 'L': // Constant that can be used with a 64-bit logical instruction
5474 case 'M': // Constant that can be used as a 32-bit MOV immediate
5475 case 'N': // Constant that can be used as a 64-bit MOV immediate
5476 case 'Y': // Floating point constant zero
5477 case 'Z': // Integer constant zero
5478 return true;
5479 case 'Q': // A memory reference with base register and no offset
5480 Info.setAllowsMemory();
5481 return true;
5482 case 'S': // A symbolic address
5483 Info.setAllowsRegister();
5484 return true;
5485 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005486 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5487 // Utf: A memory address suitable for ldp/stp in TF mode.
5488 // Usa: An absolute symbolic address.
5489 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5490 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005491 case 'z': // Zero register, wzr or xzr
5492 Info.setAllowsRegister();
5493 return true;
5494 case 'x': // Floating point and SIMD registers (V0-V15)
5495 Info.setAllowsRegister();
5496 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005497 }
5498 return false;
5499 }
5500
Akira Hatanaka987f1862014-08-22 06:05:21 +00005501 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005502 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005503 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005504 // Strip off constraint modifiers.
5505 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5506 Constraint = Constraint.substr(1);
5507
5508 switch (Constraint[0]) {
5509 default:
5510 return true;
5511 case 'z':
5512 case 'r': {
5513 switch (Modifier) {
5514 case 'x':
5515 case 'w':
5516 // For now assume that the person knows what they're
5517 // doing with the modifier.
5518 return true;
5519 default:
5520 // By default an 'r' constraint will be in the 'x'
5521 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005522 if (Size == 64)
5523 return true;
5524
5525 SuggestedModifier = "w";
5526 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005527 }
5528 }
5529 }
5530 }
5531
David Blaikie1cbb9712014-11-14 19:09:44 +00005532 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005533
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005534 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005535 if (RegNo == 0)
5536 return 0;
5537 if (RegNo == 1)
5538 return 1;
5539 return -1;
5540 }
5541};
5542
Tim Northover573cbee2014-05-24 12:52:07 +00005543const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005544 // 32-bit Integer registers
5545 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5546 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5547 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5548
5549 // 64-bit Integer registers
5550 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5551 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5552 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5553
5554 // 32-bit floating point regsisters
5555 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5556 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5557 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5558
5559 // 64-bit floating point regsisters
5560 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5561 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5562 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5563
5564 // Vector registers
5565 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5566 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5567 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5568};
5569
Craig Topperf054e3a2015-10-19 03:52:27 +00005570ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5571 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005572}
5573
Tim Northover573cbee2014-05-24 12:52:07 +00005574const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005575 { { "w31" }, "wsp" },
5576 { { "x29" }, "fp" },
5577 { { "x30" }, "lr" },
5578 { { "x31" }, "sp" },
5579 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5580 // don't want to substitute one of these for a different-sized one.
5581};
5582
Craig Topperf054e3a2015-10-19 03:52:27 +00005583ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5584 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005585}
5586
Tim Northover573cbee2014-05-24 12:52:07 +00005587const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005588#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005589 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005590#include "clang/Basic/BuiltinsNEON.def"
5591
5592#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005593 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005594#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005595};
James Molloy5e73df52014-04-16 15:06:20 +00005596
Tim Northover573cbee2014-05-24 12:52:07 +00005597class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005598 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005599 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005600 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005601 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005602 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005603 }
5604
5605public:
Tim Northover573cbee2014-05-24 12:52:07 +00005606 AArch64leTargetInfo(const llvm::Triple &Triple)
5607 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005608 BigEndian = false;
5609 }
5610 void getTargetDefines(const LangOptions &Opts,
5611 MacroBuilder &Builder) const override {
5612 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005613 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005614 }
5615};
5616
Tim Northover573cbee2014-05-24 12:52:07 +00005617class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005618 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005619 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005620 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005621 }
5622
5623public:
Tim Northover573cbee2014-05-24 12:52:07 +00005624 AArch64beTargetInfo(const llvm::Triple &Triple)
5625 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005626 void getTargetDefines(const LangOptions &Opts,
5627 MacroBuilder &Builder) const override {
5628 Builder.defineMacro("__AARCH64EB__");
5629 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5630 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005631 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005632 }
5633};
Tim Northovera2ee4332014-03-29 15:09:45 +00005634
Tim Northover573cbee2014-05-24 12:52:07 +00005635class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005636protected:
5637 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5638 MacroBuilder &Builder) const override {
5639 Builder.defineMacro("__AARCH64_SIMD__");
5640 Builder.defineMacro("__ARM64_ARCH_8__");
5641 Builder.defineMacro("__ARM_NEON__");
5642 Builder.defineMacro("__LITTLE_ENDIAN__");
5643 Builder.defineMacro("__REGISTER_PREFIX__", "");
5644 Builder.defineMacro("__arm64", "1");
5645 Builder.defineMacro("__arm64__", "1");
5646
5647 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5648 }
5649
Tim Northovera2ee4332014-03-29 15:09:45 +00005650public:
Tim Northover573cbee2014-05-24 12:52:07 +00005651 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5652 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005653 Int64Type = SignedLongLong;
5654 WCharType = SignedInt;
5655 UseSignedCharForObjCBool = false;
5656
Tim Northovera6a19f12015-02-06 01:25:07 +00005657 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005658 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5659
5660 TheCXXABI.set(TargetCXXABI::iOS64);
5661 }
5662
David Blaikie1cbb9712014-11-14 19:09:44 +00005663 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005664 return TargetInfo::CharPtrBuiltinVaList;
5665 }
5666};
Tim Northovera2ee4332014-03-29 15:09:45 +00005667
Tony Linthicum76329bf2011-12-12 21:14:55 +00005668// Hexagon abstract base class
5669class HexagonTargetInfo : public TargetInfo {
5670 static const Builtin::Info BuiltinInfo[];
5671 static const char * const GCCRegNames[];
5672 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5673 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005674 bool HasHVX, HasHVXDouble;
5675
Tony Linthicum76329bf2011-12-12 21:14:55 +00005676public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005677 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005678 BigEndian = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005679 DataLayoutString = "e-m:e-p:32:32:32-"
5680 "i64:64:64-i32:32:32-i16:16:16-i1:8:8-"
5681 "f64:64:64-f32:32:32-v64:64:64-v32:32:32-a:0-n16:32";
5682 SizeType = UnsignedInt;
5683 PtrDiffType = SignedInt;
5684 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005685
5686 // {} in inline assembly are packet specifiers, not assembly variant
5687 // specifiers.
5688 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005689
5690 LargeArrayMinWidth = 64;
5691 LargeArrayAlign = 64;
5692 UseBitFieldTypeAlignment = true;
5693 ZeroLengthBitfieldBoundary = 32;
5694 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005695 }
5696
Craig Topper6c03a542015-10-19 04:51:35 +00005697 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5698 return llvm::makeArrayRef(BuiltinInfo,
5699 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005700 }
5701
Craig Topper3164f332014-03-11 03:39:26 +00005702 bool validateAsmConstraint(const char *&Name,
5703 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005704 return true;
5705 }
5706
Craig Topper3164f332014-03-11 03:39:26 +00005707 void getTargetDefines(const LangOptions &Opts,
5708 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005709
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005710 bool isCLZForZeroUndef() const override { return false; }
5711
Craig Topper3164f332014-03-11 03:39:26 +00005712 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005713 return llvm::StringSwitch<bool>(Feature)
5714 .Case("hexagon", true)
5715 .Case("hvx", HasHVX)
5716 .Case("hvx-double", HasHVXDouble)
5717 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005718 }
Craig Topper3164f332014-03-11 03:39:26 +00005719
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005720 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5721 StringRef CPU, const std::vector<std::string> &FeaturesVec)
5722 const override;
5723
5724 bool handleTargetFeatures(std::vector<std::string> &Features,
5725 DiagnosticsEngine &Diags) override;
5726
Craig Topper3164f332014-03-11 03:39:26 +00005727 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005728 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005729 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005730 ArrayRef<const char *> getGCCRegNames() const override;
5731 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005732 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005733 return "";
5734 }
Sebastian Pop86500282012-01-13 20:37:10 +00005735
5736 static const char *getHexagonCPUSuffix(StringRef Name) {
5737 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005738 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005739 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005740 .Case("hexagonv55", "55")
5741 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00005742 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005743 }
5744
Craig Topper3164f332014-03-11 03:39:26 +00005745 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005746 if (!getHexagonCPUSuffix(Name))
5747 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005748 CPU = Name;
5749 return true;
5750 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005751
5752 int getEHDataRegisterNumber(unsigned RegNo) const override {
5753 return RegNo < 2 ? RegNo : -1;
5754 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005755};
5756
5757void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005758 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005759 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005760 Builder.defineMacro("__hexagon__", "1");
5761
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005762 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005763 Builder.defineMacro("__HEXAGON_V4__");
5764 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005765 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005766 Builder.defineMacro("__QDSP6_V4__");
5767 Builder.defineMacro("__QDSP6_ARCH__", "4");
5768 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005769 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005770 Builder.defineMacro("__HEXAGON_V5__");
5771 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5772 if(Opts.HexagonQdsp6Compat) {
5773 Builder.defineMacro("__QDSP6_V5__");
5774 Builder.defineMacro("__QDSP6_ARCH__", "5");
5775 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005776 } else if (CPU == "hexagonv60") {
5777 Builder.defineMacro("__HEXAGON_V60__");
5778 Builder.defineMacro("__HEXAGON_ARCH__", "60");
5779 Builder.defineMacro("__QDSP6_V60__");
5780 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005781 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005782}
5783
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005784bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
5785 DiagnosticsEngine &Diags) {
5786 for (auto &F : Features) {
5787 if (F == "+hvx")
5788 HasHVX = true;
5789 else if (F == "-hvx")
5790 HasHVX = HasHVXDouble = false;
5791 else if (F == "+hvx-double")
5792 HasHVX = HasHVXDouble = true;
5793 else if (F == "-hvx-double")
5794 HasHVXDouble = false;
5795 }
5796 return true;
5797}
5798
5799bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
5800 DiagnosticsEngine &Diags, StringRef CPU,
5801 const std::vector<std::string> &FeaturesVec) const {
5802 // Default for v60: -hvx, -hvx-double.
5803 Features["hvx"] = false;
5804 Features["hvx-double"] = false;
5805
5806 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
5807}
5808
5809
5810const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005811 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5812 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5813 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5814 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5815 "p0", "p1", "p2", "p3",
5816 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5817};
5818
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005819ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00005820 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005821}
5822
Tony Linthicum76329bf2011-12-12 21:14:55 +00005823const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5824 { { "sp" }, "r29" },
5825 { { "fp" }, "r30" },
5826 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005827};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005828
Craig Topperf054e3a2015-10-19 03:52:27 +00005829ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
5830 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005831}
5832
5833
5834const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005835#define BUILTIN(ID, TYPE, ATTRS) \
5836 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5837#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5838 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005839#include "clang/Basic/BuiltinsHexagon.def"
5840};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005841
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005842// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5843class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005844 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5845 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005846 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005847public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005848 SparcTargetInfo(const llvm::Triple &Triple)
James Y Knighta3518ad2016-01-27 01:04:51 +00005849 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005850
Craig Topper3164f332014-03-11 03:39:26 +00005851 bool handleTargetFeatures(std::vector<std::string> &Features,
5852 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005853 // The backend doesn't actually handle soft float yet, but in case someone
5854 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005855 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5856 if (Feature != Features.end()) {
5857 SoftFloat = true;
5858 Features.erase(Feature);
5859 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005860 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005861 }
Craig Topper3164f332014-03-11 03:39:26 +00005862 void getTargetDefines(const LangOptions &Opts,
5863 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005864 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005865 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005866
5867 if (SoftFloat)
5868 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005869 }
Craig Topper3164f332014-03-11 03:39:26 +00005870
5871 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005872 return llvm::StringSwitch<bool>(Feature)
5873 .Case("softfloat", SoftFloat)
5874 .Case("sparc", true)
5875 .Default(false);
5876 }
Craig Topper3164f332014-03-11 03:39:26 +00005877
Craig Topper6c03a542015-10-19 04:51:35 +00005878 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005879 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00005880 return None;
Gabor Greif49991682008-02-21 16:29:08 +00005881 }
Craig Topper3164f332014-03-11 03:39:26 +00005882 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005883 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005884 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005885 ArrayRef<const char *> getGCCRegNames() const override;
5886 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005887 bool validateAsmConstraint(const char *&Name,
5888 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005889 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005890 switch (*Name) {
5891 case 'I': // Signed 13-bit constant
5892 case 'J': // Zero
5893 case 'K': // 32-bit constant with the low 12 bits clear
5894 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5895 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5896 case 'N': // Same as 'K' but zext (required for SIMode)
5897 case 'O': // The constant 4096
5898 return true;
5899 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005900 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005901 }
Craig Topper3164f332014-03-11 03:39:26 +00005902 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005903 // FIXME: Implement!
5904 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005905 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00005906
5907 // No Sparc V7 for now, the backend doesn't support it anyway.
5908 enum CPUKind {
5909 CK_GENERIC,
5910 CK_V8,
5911 CK_SUPERSPARC,
5912 CK_SPARCLITE,
5913 CK_F934,
5914 CK_HYPERSPARC,
5915 CK_SPARCLITE86X,
5916 CK_SPARCLET,
5917 CK_TSC701,
5918 CK_V9,
5919 CK_ULTRASPARC,
5920 CK_ULTRASPARC3,
5921 CK_NIAGARA,
5922 CK_NIAGARA2,
5923 CK_NIAGARA3,
5924 CK_NIAGARA4
5925 } CPU = CK_GENERIC;
5926
5927 enum CPUGeneration {
5928 CG_V8,
5929 CG_V9,
5930 };
5931
5932 CPUGeneration getCPUGeneration(CPUKind Kind) const {
5933 switch (Kind) {
5934 case CK_GENERIC:
5935 case CK_V8:
5936 case CK_SUPERSPARC:
5937 case CK_SPARCLITE:
5938 case CK_F934:
5939 case CK_HYPERSPARC:
5940 case CK_SPARCLITE86X:
5941 case CK_SPARCLET:
5942 case CK_TSC701:
5943 return CG_V8;
5944 case CK_V9:
5945 case CK_ULTRASPARC:
5946 case CK_ULTRASPARC3:
5947 case CK_NIAGARA:
5948 case CK_NIAGARA2:
5949 case CK_NIAGARA3:
5950 case CK_NIAGARA4:
5951 return CG_V9;
5952 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00005953 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00005954 }
5955
5956 CPUKind getCPUKind(StringRef Name) const {
5957 return llvm::StringSwitch<CPUKind>(Name)
5958 .Case("v8", CK_V8)
5959 .Case("supersparc", CK_SUPERSPARC)
5960 .Case("sparclite", CK_SPARCLITE)
5961 .Case("f934", CK_F934)
5962 .Case("hypersparc", CK_HYPERSPARC)
5963 .Case("sparclite86x", CK_SPARCLITE86X)
5964 .Case("sparclet", CK_SPARCLET)
5965 .Case("tsc701", CK_TSC701)
5966 .Case("v9", CK_V9)
5967 .Case("ultrasparc", CK_ULTRASPARC)
5968 .Case("ultrasparc3", CK_ULTRASPARC3)
5969 .Case("niagara", CK_NIAGARA)
5970 .Case("niagara2", CK_NIAGARA2)
5971 .Case("niagara3", CK_NIAGARA3)
5972 .Case("niagara4", CK_NIAGARA4)
5973 .Default(CK_GENERIC);
5974 }
5975
5976 bool setCPU(const std::string &Name) override {
5977 CPU = getCPUKind(Name);
5978 return CPU != CK_GENERIC;
5979 }
Gabor Greif49991682008-02-21 16:29:08 +00005980};
5981
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005982const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005983 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5984 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5985 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5986 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5987};
5988
Craig Topperf054e3a2015-10-19 03:52:27 +00005989ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
5990 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00005991}
5992
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005993const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005994 { { "g0" }, "r0" },
5995 { { "g1" }, "r1" },
5996 { { "g2" }, "r2" },
5997 { { "g3" }, "r3" },
5998 { { "g4" }, "r4" },
5999 { { "g5" }, "r5" },
6000 { { "g6" }, "r6" },
6001 { { "g7" }, "r7" },
6002 { { "o0" }, "r8" },
6003 { { "o1" }, "r9" },
6004 { { "o2" }, "r10" },
6005 { { "o3" }, "r11" },
6006 { { "o4" }, "r12" },
6007 { { "o5" }, "r13" },
6008 { { "o6", "sp" }, "r14" },
6009 { { "o7" }, "r15" },
6010 { { "l0" }, "r16" },
6011 { { "l1" }, "r17" },
6012 { { "l2" }, "r18" },
6013 { { "l3" }, "r19" },
6014 { { "l4" }, "r20" },
6015 { { "l5" }, "r21" },
6016 { { "l6" }, "r22" },
6017 { { "l7" }, "r23" },
6018 { { "i0" }, "r24" },
6019 { { "i1" }, "r25" },
6020 { { "i2" }, "r26" },
6021 { { "i3" }, "r27" },
6022 { { "i4" }, "r28" },
6023 { { "i5" }, "r29" },
6024 { { "i6", "fp" }, "r30" },
6025 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006026};
6027
Craig Topperf054e3a2015-10-19 03:52:27 +00006028ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6029 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006030}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006031
6032// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6033class SparcV8TargetInfo : public SparcTargetInfo {
6034public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006035 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00006036 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00006037 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6038 switch (getTriple().getOS()) {
6039 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006040 SizeType = UnsignedInt;
6041 IntPtrType = SignedInt;
6042 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006043 break;
6044 case llvm::Triple::NetBSD:
6045 case llvm::Triple::OpenBSD:
6046 SizeType = UnsignedLong;
6047 IntPtrType = SignedLong;
6048 PtrDiffType = SignedLong;
6049 break;
Brad Smith56495d52015-08-13 22:00:53 +00006050 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006051 }
6052
Craig Topper3164f332014-03-11 03:39:26 +00006053 void getTargetDefines(const LangOptions &Opts,
6054 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006055 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006056 switch (getCPUGeneration(CPU)) {
6057 case CG_V8:
6058 Builder.defineMacro("__sparcv8");
6059 if (getTriple().getOS() != llvm::Triple::Solaris)
6060 Builder.defineMacro("__sparcv8__");
6061 break;
6062 case CG_V9:
6063 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006064 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006065 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006066 Builder.defineMacro("__sparc_v9__");
6067 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006068 break;
6069 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006070 }
6071};
6072
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006073// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6074class SparcV8elTargetInfo : public SparcV8TargetInfo {
6075 public:
6076 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00006077 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006078 BigEndian = false;
6079 }
6080};
6081
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006082// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6083class SparcV9TargetInfo : public SparcTargetInfo {
6084public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006085 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006086 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00006087 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006088 // This is an LP64 platform.
6089 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006090
6091 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006092 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006093 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006094 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006095 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006096 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006097
6098 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6099 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6100 LongDoubleWidth = 128;
6101 LongDoubleAlign = 128;
6102 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006103 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006104 }
6105
Craig Topper3164f332014-03-11 03:39:26 +00006106 void getTargetDefines(const LangOptions &Opts,
6107 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006108 SparcTargetInfo::getTargetDefines(Opts, Builder);
6109 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006110 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006111 // Solaris doesn't need these variants, but the BSDs do.
6112 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006113 Builder.defineMacro("__sparc64__");
6114 Builder.defineMacro("__sparc_v9__");
6115 Builder.defineMacro("__sparcv9__");
6116 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006117 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006118
Craig Topper3164f332014-03-11 03:39:26 +00006119 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006120 if (!SparcTargetInfo::setCPU(Name))
6121 return false;
6122 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006123 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006124};
6125
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006126class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006127 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006128 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006129 std::string CPU;
6130 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006131 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006132
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006133public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006134 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00006135 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6136 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006137 IntMaxType = SignedLong;
6138 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006139 TLSSupported = true;
6140 IntWidth = IntAlign = 32;
6141 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6142 PointerWidth = PointerAlign = 64;
6143 LongDoubleWidth = 128;
6144 LongDoubleAlign = 64;
6145 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006146 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006147 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00006148 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 +00006149 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6150 }
6151 void getTargetDefines(const LangOptions &Opts,
6152 MacroBuilder &Builder) const override {
6153 Builder.defineMacro("__s390__");
6154 Builder.defineMacro("__s390x__");
6155 Builder.defineMacro("__zarch__");
6156 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006157 if (HasTransactionalExecution)
6158 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006159 if (Opts.ZVector)
6160 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006161 }
Craig Topper6c03a542015-10-19 04:51:35 +00006162 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6163 return llvm::makeArrayRef(BuiltinInfo,
6164 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006165 }
6166
Craig Topperf054e3a2015-10-19 03:52:27 +00006167 ArrayRef<const char *> getGCCRegNames() const override;
6168 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006169 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006170 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006171 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006172 bool validateAsmConstraint(const char *&Name,
6173 TargetInfo::ConstraintInfo &info) const override;
6174 const char *getClobbers() const override {
6175 // FIXME: Is this really right?
6176 return "";
6177 }
6178 BuiltinVaListKind getBuiltinVaListKind() const override {
6179 return TargetInfo::SystemZBuiltinVaList;
6180 }
6181 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006182 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006183 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6184 .Case("z10", true)
6185 .Case("z196", true)
6186 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006187 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006188 .Default(false);
6189
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006190 return CPUKnown;
6191 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006192 bool
6193 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6194 StringRef CPU,
6195 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006196 if (CPU == "zEC12")
6197 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006198 if (CPU == "z13") {
6199 Features["transactional-execution"] = true;
6200 Features["vector"] = true;
6201 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006202 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006203 }
6204
6205 bool handleTargetFeatures(std::vector<std::string> &Features,
6206 DiagnosticsEngine &Diags) override {
6207 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006208 for (const auto &Feature : Features) {
6209 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006210 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006211 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006212 HasVector = true;
6213 }
6214 // If we use the vector ABI, vector types are 64-bit aligned.
6215 if (HasVector) {
6216 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006217 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6218 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006219 }
6220 return true;
6221 }
6222
6223 bool hasFeature(StringRef Feature) const override {
6224 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006225 .Case("systemz", true)
6226 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006227 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006228 .Default(false);
6229 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006230
6231 StringRef getABI() const override {
6232 if (HasVector)
6233 return "vector";
6234 return "";
6235 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006236
6237 bool useFloat128ManglingForLongDouble() const override {
6238 return true;
6239 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006240};
6241
6242const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6243#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006244 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006245#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006246};
6247
6248const char *const SystemZTargetInfo::GCCRegNames[] = {
6249 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6250 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6251 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6252 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6253};
6254
Craig Topperf054e3a2015-10-19 03:52:27 +00006255ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6256 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006257}
6258
6259bool SystemZTargetInfo::
6260validateAsmConstraint(const char *&Name,
6261 TargetInfo::ConstraintInfo &Info) const {
6262 switch (*Name) {
6263 default:
6264 return false;
6265
6266 case 'a': // Address register
6267 case 'd': // Data register (equivalent to 'r')
6268 case 'f': // Floating-point register
6269 Info.setAllowsRegister();
6270 return true;
6271
6272 case 'I': // Unsigned 8-bit constant
6273 case 'J': // Unsigned 12-bit constant
6274 case 'K': // Signed 16-bit constant
6275 case 'L': // Signed 20-bit displacement (on all targets we support)
6276 case 'M': // 0x7fffffff
6277 return true;
6278
6279 case 'Q': // Memory with base and unsigned 12-bit displacement
6280 case 'R': // Likewise, plus an index
6281 case 'S': // Memory with base and signed 20-bit displacement
6282 case 'T': // Likewise, plus an index
6283 Info.setAllowsMemory();
6284 return true;
6285 }
6286}
Ulrich Weigand47445072013-05-06 16:26:41 +00006287
Eric Christopherc48497a2015-09-18 21:26:24 +00006288class MSP430TargetInfo : public TargetInfo {
6289 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006290
Eric Christopherc48497a2015-09-18 21:26:24 +00006291public:
6292 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6293 BigEndian = false;
6294 TLSSupported = false;
6295 IntWidth = 16;
6296 IntAlign = 16;
6297 LongWidth = 32;
6298 LongLongWidth = 64;
6299 LongAlign = LongLongAlign = 16;
6300 PointerWidth = 16;
6301 PointerAlign = 16;
6302 SuitableAlign = 16;
6303 SizeType = UnsignedInt;
6304 IntMaxType = SignedLongLong;
6305 IntPtrType = SignedInt;
6306 PtrDiffType = SignedInt;
6307 SigAtomicType = SignedLong;
6308 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006309 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006310 void getTargetDefines(const LangOptions &Opts,
6311 MacroBuilder &Builder) const override {
6312 Builder.defineMacro("MSP430");
6313 Builder.defineMacro("__MSP430__");
6314 // FIXME: defines for different 'flavours' of MCU
6315 }
Craig Topper6c03a542015-10-19 04:51:35 +00006316 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006317 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006318 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006319 }
6320 bool hasFeature(StringRef Feature) const override {
6321 return Feature == "msp430";
6322 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006323 ArrayRef<const char *> getGCCRegNames() const override;
6324 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006325 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006326 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006327 }
6328 bool validateAsmConstraint(const char *&Name,
6329 TargetInfo::ConstraintInfo &info) const override {
6330 // FIXME: implement
6331 switch (*Name) {
6332 case 'K': // the constant 1
6333 case 'L': // constant -1^20 .. 1^19
6334 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006335 return true;
6336 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006337 // No target constraints for now.
6338 return false;
6339 }
6340 const char *getClobbers() const override {
6341 // FIXME: Is this really right?
6342 return "";
6343 }
6344 BuiltinVaListKind getBuiltinVaListKind() const override {
6345 // FIXME: implement
6346 return TargetInfo::CharPtrBuiltinVaList;
6347 }
6348};
6349
6350const char *const MSP430TargetInfo::GCCRegNames[] = {
6351 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6352 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6353
Craig Topperf054e3a2015-10-19 03:52:27 +00006354ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6355 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006356}
6357
6358// LLVM and Clang cannot be used directly to output native binaries for
6359// target, but is used to compile C code to llvm bitcode with correct
6360// type and alignment information.
6361//
6362// TCE uses the llvm bitcode as input and uses it for generating customized
6363// target processor and program binary. TCE co-design environment is
6364// publicly available in http://tce.cs.tut.fi
6365
6366static const unsigned TCEOpenCLAddrSpaceMap[] = {
6367 3, // opencl_global
6368 4, // opencl_local
6369 5, // opencl_constant
6370 // FIXME: generic has to be added to the target
6371 0, // opencl_generic
6372 0, // cuda_device
6373 0, // cuda_constant
6374 0 // cuda_shared
6375};
6376
6377class TCETargetInfo : public TargetInfo {
6378public:
6379 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6380 TLSSupported = false;
6381 IntWidth = 32;
6382 LongWidth = LongLongWidth = 32;
6383 PointerWidth = 32;
6384 IntAlign = 32;
6385 LongAlign = LongLongAlign = 32;
6386 PointerAlign = 32;
6387 SuitableAlign = 32;
6388 SizeType = UnsignedInt;
6389 IntMaxType = SignedLong;
6390 IntPtrType = SignedInt;
6391 PtrDiffType = SignedInt;
6392 FloatWidth = 32;
6393 FloatAlign = 32;
6394 DoubleWidth = 32;
6395 DoubleAlign = 32;
6396 LongDoubleWidth = 32;
6397 LongDoubleAlign = 32;
6398 FloatFormat = &llvm::APFloat::IEEEsingle;
6399 DoubleFormat = &llvm::APFloat::IEEEsingle;
6400 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6401 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6402 "-f64:32-v64:32-v128:32-a:0:32-n32";
6403 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6404 UseAddrSpaceMapMangling = true;
6405 }
6406
6407 void getTargetDefines(const LangOptions &Opts,
6408 MacroBuilder &Builder) const override {
6409 DefineStd(Builder, "tce", Opts);
6410 Builder.defineMacro("__TCE__");
6411 Builder.defineMacro("__TCE_V1__");
6412 }
6413 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6414
Craig Topper6c03a542015-10-19 04:51:35 +00006415 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006416 const char *getClobbers() const override { return ""; }
6417 BuiltinVaListKind getBuiltinVaListKind() const override {
6418 return TargetInfo::VoidPtrBuiltinVaList;
6419 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006420 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006421 bool validateAsmConstraint(const char *&Name,
6422 TargetInfo::ConstraintInfo &info) const override {
6423 return true;
6424 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006425 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6426 return None;
6427 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006428};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006429
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006430class BPFTargetInfo : public TargetInfo {
6431public:
6432 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6433 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6434 SizeType = UnsignedLong;
6435 PtrDiffType = SignedLong;
6436 IntPtrType = SignedLong;
6437 IntMaxType = SignedLong;
6438 Int64Type = SignedLong;
6439 RegParmMax = 5;
6440 if (Triple.getArch() == llvm::Triple::bpfeb) {
6441 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006442 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006443 } else {
6444 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006445 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006446 }
6447 MaxAtomicPromoteWidth = 64;
6448 MaxAtomicInlineWidth = 64;
6449 TLSSupported = false;
6450 }
6451 void getTargetDefines(const LangOptions &Opts,
6452 MacroBuilder &Builder) const override {
6453 DefineStd(Builder, "bpf", Opts);
6454 Builder.defineMacro("__BPF__");
6455 }
6456 bool hasFeature(StringRef Feature) const override {
6457 return Feature == "bpf";
6458 }
6459
Craig Topper6c03a542015-10-19 04:51:35 +00006460 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006461 const char *getClobbers() const override {
6462 return "";
6463 }
6464 BuiltinVaListKind getBuiltinVaListKind() const override {
6465 return TargetInfo::VoidPtrBuiltinVaList;
6466 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006467 ArrayRef<const char *> getGCCRegNames() const override {
6468 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006469 }
6470 bool validateAsmConstraint(const char *&Name,
6471 TargetInfo::ConstraintInfo &info) const override {
6472 return true;
6473 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006474 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6475 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006476 }
6477};
6478
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006479class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006480 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006481
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006482 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006483 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006484 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006485 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006486 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006487 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006488 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006489 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006490 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006491 enum DspRevEnum {
6492 NoDSP, DSP1, DSP2
6493 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006494 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006495
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006496protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006497 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006498 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006499
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006500public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006501 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6502 const std::string &CPUStr)
6503 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006504 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006505 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6506 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6507 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006508
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006509 bool isNaN2008Default() const {
6510 return CPU == "mips32r6" || CPU == "mips64r6";
6511 }
6512
6513 bool isFP64Default() const {
6514 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6515 }
6516
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006517 bool isNan2008() const override {
6518 return IsNan2008;
6519 }
6520
Alp Toker4925ba72014-06-07 23:30:42 +00006521 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006522 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006523 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6524 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006525 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006526 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006527 .Case("mips1", IsMips32)
6528 .Case("mips2", IsMips32)
6529 .Case("mips3", true)
6530 .Case("mips4", true)
6531 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006532 .Case("mips32", IsMips32)
6533 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006534 .Case("mips32r3", IsMips32)
6535 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006536 .Case("mips32r6", IsMips32)
6537 .Case("mips64", true)
6538 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006539 .Case("mips64r3", true)
6540 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006541 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006542 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006543 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006544 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006545 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006546 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006547 bool
6548 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6549 StringRef CPU,
6550 const std::vector<std::string> &FeaturesVec) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006551 if (CPU == "octeon")
6552 Features["mips64r2"] = Features["cnmips"] = true;
6553 else
6554 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006555 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006556 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006557
Craig Topper3164f332014-03-11 03:39:26 +00006558 void getTargetDefines(const LangOptions &Opts,
6559 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006560 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006561 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006562 if (Opts.GNUMode)
6563 Builder.defineMacro("mips");
6564
Simon Atanasyan683535b2012-08-29 19:14:58 +00006565 Builder.defineMacro("__REGISTER_PREFIX__", "");
6566
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006567 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006568 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006569 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006570 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006571 case SoftFloat:
6572 Builder.defineMacro("__mips_soft_float", Twine(1));
6573 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006574 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006575
Simon Atanasyan16071912013-04-14 14:07:30 +00006576 if (IsSingleFloat)
6577 Builder.defineMacro("__mips_single_float", Twine(1));
6578
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006579 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6580 Builder.defineMacro("_MIPS_FPSET",
6581 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6582
Simon Atanasyan72244b62012-07-05 16:06:06 +00006583 if (IsMips16)
6584 Builder.defineMacro("__mips16", Twine(1));
6585
Simon Atanasyan60777612013-04-14 14:07:51 +00006586 if (IsMicromips)
6587 Builder.defineMacro("__mips_micromips", Twine(1));
6588
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006589 if (IsNan2008)
6590 Builder.defineMacro("__mips_nan2008", Twine(1));
6591
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006592 switch (DspRev) {
6593 default:
6594 break;
6595 case DSP1:
6596 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6597 Builder.defineMacro("__mips_dsp", Twine(1));
6598 break;
6599 case DSP2:
6600 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6601 Builder.defineMacro("__mips_dspr2", Twine(1));
6602 Builder.defineMacro("__mips_dsp", Twine(1));
6603 break;
6604 }
6605
Jack Carter44ff1e52013-08-12 17:20:29 +00006606 if (HasMSA)
6607 Builder.defineMacro("__mips_msa", Twine(1));
6608
Simon Atanasyan26f19672012-04-05 19:28:31 +00006609 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6610 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6611 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006612
6613 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6614 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00006615
6616 // These shouldn't be defined for MIPS-I but there's no need to check
6617 // for that since MIPS-I isn't supported.
6618 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6619 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6620 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006621 }
6622
Craig Topper6c03a542015-10-19 04:51:35 +00006623 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6624 return llvm::makeArrayRef(BuiltinInfo,
6625 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006626 }
Craig Topper3164f332014-03-11 03:39:26 +00006627 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006628 return llvm::StringSwitch<bool>(Feature)
6629 .Case("mips", true)
6630 .Case("fp64", HasFP64)
6631 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006632 }
Craig Topper3164f332014-03-11 03:39:26 +00006633 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006634 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006635 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006636 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006637 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006638 // CPU register names
6639 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006640 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6641 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6642 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006643 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6644 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006645 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6646 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6647 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6648 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006649 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006650 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006651 "$fcc5","$fcc6","$fcc7",
6652 // MSA register names
6653 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6654 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6655 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6656 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6657 // MSA control register names
6658 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6659 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006660 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006661 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006662 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006663 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006664 bool validateAsmConstraint(const char *&Name,
6665 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006666 switch (*Name) {
6667 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006668 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006669 case 'r': // CPU registers.
6670 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006671 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006672 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006673 case 'c': // $25 for indirect jumps
6674 case 'l': // lo register
6675 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006676 Info.setAllowsRegister();
6677 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006678 case 'I': // Signed 16-bit constant
6679 case 'J': // Integer 0
6680 case 'K': // Unsigned 16-bit constant
6681 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6682 case 'M': // Constants not loadable via lui, addiu, or ori
6683 case 'N': // Constant -1 to -65535
6684 case 'O': // A signed 15-bit constant
6685 case 'P': // A constant between 1 go 65535
6686 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006687 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006688 Info.setAllowsMemory();
6689 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006690 case 'Z':
6691 if (Name[1] == 'C') { // An address usable by ll, and sc.
6692 Info.setAllowsMemory();
6693 Name++; // Skip over 'Z'.
6694 return true;
6695 }
6696 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006697 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006698 }
6699
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006700 std::string convertConstraint(const char *&Constraint) const override {
6701 std::string R;
6702 switch (*Constraint) {
6703 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6704 if (Constraint[1] == 'C') {
6705 R = std::string("^") + std::string(Constraint, 2);
6706 Constraint++;
6707 return R;
6708 }
6709 break;
6710 }
6711 return TargetInfo::convertConstraint(Constraint);
6712 }
6713
Craig Topper3164f332014-03-11 03:39:26 +00006714 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006715 // In GCC, $1 is not widely used in generated code (it's used only in a few
6716 // specific situations), so there is no real need for users to add it to
6717 // the clobbers list if they want to use it in their inline assembly code.
6718 //
6719 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6720 // code generation, so using it in inline assembly without adding it to the
6721 // clobbers list can cause conflicts between the inline assembly code and
6722 // the surrounding generated code.
6723 //
6724 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6725 // operands, which will conflict with the ".set at" assembler option (which
6726 // we use only for inline assembly, in order to maintain compatibility with
6727 // GCC) and will also conflict with the user's usage of $1.
6728 //
6729 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6730 // register for generated code is to automatically clobber $1 for all inline
6731 // assembly code.
6732 //
6733 // FIXME: We should automatically clobber $1 only for inline assembly code
6734 // which actually uses it. This would allow LLVM to use $1 for inline
6735 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006736 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006737 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006738
Craig Topper3164f332014-03-11 03:39:26 +00006739 bool handleTargetFeatures(std::vector<std::string> &Features,
6740 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006741 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006742 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006743 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006744 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006745 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006746 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006747 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006748
Eric Christopher610fe112015-08-26 08:21:55 +00006749 for (const auto &Feature : Features) {
6750 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006751 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006752 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006753 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006754 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006755 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006756 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006757 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006758 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006759 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006760 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006761 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006762 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006763 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006764 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006765 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006766 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006767 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006768 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006769 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006770 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006771 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006772 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006773
Eric Christopher964a5f32015-08-05 23:48:05 +00006774 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006775
Rafael Espindolaeb265472013-08-21 21:59:03 +00006776 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006777 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006778
Craig Topper3164f332014-03-11 03:39:26 +00006779 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006780 if (RegNo == 0) return 4;
6781 if (RegNo == 1) return 5;
6782 return -1;
6783 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006784
6785 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006786};
6787
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006788const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006789#define BUILTIN(ID, TYPE, ATTRS) \
6790 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6791#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6792 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006793#include "clang/Basic/BuiltinsMips.def"
6794};
6795
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006796class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006797public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006798 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006799 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006800 SizeType = UnsignedInt;
6801 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006802 Int64Type = SignedLongLong;
6803 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006804 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006805 }
Craig Topper3164f332014-03-11 03:39:26 +00006806 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006807 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006808 ABI = Name;
6809 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006810 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006811 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006812 }
Craig Topper3164f332014-03-11 03:39:26 +00006813 void getTargetDefines(const LangOptions &Opts,
6814 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006815 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006816
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006817 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006818 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6819
6820 const std::string& CPUStr = getCPU();
6821 if (CPUStr == "mips32")
6822 Builder.defineMacro("__mips_isa_rev", "1");
6823 else if (CPUStr == "mips32r2")
6824 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006825 else if (CPUStr == "mips32r3")
6826 Builder.defineMacro("__mips_isa_rev", "3");
6827 else if (CPUStr == "mips32r5")
6828 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006829 else if (CPUStr == "mips32r6")
6830 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006831
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006832 if (ABI == "o32") {
6833 Builder.defineMacro("__mips_o32");
6834 Builder.defineMacro("_ABIO32", "1");
6835 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6836 }
6837 else if (ABI == "eabi")
6838 Builder.defineMacro("__mips_eabi");
6839 else
David Blaikie83d382b2011-09-23 05:06:16 +00006840 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006841 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006842 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006843 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6844 { { "at" }, "$1" },
6845 { { "v0" }, "$2" },
6846 { { "v1" }, "$3" },
6847 { { "a0" }, "$4" },
6848 { { "a1" }, "$5" },
6849 { { "a2" }, "$6" },
6850 { { "a3" }, "$7" },
6851 { { "t0" }, "$8" },
6852 { { "t1" }, "$9" },
6853 { { "t2" }, "$10" },
6854 { { "t3" }, "$11" },
6855 { { "t4" }, "$12" },
6856 { { "t5" }, "$13" },
6857 { { "t6" }, "$14" },
6858 { { "t7" }, "$15" },
6859 { { "s0" }, "$16" },
6860 { { "s1" }, "$17" },
6861 { { "s2" }, "$18" },
6862 { { "s3" }, "$19" },
6863 { { "s4" }, "$20" },
6864 { { "s5" }, "$21" },
6865 { { "s6" }, "$22" },
6866 { { "s7" }, "$23" },
6867 { { "t8" }, "$24" },
6868 { { "t9" }, "$25" },
6869 { { "k0" }, "$26" },
6870 { { "k1" }, "$27" },
6871 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006872 { { "sp","$sp" }, "$29" },
6873 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006874 { { "ra" }, "$31" }
6875 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006876 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006877 }
6878};
6879
6880class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006881 void setDataLayoutString() override {
6882 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006883 }
6884
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006885public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006886 Mips32EBTargetInfo(const llvm::Triple &Triple)
6887 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006888 }
Craig Topper3164f332014-03-11 03:39:26 +00006889 void getTargetDefines(const LangOptions &Opts,
6890 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006891 DefineStd(Builder, "MIPSEB", Opts);
6892 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006893 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006894 }
6895};
6896
6897class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006898 void setDataLayoutString() override {
6899 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006900 }
6901
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006902public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006903 Mips32ELTargetInfo(const llvm::Triple &Triple)
6904 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006905 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006906 }
Craig Topper3164f332014-03-11 03:39:26 +00006907 void getTargetDefines(const LangOptions &Opts,
6908 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006909 DefineStd(Builder, "MIPSEL", Opts);
6910 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006911 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006912 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006913};
Akira Hatanakabef17452011-09-20 19:21:49 +00006914
6915class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006916public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006917 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006918 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006919 LongDoubleWidth = LongDoubleAlign = 128;
6920 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006921 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6922 LongDoubleWidth = LongDoubleAlign = 64;
6923 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6924 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006925 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006926 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006927 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006928 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006929
6930 void setN64ABITypes() {
6931 LongWidth = LongAlign = 64;
6932 PointerWidth = PointerAlign = 64;
6933 SizeType = UnsignedLong;
6934 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006935 Int64Type = SignedLong;
6936 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006937 }
6938
6939 void setN32ABITypes() {
6940 LongWidth = LongAlign = 32;
6941 PointerWidth = PointerAlign = 32;
6942 SizeType = UnsignedInt;
6943 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006944 Int64Type = SignedLongLong;
6945 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006946 }
6947
Craig Topper3164f332014-03-11 03:39:26 +00006948 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006949 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006950 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006951 ABI = Name;
6952 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006953 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006954 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006955 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006956 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006957 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006958 }
6959 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006960 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006961
Craig Topper3164f332014-03-11 03:39:26 +00006962 void getTargetDefines(const LangOptions &Opts,
6963 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006964 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006965
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006966 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006967 Builder.defineMacro("__mips64");
6968 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006969 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6970
6971 const std::string& CPUStr = getCPU();
6972 if (CPUStr == "mips64")
6973 Builder.defineMacro("__mips_isa_rev", "1");
6974 else if (CPUStr == "mips64r2")
6975 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006976 else if (CPUStr == "mips64r3")
6977 Builder.defineMacro("__mips_isa_rev", "3");
6978 else if (CPUStr == "mips64r5")
6979 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006980 else if (CPUStr == "mips64r6")
6981 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006982
Akira Hatanakabef17452011-09-20 19:21:49 +00006983 if (ABI == "n32") {
6984 Builder.defineMacro("__mips_n32");
6985 Builder.defineMacro("_ABIN32", "2");
6986 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6987 }
6988 else if (ABI == "n64") {
6989 Builder.defineMacro("__mips_n64");
6990 Builder.defineMacro("_ABI64", "3");
6991 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6992 }
6993 else
David Blaikie83d382b2011-09-23 05:06:16 +00006994 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00006995
6996 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00006997 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006998 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00006999 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7000 { { "at" }, "$1" },
7001 { { "v0" }, "$2" },
7002 { { "v1" }, "$3" },
7003 { { "a0" }, "$4" },
7004 { { "a1" }, "$5" },
7005 { { "a2" }, "$6" },
7006 { { "a3" }, "$7" },
7007 { { "a4" }, "$8" },
7008 { { "a5" }, "$9" },
7009 { { "a6" }, "$10" },
7010 { { "a7" }, "$11" },
7011 { { "t0" }, "$12" },
7012 { { "t1" }, "$13" },
7013 { { "t2" }, "$14" },
7014 { { "t3" }, "$15" },
7015 { { "s0" }, "$16" },
7016 { { "s1" }, "$17" },
7017 { { "s2" }, "$18" },
7018 { { "s3" }, "$19" },
7019 { { "s4" }, "$20" },
7020 { { "s5" }, "$21" },
7021 { { "s6" }, "$22" },
7022 { { "s7" }, "$23" },
7023 { { "t8" }, "$24" },
7024 { { "t9" }, "$25" },
7025 { { "k0" }, "$26" },
7026 { { "k1" }, "$27" },
7027 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007028 { { "sp","$sp" }, "$29" },
7029 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007030 { { "ra" }, "$31" }
7031 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007032 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007033 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007034
7035 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007036};
7037
7038class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00007039 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007040 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00007041 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 +00007042 else
Eric Christopher964a5f32015-08-05 23:48:05 +00007043 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00007044
Akira Hatanakabef17452011-09-20 19:21:49 +00007045 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007046
Akira Hatanakabef17452011-09-20 19:21:49 +00007047public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007048 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00007049 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00007050 void getTargetDefines(const LangOptions &Opts,
7051 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007052 DefineStd(Builder, "MIPSEB", Opts);
7053 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007054 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007055 }
7056};
7057
7058class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00007059 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007060 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00007061 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 +00007062 else
Eric Christopher964a5f32015-08-05 23:48:05 +00007063 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00007064 }
7065public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007066 Mips64ELTargetInfo(const llvm::Triple &Triple)
7067 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007068 // Default ABI is n64.
7069 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007070 }
Craig Topper3164f332014-03-11 03:39:26 +00007071 void getTargetDefines(const LangOptions &Opts,
7072 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007073 DefineStd(Builder, "MIPSEL", Opts);
7074 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007075 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007076 }
7077};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007078
Ivan Krasindd7403e2011-08-24 20:22:22 +00007079class PNaClTargetInfo : public TargetInfo {
7080public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007081 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007082 BigEndian = false;
James Y Knighta3518ad2016-01-27 01:04:51 +00007083 this->UserLabelPrefix = "";
Ivan Krasindd7403e2011-08-24 20:22:22 +00007084 this->LongAlign = 32;
7085 this->LongWidth = 32;
7086 this->PointerAlign = 32;
7087 this->PointerWidth = 32;
7088 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007089 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007090 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007091 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007092 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007093 this->SizeType = TargetInfo::UnsignedInt;
7094 this->PtrDiffType = TargetInfo::SignedInt;
7095 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007096 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007097 }
7098
Craig Toppere6f17d02014-03-11 04:07:52 +00007099 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007100 Builder.defineMacro("__le32__");
7101 Builder.defineMacro("__pnacl__");
7102 }
Craig Topper3164f332014-03-11 03:39:26 +00007103 void getTargetDefines(const LangOptions &Opts,
7104 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007105 getArchDefines(Opts, Builder);
7106 }
Craig Topper3164f332014-03-11 03:39:26 +00007107 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007108 return Feature == "pnacl";
7109 }
Craig Topper6c03a542015-10-19 04:51:35 +00007110 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007111 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007112 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007113 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007114 ArrayRef<const char *> getGCCRegNames() const override;
7115 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007116 bool validateAsmConstraint(const char *&Name,
7117 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007118 return false;
7119 }
7120
Craig Topper3164f332014-03-11 03:39:26 +00007121 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007122 return "";
7123 }
7124};
7125
Craig Topperf054e3a2015-10-19 03:52:27 +00007126ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7127 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007128}
7129
Craig Topperf054e3a2015-10-19 03:52:27 +00007130ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7131 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007132}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007133
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007134// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7135class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7136public:
7137 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00007138 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007139 }
7140
7141 BuiltinVaListKind getBuiltinVaListKind() const override {
7142 return TargetInfo::PNaClABIBuiltinVaList;
7143 }
7144};
7145
JF Bastien643817d2014-09-12 17:52:47 +00007146class Le64TargetInfo : public TargetInfo {
7147 static const Builtin::Info BuiltinInfo[];
7148
7149public:
7150 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7151 BigEndian = false;
7152 NoAsmVariants = true;
7153 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7154 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00007155 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00007156 }
7157
7158 void getTargetDefines(const LangOptions &Opts,
7159 MacroBuilder &Builder) const override {
7160 DefineStd(Builder, "unix", Opts);
7161 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7162 Builder.defineMacro("__ELF__");
7163 }
Craig Topper6c03a542015-10-19 04:51:35 +00007164 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7165 return llvm::makeArrayRef(BuiltinInfo,
7166 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007167 }
7168 BuiltinVaListKind getBuiltinVaListKind() const override {
7169 return TargetInfo::PNaClABIBuiltinVaList;
7170 }
7171 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007172 ArrayRef<const char *> getGCCRegNames() const override {
7173 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007174 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007175 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7176 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007177 }
7178 bool validateAsmConstraint(const char *&Name,
7179 TargetInfo::ConstraintInfo &Info) const override {
7180 return false;
7181 }
7182
7183 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007184};
Dan Gohmanc2853072015-09-03 22:51:53 +00007185
7186class WebAssemblyTargetInfo : public TargetInfo {
7187 static const Builtin::Info BuiltinInfo[];
7188
7189 enum SIMDEnum {
7190 NoSIMD,
7191 SIMD128,
7192 } SIMDLevel;
7193
7194public:
7195 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
7196 : TargetInfo(T), SIMDLevel(NoSIMD) {
7197 BigEndian = false;
7198 NoAsmVariants = true;
7199 SuitableAlign = 128;
7200 LargeArrayMinWidth = 128;
7201 LargeArrayAlign = 128;
7202 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007203 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007204 LongDoubleWidth = LongDoubleAlign = 128;
7205 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007206 }
7207
7208protected:
7209 void getTargetDefines(const LangOptions &Opts,
7210 MacroBuilder &Builder) const override {
7211 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7212 if (SIMDLevel >= SIMD128)
7213 Builder.defineMacro("__wasm_simd128__");
7214 }
7215
7216private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007217 bool
7218 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7219 StringRef CPU,
7220 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007221 if (CPU == "bleeding-edge")
7222 Features["simd128"] = true;
7223 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7224 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007225 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007226 return llvm::StringSwitch<bool>(Feature)
7227 .Case("simd128", SIMDLevel >= SIMD128)
7228 .Default(false);
7229 }
7230 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007231 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007232 for (const auto &Feature : Features) {
7233 if (Feature == "+simd128") {
7234 SIMDLevel = std::max(SIMDLevel, SIMD128);
7235 continue;
7236 }
7237 if (Feature == "-simd128") {
7238 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7239 continue;
7240 }
7241
7242 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7243 << "-target-feature";
7244 return false;
7245 }
7246 return true;
7247 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007248 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007249 return llvm::StringSwitch<bool>(Name)
7250 .Case("mvp", true)
7251 .Case("bleeding-edge", true)
7252 .Case("generic", true)
7253 .Default(false);
7254 }
Craig Topper6c03a542015-10-19 04:51:35 +00007255 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7256 return llvm::makeArrayRef(BuiltinInfo,
7257 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007258 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007259 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007260 return VoidPtrBuiltinVaList;
7261 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007262 ArrayRef<const char *> getGCCRegNames() const final {
7263 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007264 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007265 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7266 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007267 }
7268 bool
7269 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007270 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007271 return false;
7272 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007273 const char *getClobbers() const final { return ""; }
7274 bool isCLZForZeroUndef() const final { return false; }
7275 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007276 IntType getIntTypeByWidth(unsigned BitWidth,
7277 bool IsSigned) const final {
7278 // WebAssembly prefers long long for explicitly 64-bit integers.
7279 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7280 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7281 }
7282 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7283 bool IsSigned) const final {
7284 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7285 return BitWidth == 64
7286 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7287 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7288 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007289};
7290
7291const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7292#define BUILTIN(ID, TYPE, ATTRS) \
7293 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7294#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7295 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7296#include "clang/Basic/BuiltinsWebAssembly.def"
7297};
7298
7299class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7300public:
7301 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7302 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007303 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohman0d75f2c2016-01-07 03:20:15 +00007304 DataLayoutString = "e-m:e-p:32:32-i64:64-n32:64-S128";
Dan Gohmanc2853072015-09-03 22:51:53 +00007305 }
7306
7307protected:
7308 void getTargetDefines(const LangOptions &Opts,
7309 MacroBuilder &Builder) const override {
7310 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7311 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7312 }
7313};
7314
7315class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7316public:
7317 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7318 : WebAssemblyTargetInfo(T) {
7319 LongAlign = LongWidth = 64;
7320 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007321 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohman0d75f2c2016-01-07 03:20:15 +00007322 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Dan Gohmanc2853072015-09-03 22:51:53 +00007323 }
7324
7325protected:
7326 void getTargetDefines(const LangOptions &Opts,
7327 MacroBuilder &Builder) const override {
7328 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7329 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7330 }
7331};
7332
JF Bastien643817d2014-09-12 17:52:47 +00007333const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7334#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007335 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007336#include "clang/Basic/BuiltinsLe64.def"
7337};
7338
Eric Christopherc48497a2015-09-18 21:26:24 +00007339static const unsigned SPIRAddrSpaceMap[] = {
7340 1, // opencl_global
7341 3, // opencl_local
7342 2, // opencl_constant
7343 4, // opencl_generic
7344 0, // cuda_device
7345 0, // cuda_constant
7346 0 // cuda_shared
7347};
7348class SPIRTargetInfo : public TargetInfo {
7349public:
7350 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7351 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7352 "SPIR target must use unknown OS");
7353 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7354 "SPIR target must use unknown environment type");
7355 BigEndian = false;
7356 TLSSupported = false;
7357 LongWidth = LongAlign = 64;
7358 AddrSpaceMap = &SPIRAddrSpaceMap;
7359 UseAddrSpaceMapMangling = true;
7360 // Define available target features
7361 // These must be defined in sorted order!
7362 NoAsmVariants = true;
7363 }
7364 void getTargetDefines(const LangOptions &Opts,
7365 MacroBuilder &Builder) const override {
7366 DefineStd(Builder, "SPIR", Opts);
7367 }
7368 bool hasFeature(StringRef Feature) const override {
7369 return Feature == "spir";
7370 }
Craig Topper3164f332014-03-11 03:39:26 +00007371
Craig Topper6c03a542015-10-19 04:51:35 +00007372 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007373 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007374 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007375 bool validateAsmConstraint(const char *&Name,
7376 TargetInfo::ConstraintInfo &info) const override {
7377 return true;
7378 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007379 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7380 return None;
7381 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007382 BuiltinVaListKind getBuiltinVaListKind() const override {
7383 return TargetInfo::VoidPtrBuiltinVaList;
7384 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007385
Eric Christopherc48497a2015-09-18 21:26:24 +00007386 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7387 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7388 : CCCR_Warning;
7389 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007390
Eric Christopherc48497a2015-09-18 21:26:24 +00007391 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7392 return CC_SpirFunction;
7393 }
7394};
Guy Benyeib798fc92012-12-11 21:38:14 +00007395
Eric Christopherc48497a2015-09-18 21:26:24 +00007396class SPIR32TargetInfo : public SPIRTargetInfo {
7397public:
7398 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7399 PointerWidth = PointerAlign = 32;
7400 SizeType = TargetInfo::UnsignedInt;
7401 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7402 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7403 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7404 }
7405 void getTargetDefines(const LangOptions &Opts,
7406 MacroBuilder &Builder) const override {
7407 DefineStd(Builder, "SPIR32", Opts);
7408 }
7409};
Guy Benyeib798fc92012-12-11 21:38:14 +00007410
Eric Christopherc48497a2015-09-18 21:26:24 +00007411class SPIR64TargetInfo : public SPIRTargetInfo {
7412public:
7413 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7414 PointerWidth = PointerAlign = 64;
7415 SizeType = TargetInfo::UnsignedLong;
7416 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7417 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7418 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7419 }
7420 void getTargetDefines(const LangOptions &Opts,
7421 MacroBuilder &Builder) const override {
7422 DefineStd(Builder, "SPIR64", Opts);
7423 }
7424};
Guy Benyeib798fc92012-12-11 21:38:14 +00007425
Robert Lytton0e076492013-08-13 09:43:10 +00007426class XCoreTargetInfo : public TargetInfo {
7427 static const Builtin::Info BuiltinInfo[];
7428public:
7429 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7430 BigEndian = false;
7431 NoAsmVariants = true;
7432 LongLongAlign = 32;
7433 SuitableAlign = 32;
7434 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007435 SizeType = UnsignedInt;
7436 PtrDiffType = SignedInt;
7437 IntPtrType = SignedInt;
7438 WCharType = UnsignedChar;
7439 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007440 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007441 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7442 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007443 }
Craig Topper3164f332014-03-11 03:39:26 +00007444 void getTargetDefines(const LangOptions &Opts,
7445 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007446 Builder.defineMacro("__XS1B__");
7447 }
Craig Topper6c03a542015-10-19 04:51:35 +00007448 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7449 return llvm::makeArrayRef(BuiltinInfo,
7450 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007451 }
Craig Topper3164f332014-03-11 03:39:26 +00007452 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007453 return TargetInfo::VoidPtrBuiltinVaList;
7454 }
Craig Topper3164f332014-03-11 03:39:26 +00007455 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007456 return "";
7457 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007458 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007459 static const char * const GCCRegNames[] = {
7460 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7461 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7462 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007463 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007464 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007465 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7466 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007467 }
Craig Topper3164f332014-03-11 03:39:26 +00007468 bool validateAsmConstraint(const char *&Name,
7469 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007470 return false;
7471 }
Craig Topper3164f332014-03-11 03:39:26 +00007472 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007473 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7474 return (RegNo < 2)? RegNo : -1;
7475 }
Robert Lytton0e076492013-08-13 09:43:10 +00007476};
7477
7478const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007479#define BUILTIN(ID, TYPE, ATTRS) \
7480 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7481#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7482 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007483#include "clang/Basic/BuiltinsXCore.def"
7484};
Robert Lytton0e076492013-08-13 09:43:10 +00007485
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007486// x86_32 Android target
7487class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7488public:
7489 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7490 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7491 SuitableAlign = 32;
7492 LongDoubleWidth = 64;
7493 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7494 }
7495};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007496
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007497// x86_64 Android target
7498class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7499public:
7500 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7501 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7502 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7503 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007504
7505 bool useFloat128ManglingForLongDouble() const override {
7506 return true;
7507 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007508};
7509} // end anonymous namespace
7510
Chris Lattner5ba61f02006-10-14 07:39:34 +00007511//===----------------------------------------------------------------------===//
7512// Driver code
7513//===----------------------------------------------------------------------===//
7514
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007515static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007516 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007517
Daniel Dunbar52322032009-08-18 05:47:58 +00007518 switch (Triple.getArch()) {
7519 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007520 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007521
Tim Northover2a0783d2014-05-30 14:14:07 +00007522 case llvm::Triple::xcore:
7523 return new XCoreTargetInfo(Triple);
7524
7525 case llvm::Triple::hexagon:
7526 return new HexagonTargetInfo(Triple);
7527
7528 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007529 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007530 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007531
7532 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007533 case llvm::Triple::CloudABI:
7534 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple);
Ed Maste6a9eda52014-11-13 16:55:42 +00007535 case llvm::Triple::FreeBSD:
7536 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007537 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007538 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007539 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007540 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007541 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007542 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007543 }
7544
Christian Pirker9b019ae2014-02-25 13:51:00 +00007545 case llvm::Triple::aarch64_be:
7546 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007547 case llvm::Triple::FreeBSD:
7548 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007549 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007550 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007551 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007552 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007553 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007554 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007555 }
7556
Daniel Dunbar52322032009-08-18 05:47:58 +00007557 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007558 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007559 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007560 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007561
Daniel Dunbar52322032009-08-18 05:47:58 +00007562 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007563 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007564 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007565 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007566 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007567 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007568 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007569 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007570 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007571 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007572 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007573 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007574 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007575 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007576 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007577 case llvm::Triple::Win32:
7578 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007579 case llvm::Triple::Cygnus:
7580 return new CygwinARMTargetInfo(Triple);
7581 case llvm::Triple::GNU:
7582 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007583 case llvm::Triple::Itanium:
7584 return new ItaniumWindowsARMleTargetInfo(Triple);
7585 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007586 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007587 return new MicrosoftARMleTargetInfo(Triple);
7588 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007589 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007590 return new ARMleTargetInfo(Triple);
7591 }
7592
7593 case llvm::Triple::armeb:
7594 case llvm::Triple::thumbeb:
7595 if (Triple.isOSDarwin())
7596 return new DarwinARMTargetInfo(Triple);
7597
7598 switch (os) {
7599 case llvm::Triple::Linux:
7600 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7601 case llvm::Triple::FreeBSD:
7602 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7603 case llvm::Triple::NetBSD:
7604 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7605 case llvm::Triple::OpenBSD:
7606 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7607 case llvm::Triple::Bitrig:
7608 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7609 case llvm::Triple::RTEMS:
7610 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7611 case llvm::Triple::NaCl:
7612 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7613 default:
7614 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007615 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007616
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007617 case llvm::Triple::bpfeb:
7618 case llvm::Triple::bpfel:
7619 return new BPFTargetInfo(Triple);
7620
Daniel Dunbar52322032009-08-18 05:47:58 +00007621 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007622 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007623
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007624 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007625 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007626 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007627 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007628 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007629 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007630 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007631 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007632 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007633 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007634 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007635 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007636 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007637
7638 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007639 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007640 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007641 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007642 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007643 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007644 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007645 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007646 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007647 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007648 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007649 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007650 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007651 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007652 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007653
Akira Hatanakabef17452011-09-20 19:21:49 +00007654 case llvm::Triple::mips64:
7655 switch (os) {
7656 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007657 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007658 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007659 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007660 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007661 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007662 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007663 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007664 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007665 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007666 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007667 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007668 }
7669
7670 case llvm::Triple::mips64el:
7671 switch (os) {
7672 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007673 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007674 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007675 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007676 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007677 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007678 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007679 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007680 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007681 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007682 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007683 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007684 }
7685
Ivan Krasindd7403e2011-08-24 20:22:22 +00007686 case llvm::Triple::le32:
7687 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007688 case llvm::Triple::NaCl:
7689 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7690 default:
7691 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007692 }
7693
JF Bastien643817d2014-09-12 17:52:47 +00007694 case llvm::Triple::le64:
7695 return new Le64TargetInfo(Triple);
7696
Daniel Dunbar52322032009-08-18 05:47:58 +00007697 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007698 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007699 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007700 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007701 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007702 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007703 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007704 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007705 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007706 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007707 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007708 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007709 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007710 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007711 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007712 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007713 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007714
7715 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007716 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007717 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007718 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007719 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007720 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007721 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007722 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007723 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007724 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007725 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007726 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007727 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007728 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007729 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007730
Bill Schmidt778d3872013-07-26 01:36:11 +00007731 case llvm::Triple::ppc64le:
7732 switch (os) {
7733 case llvm::Triple::Linux:
7734 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007735 case llvm::Triple::NetBSD:
7736 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007737 default:
7738 return new PPC64TargetInfo(Triple);
7739 }
7740
Peter Collingbournec947aae2012-05-20 23:28:41 +00007741 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007742 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007743 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007744 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007745
Tom Stellardd8e38a32015-01-06 20:34:47 +00007746 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007747 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007748 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007749
Daniel Dunbar52322032009-08-18 05:47:58 +00007750 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007751 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007752 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007753 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007754 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007755 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007756 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007757 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007758 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007759 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007760 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007761 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007762 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007763 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007764 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007765
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007766 // The 'sparcel' architecture copies all the above cases except for Solaris.
7767 case llvm::Triple::sparcel:
7768 switch (os) {
7769 case llvm::Triple::Linux:
7770 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7771 case llvm::Triple::NetBSD:
7772 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7773 case llvm::Triple::OpenBSD:
7774 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7775 case llvm::Triple::RTEMS:
7776 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7777 default:
7778 return new SparcV8elTargetInfo(Triple);
7779 }
7780
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007781 case llvm::Triple::sparcv9:
7782 switch (os) {
7783 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007784 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007785 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007786 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007787 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007788 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007789 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007790 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007791 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007792 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007793 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007794 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007795 }
7796
Ulrich Weigand47445072013-05-06 16:26:41 +00007797 case llvm::Triple::systemz:
7798 switch (os) {
7799 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007800 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007801 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007802 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007803 }
7804
Eli Friedmana9c3d712009-08-19 20:47:07 +00007805 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007806 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007807
Daniel Dunbar52322032009-08-18 05:47:58 +00007808 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007809 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007810 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007811
Daniel Dunbar52322032009-08-18 05:47:58 +00007812 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007813 case llvm::Triple::CloudABI:
7814 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007815 case llvm::Triple::Linux: {
7816 switch (Triple.getEnvironment()) {
7817 default:
7818 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7819 case llvm::Triple::Android:
7820 return new AndroidX86_32TargetInfo(Triple);
7821 }
7822 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007823 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007824 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007825 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007826 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007827 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007828 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007829 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007830 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007831 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007832 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007833 case llvm::Triple::KFreeBSD:
7834 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007835 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007836 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007837 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007838 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007839 case llvm::Triple::Win32: {
7840 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007841 case llvm::Triple::Cygnus:
7842 return new CygwinX86_32TargetInfo(Triple);
7843 case llvm::Triple::GNU:
7844 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007845 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007846 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007847 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007848 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007849 }
7850 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007851 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007852 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007853 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007854 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007855 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007856 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Alexey Bataevc99b0492015-11-25 09:24:26 +00007857 case llvm::Triple::ELFIAMCU:
7858 return new MCUX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007859 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007860 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007861 }
7862
7863 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007864 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007865 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007866
Daniel Dunbar52322032009-08-18 05:47:58 +00007867 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007868 case llvm::Triple::CloudABI:
7869 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007870 case llvm::Triple::Linux: {
7871 switch (Triple.getEnvironment()) {
7872 default:
7873 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7874 case llvm::Triple::Android:
7875 return new AndroidX86_64TargetInfo(Triple);
7876 }
7877 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007878 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007879 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007880 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007881 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007882 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007883 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007884 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007885 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007886 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007887 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007888 case llvm::Triple::KFreeBSD:
7889 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007890 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007891 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007892 case llvm::Triple::Win32: {
7893 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007894 case llvm::Triple::Cygnus:
7895 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007896 case llvm::Triple::GNU:
7897 return new MinGWX86_64TargetInfo(Triple);
7898 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007899 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007900 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007901 }
7902 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007903 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007904 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007905 case llvm::Triple::PS4:
7906 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007907 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007908 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007909 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007910
Douglas Katzman78d7c542015-05-12 21:18:10 +00007911 case llvm::Triple::spir: {
7912 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7913 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7914 return nullptr;
7915 return new SPIR32TargetInfo(Triple);
7916 }
7917 case llvm::Triple::spir64: {
7918 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7919 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7920 return nullptr;
7921 return new SPIR64TargetInfo(Triple);
7922 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007923 case llvm::Triple::wasm32:
7924 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7925 return nullptr;
7926 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7927 case llvm::Triple::wasm64:
7928 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7929 return nullptr;
7930 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007931 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007932}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007933
7934/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007935/// options.
Alp Toker80758082014-07-06 05:26:44 +00007936TargetInfo *
7937TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7938 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007939 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007940
7941 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007942 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007943 if (!Target) {
7944 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007945 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007946 }
Alp Toker80758082014-07-06 05:26:44 +00007947 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007948
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007949 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007950 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7951 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007952 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007953 }
7954
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007955 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007956 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7957 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007958 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007959 }
7960
Rafael Espindolaeb265472013-08-21 21:59:03 +00007961 // Set the fp math unit.
7962 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7963 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007964 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007965 }
7966
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007967 // Compute the default target features, we need the target to handle this
7968 // because features may have dependencies on one another.
7969 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00007970 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
7971 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00007972 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007973
7974 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007975 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007976 for (const auto &F : Features)
7977 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7978
Eric Christopher3ff21b32013-10-16 21:26:26 +00007979 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007980 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007981
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007982 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007983}