blob: dcf6ca9585018284bf57f73c59e1a6559832c0d8 [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",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002050 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2051 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2052 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2053 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2054 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2055 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2056 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2057 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002058};
2059
Eric Christophercdd36352011-06-21 00:05:20 +00002060const TargetInfo::AddlRegName AddlRegNames[] = {
2061 { { "al", "ah", "eax", "rax" }, 0 },
2062 { { "bl", "bh", "ebx", "rbx" }, 3 },
2063 { { "cl", "ch", "ecx", "rcx" }, 2 },
2064 { { "dl", "dh", "edx", "rdx" }, 1 },
2065 { { "esi", "rsi" }, 4 },
2066 { { "edi", "rdi" }, 5 },
2067 { { "esp", "rsp" }, 7 },
2068 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002069 { { "r8d", "r8w", "r8b" }, 38 },
2070 { { "r9d", "r9w", "r9b" }, 39 },
2071 { { "r10d", "r10w", "r10b" }, 40 },
2072 { { "r11d", "r11w", "r11b" }, 41 },
2073 { { "r12d", "r12w", "r12b" }, 42 },
2074 { { "r13d", "r13w", "r13b" }, 43 },
2075 { { "r14d", "r14w", "r14b" }, 44 },
2076 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002077};
2078
2079// X86 target abstract base class; x86-32 and x86-64 are very close, so
2080// most of the implementation can be shared.
2081class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002082 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002083 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002084 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002085 enum MMX3DNowEnum {
2086 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002087 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002088 enum XOPEnum {
2089 NoXOP,
2090 SSE4A,
2091 FMA4,
2092 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002093 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002094
Craig Topper543f3bd2015-10-14 23:47:57 +00002095 bool HasAES = false;
2096 bool HasPCLMUL = false;
2097 bool HasLZCNT = false;
2098 bool HasRDRND = false;
2099 bool HasFSGSBASE = false;
2100 bool HasBMI = false;
2101 bool HasBMI2 = false;
2102 bool HasPOPCNT = false;
2103 bool HasRTM = false;
2104 bool HasPRFCHW = false;
2105 bool HasRDSEED = false;
2106 bool HasADX = false;
2107 bool HasTBM = false;
2108 bool HasFMA = false;
2109 bool HasF16C = false;
2110 bool HasAVX512CD = false;
2111 bool HasAVX512ER = false;
2112 bool HasAVX512PF = false;
2113 bool HasAVX512DQ = false;
2114 bool HasAVX512BW = false;
2115 bool HasAVX512VL = false;
2116 bool HasSHA = false;
2117 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002118 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002119 bool HasXSAVE = false;
2120 bool HasXSAVEOPT = false;
2121 bool HasXSAVEC = false;
2122 bool HasXSAVES = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002123 bool HasPKU = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002124
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002125 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2126 ///
2127 /// Each enumeration represents a particular CPU supported by Clang. These
2128 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2129 enum CPUKind {
2130 CK_Generic,
2131
2132 /// \name i386
2133 /// i386-generation processors.
2134 //@{
2135 CK_i386,
2136 //@}
2137
2138 /// \name i486
2139 /// i486-generation processors.
2140 //@{
2141 CK_i486,
2142 CK_WinChipC6,
2143 CK_WinChip2,
2144 CK_C3,
2145 //@}
2146
2147 /// \name i586
2148 /// i586-generation processors, P5 microarchitecture based.
2149 //@{
2150 CK_i586,
2151 CK_Pentium,
2152 CK_PentiumMMX,
2153 //@}
2154
2155 /// \name i686
2156 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2157 //@{
2158 CK_i686,
2159 CK_PentiumPro,
2160 CK_Pentium2,
2161 CK_Pentium3,
2162 CK_Pentium3M,
2163 CK_PentiumM,
2164 CK_C3_2,
2165
2166 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2167 /// Clang however has some logic to suport this.
2168 // FIXME: Warn, deprecate, and potentially remove this.
2169 CK_Yonah,
2170 //@}
2171
2172 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002173 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002174 //@{
2175 CK_Pentium4,
2176 CK_Pentium4M,
2177 CK_Prescott,
2178 CK_Nocona,
2179 //@}
2180
2181 /// \name Core
2182 /// Core microarchitecture based processors.
2183 //@{
2184 CK_Core2,
2185
2186 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2187 /// codename which GCC no longer accepts as an option to -march, but Clang
2188 /// has some logic for recognizing it.
2189 // FIXME: Warn, deprecate, and potentially remove this.
2190 CK_Penryn,
2191 //@}
2192
2193 /// \name Atom
2194 /// Atom processors
2195 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002196 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002197 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002198 //@}
2199
2200 /// \name Nehalem
2201 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002202 CK_Nehalem,
2203
2204 /// \name Westmere
2205 /// Westmere microarchitecture based processors.
2206 CK_Westmere,
2207
2208 /// \name Sandy Bridge
2209 /// Sandy Bridge microarchitecture based processors.
2210 CK_SandyBridge,
2211
2212 /// \name Ivy Bridge
2213 /// Ivy Bridge microarchitecture based processors.
2214 CK_IvyBridge,
2215
2216 /// \name Haswell
2217 /// Haswell microarchitecture based processors.
2218 CK_Haswell,
2219
2220 /// \name Broadwell
2221 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002222 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002223
2224 /// \name Skylake
2225 /// Skylake microarchitecture based processors.
2226 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002227
Craig Topper449314e2013-08-20 07:09:39 +00002228 /// \name Knights Landing
2229 /// Knights Landing processor.
2230 CK_KNL,
2231
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002232 /// \name K6
2233 /// K6 architecture processors.
2234 //@{
2235 CK_K6,
2236 CK_K6_2,
2237 CK_K6_3,
2238 //@}
2239
2240 /// \name K7
2241 /// K7 architecture processors.
2242 //@{
2243 CK_Athlon,
2244 CK_AthlonThunderbird,
2245 CK_Athlon4,
2246 CK_AthlonXP,
2247 CK_AthlonMP,
2248 //@}
2249
2250 /// \name K8
2251 /// K8 architecture processors.
2252 //@{
2253 CK_Athlon64,
2254 CK_Athlon64SSE3,
2255 CK_AthlonFX,
2256 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002257 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002258 CK_Opteron,
2259 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002260 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002261 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002262
Benjamin Kramer569f2152012-01-10 11:50:18 +00002263 /// \name Bobcat
2264 /// Bobcat architecture processors.
2265 //@{
2266 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002267 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002268 //@}
2269
2270 /// \name Bulldozer
2271 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002272 //@{
2273 CK_BDVER1,
2274 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002275 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002276 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002277 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002278
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002279 /// This specification is deprecated and will be removed in the future.
2280 /// Users should prefer \see CK_K8.
2281 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002282 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002283 CK_x86_64,
2284 //@}
2285
2286 /// \name Geode
2287 /// Geode processors.
2288 //@{
2289 CK_Geode
2290 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002291 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002292
Eric Christopherc50738f2015-08-27 00:05:50 +00002293 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002294 return llvm::StringSwitch<CPUKind>(CPU)
2295 .Case("i386", CK_i386)
2296 .Case("i486", CK_i486)
2297 .Case("winchip-c6", CK_WinChipC6)
2298 .Case("winchip2", CK_WinChip2)
2299 .Case("c3", CK_C3)
2300 .Case("i586", CK_i586)
2301 .Case("pentium", CK_Pentium)
2302 .Case("pentium-mmx", CK_PentiumMMX)
2303 .Case("i686", CK_i686)
2304 .Case("pentiumpro", CK_PentiumPro)
2305 .Case("pentium2", CK_Pentium2)
2306 .Case("pentium3", CK_Pentium3)
2307 .Case("pentium3m", CK_Pentium3M)
2308 .Case("pentium-m", CK_PentiumM)
2309 .Case("c3-2", CK_C3_2)
2310 .Case("yonah", CK_Yonah)
2311 .Case("pentium4", CK_Pentium4)
2312 .Case("pentium4m", CK_Pentium4M)
2313 .Case("prescott", CK_Prescott)
2314 .Case("nocona", CK_Nocona)
2315 .Case("core2", CK_Core2)
2316 .Case("penryn", CK_Penryn)
2317 .Case("bonnell", CK_Bonnell)
2318 .Case("atom", CK_Bonnell) // Legacy name.
2319 .Case("silvermont", CK_Silvermont)
2320 .Case("slm", CK_Silvermont) // Legacy name.
2321 .Case("nehalem", CK_Nehalem)
2322 .Case("corei7", CK_Nehalem) // Legacy name.
2323 .Case("westmere", CK_Westmere)
2324 .Case("sandybridge", CK_SandyBridge)
2325 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2326 .Case("ivybridge", CK_IvyBridge)
2327 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2328 .Case("haswell", CK_Haswell)
2329 .Case("core-avx2", CK_Haswell) // Legacy name.
2330 .Case("broadwell", CK_Broadwell)
2331 .Case("skylake", CK_Skylake)
2332 .Case("skx", CK_Skylake) // Legacy name.
2333 .Case("knl", CK_KNL)
2334 .Case("k6", CK_K6)
2335 .Case("k6-2", CK_K6_2)
2336 .Case("k6-3", CK_K6_3)
2337 .Case("athlon", CK_Athlon)
2338 .Case("athlon-tbird", CK_AthlonThunderbird)
2339 .Case("athlon-4", CK_Athlon4)
2340 .Case("athlon-xp", CK_AthlonXP)
2341 .Case("athlon-mp", CK_AthlonMP)
2342 .Case("athlon64", CK_Athlon64)
2343 .Case("athlon64-sse3", CK_Athlon64SSE3)
2344 .Case("athlon-fx", CK_AthlonFX)
2345 .Case("k8", CK_K8)
2346 .Case("k8-sse3", CK_K8SSE3)
2347 .Case("opteron", CK_Opteron)
2348 .Case("opteron-sse3", CK_OpteronSSE3)
2349 .Case("barcelona", CK_AMDFAM10)
2350 .Case("amdfam10", CK_AMDFAM10)
2351 .Case("btver1", CK_BTVER1)
2352 .Case("btver2", CK_BTVER2)
2353 .Case("bdver1", CK_BDVER1)
2354 .Case("bdver2", CK_BDVER2)
2355 .Case("bdver3", CK_BDVER3)
2356 .Case("bdver4", CK_BDVER4)
2357 .Case("x86-64", CK_x86_64)
2358 .Case("geode", CK_Geode)
2359 .Default(CK_Generic);
2360 }
2361
Rafael Espindolaeb265472013-08-21 21:59:03 +00002362 enum FPMathKind {
2363 FP_Default,
2364 FP_SSE,
2365 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002366 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002367
Eli Friedman3fd920a2008-08-20 02:34:37 +00002368public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002369 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002370 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002371 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002372 }
Craig Topper3164f332014-03-11 03:39:26 +00002373 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002374 // X87 evaluates with 80 bits "long double" precision.
2375 return SSELevel == NoSSE ? 2 : 0;
2376 }
Craig Topper6c03a542015-10-19 04:51:35 +00002377 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2378 return llvm::makeArrayRef(BuiltinInfo,
2379 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002380 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002381 ArrayRef<const char *> getGCCRegNames() const override {
2382 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002383 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002384 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2385 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002386 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002387 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2388 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002389 }
Eric Christopherd9832702015-06-29 21:00:05 +00002390 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002391 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002392 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002393
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002394 bool validateGlobalRegisterVariable(StringRef RegName,
2395 unsigned RegSize,
2396 bool &HasSizeMismatch) const override {
2397 // esp and ebp are the only 32-bit registers the x86 backend can currently
2398 // handle.
2399 if (RegName.equals("esp") || RegName.equals("ebp")) {
2400 // Check that the register size is 32-bit.
2401 HasSizeMismatch = RegSize != 32;
2402 return true;
2403 }
2404
2405 return false;
2406 }
2407
Akira Hatanaka974131e2014-09-18 18:17:18 +00002408 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2409
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002410 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2411
Akira Hatanaka974131e2014-09-18 18:17:18 +00002412 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2413
Craig Topper3164f332014-03-11 03:39:26 +00002414 std::string convertConstraint(const char *&Constraint) const override;
2415 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002416 return "~{dirflag},~{fpsr},~{flags}";
2417 }
Craig Topper3164f332014-03-11 03:39:26 +00002418 void getTargetDefines(const LangOptions &Opts,
2419 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002420 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2421 bool Enabled);
2422 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2423 bool Enabled);
2424 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2425 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002426 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2427 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002428 setFeatureEnabledImpl(Features, Name, Enabled);
2429 }
2430 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002431 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002432 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2433 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002434 bool
2435 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2436 StringRef CPU,
2437 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002438 bool hasFeature(StringRef Feature) const override;
2439 bool handleTargetFeatures(std::vector<std::string> &Features,
2440 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002441 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002442 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2443 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002444 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002445 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002446 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002447 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002448 return "no-mmx";
2449 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002450 }
Craig Topper3164f332014-03-11 03:39:26 +00002451 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002452 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002453
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002454 // Perform any per-CPU checks necessary to determine if this CPU is
2455 // acceptable.
2456 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2457 // invalid without explaining *why*.
2458 switch (CPU) {
2459 case CK_Generic:
2460 // No processor selected!
2461 return false;
2462
2463 case CK_i386:
2464 case CK_i486:
2465 case CK_WinChipC6:
2466 case CK_WinChip2:
2467 case CK_C3:
2468 case CK_i586:
2469 case CK_Pentium:
2470 case CK_PentiumMMX:
2471 case CK_i686:
2472 case CK_PentiumPro:
2473 case CK_Pentium2:
2474 case CK_Pentium3:
2475 case CK_Pentium3M:
2476 case CK_PentiumM:
2477 case CK_Yonah:
2478 case CK_C3_2:
2479 case CK_Pentium4:
2480 case CK_Pentium4M:
2481 case CK_Prescott:
2482 case CK_K6:
2483 case CK_K6_2:
2484 case CK_K6_3:
2485 case CK_Athlon:
2486 case CK_AthlonThunderbird:
2487 case CK_Athlon4:
2488 case CK_AthlonXP:
2489 case CK_AthlonMP:
2490 case CK_Geode:
2491 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002492 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002493 return false;
2494
2495 // Fallthrough
2496 case CK_Nocona:
2497 case CK_Core2:
2498 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002499 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002500 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002501 case CK_Nehalem:
2502 case CK_Westmere:
2503 case CK_SandyBridge:
2504 case CK_IvyBridge:
2505 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002506 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002507 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002508 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002509 case CK_Athlon64:
2510 case CK_Athlon64SSE3:
2511 case CK_AthlonFX:
2512 case CK_K8:
2513 case CK_K8SSE3:
2514 case CK_Opteron:
2515 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002516 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002517 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002518 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002519 case CK_BDVER1:
2520 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002521 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002522 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002523 case CK_x86_64:
2524 return true;
2525 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002526 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002527 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002528
Craig Topper3164f332014-03-11 03:39:26 +00002529 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002530
Craig Topper3164f332014-03-11 03:39:26 +00002531 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002532 // We accept all non-ARM calling conventions
2533 return (CC == CC_X86ThisCall ||
2534 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002535 CC == CC_X86StdCall ||
2536 CC == CC_X86VectorCall ||
2537 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002538 CC == CC_X86Pascal ||
2539 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002540 }
2541
Craig Topper3164f332014-03-11 03:39:26 +00002542 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002543 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002544 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002545
2546 bool hasSjLjLowering() const override {
2547 return true;
2548 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002549};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002550
Rafael Espindolaeb265472013-08-21 21:59:03 +00002551bool X86TargetInfo::setFPMath(StringRef Name) {
2552 if (Name == "387") {
2553 FPMath = FP_387;
2554 return true;
2555 }
2556 if (Name == "sse") {
2557 FPMath = FP_SSE;
2558 return true;
2559 }
2560 return false;
2561}
2562
Eric Christopher007b0a02015-08-28 22:32:01 +00002563bool X86TargetInfo::initFeatureMap(
2564 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002565 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002566 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002567 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002568 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002569 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002570
Eric Christopher2b4a7252015-08-27 00:05:52 +00002571 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002572 case CK_Generic:
2573 case CK_i386:
2574 case CK_i486:
2575 case CK_i586:
2576 case CK_Pentium:
2577 case CK_i686:
2578 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002579 break;
2580 case CK_PentiumMMX:
2581 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002582 case CK_K6:
2583 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002584 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002585 break;
2586 case CK_Pentium3:
2587 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002588 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002589 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002590 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002591 break;
2592 case CK_PentiumM:
2593 case CK_Pentium4:
2594 case CK_Pentium4M:
2595 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002596 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002597 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002598 break;
2599 case CK_Yonah:
2600 case CK_Prescott:
2601 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002602 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002603 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002604 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002605 break;
2606 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002607 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002608 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002609 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002610 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002611 break;
2612 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002613 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002614 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002615 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002616 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002617 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002618 setFeatureEnabledImpl(Features, "avx512f", true);
2619 setFeatureEnabledImpl(Features, "avx512cd", true);
2620 setFeatureEnabledImpl(Features, "avx512dq", true);
2621 setFeatureEnabledImpl(Features, "avx512bw", true);
2622 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002623 setFeatureEnabledImpl(Features, "xsavec", true);
2624 setFeatureEnabledImpl(Features, "xsaves", true);
Asaf Badouha9d1e182015-12-31 14:14:07 +00002625 setFeatureEnabledImpl(Features, "pku", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002626 // FALLTHROUGH
2627 case CK_Broadwell:
2628 setFeatureEnabledImpl(Features, "rdseed", true);
2629 setFeatureEnabledImpl(Features, "adx", true);
2630 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002631 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002632 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002633 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002634 setFeatureEnabledImpl(Features, "bmi", true);
2635 setFeatureEnabledImpl(Features, "bmi2", true);
2636 setFeatureEnabledImpl(Features, "rtm", true);
2637 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002638 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002639 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002640 setFeatureEnabledImpl(Features, "rdrnd", true);
2641 setFeatureEnabledImpl(Features, "f16c", true);
2642 setFeatureEnabledImpl(Features, "fsgsbase", true);
2643 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002644 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002645 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002646 setFeatureEnabledImpl(Features, "xsave", true);
2647 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002648 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002649 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002650 case CK_Silvermont:
2651 setFeatureEnabledImpl(Features, "aes", true);
2652 setFeatureEnabledImpl(Features, "pclmul", true);
2653 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002654 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002655 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002656 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002657 setFeatureEnabledImpl(Features, "cx16", true);
2658 break;
2659 case CK_KNL:
2660 setFeatureEnabledImpl(Features, "avx512f", true);
2661 setFeatureEnabledImpl(Features, "avx512cd", true);
2662 setFeatureEnabledImpl(Features, "avx512er", true);
2663 setFeatureEnabledImpl(Features, "avx512pf", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002664 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002665 setFeatureEnabledImpl(Features, "rdseed", true);
2666 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002667 setFeatureEnabledImpl(Features, "lzcnt", true);
2668 setFeatureEnabledImpl(Features, "bmi", true);
2669 setFeatureEnabledImpl(Features, "bmi2", true);
2670 setFeatureEnabledImpl(Features, "rtm", true);
2671 setFeatureEnabledImpl(Features, "fma", true);
2672 setFeatureEnabledImpl(Features, "rdrnd", true);
2673 setFeatureEnabledImpl(Features, "f16c", true);
2674 setFeatureEnabledImpl(Features, "fsgsbase", true);
2675 setFeatureEnabledImpl(Features, "aes", true);
2676 setFeatureEnabledImpl(Features, "pclmul", true);
2677 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002678 setFeatureEnabledImpl(Features, "xsaveopt", true);
2679 setFeatureEnabledImpl(Features, "xsave", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002680 break;
2681 case CK_K6_2:
2682 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002683 case CK_WinChip2:
2684 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002685 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002686 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002687 case CK_Athlon:
2688 case CK_AthlonThunderbird:
2689 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002690 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002691 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002692 case CK_Athlon4:
2693 case CK_AthlonXP:
2694 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002695 setFeatureEnabledImpl(Features, "sse", 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;
2699 case CK_K8:
2700 case CK_Opteron:
2701 case CK_Athlon64:
2702 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002703 setFeatureEnabledImpl(Features, "sse2", true);
2704 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002705 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002706 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002707 case CK_AMDFAM10:
2708 setFeatureEnabledImpl(Features, "sse4a", true);
2709 setFeatureEnabledImpl(Features, "lzcnt", true);
2710 setFeatureEnabledImpl(Features, "popcnt", true);
2711 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002712 case CK_K8SSE3:
2713 case CK_OpteronSSE3:
2714 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002715 setFeatureEnabledImpl(Features, "sse3", true);
2716 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002717 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002718 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002719 case CK_BTVER2:
2720 setFeatureEnabledImpl(Features, "avx", true);
2721 setFeatureEnabledImpl(Features, "aes", true);
2722 setFeatureEnabledImpl(Features, "pclmul", true);
2723 setFeatureEnabledImpl(Features, "bmi", true);
2724 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002725 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002726 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002727 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002728 setFeatureEnabledImpl(Features, "ssse3", true);
2729 setFeatureEnabledImpl(Features, "sse4a", true);
2730 setFeatureEnabledImpl(Features, "lzcnt", true);
2731 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002732 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002733 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002734 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002735 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002736 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002737 case CK_BDVER4:
2738 setFeatureEnabledImpl(Features, "avx2", true);
2739 setFeatureEnabledImpl(Features, "bmi2", true);
2740 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002741 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002742 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002743 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002744 // FALLTHROUGH
2745 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002746 setFeatureEnabledImpl(Features, "bmi", true);
2747 setFeatureEnabledImpl(Features, "fma", true);
2748 setFeatureEnabledImpl(Features, "f16c", true);
2749 setFeatureEnabledImpl(Features, "tbm", true);
2750 // FALLTHROUGH
2751 case CK_BDVER1:
2752 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002753 setFeatureEnabledImpl(Features, "xop", true);
2754 setFeatureEnabledImpl(Features, "lzcnt", true);
2755 setFeatureEnabledImpl(Features, "aes", true);
2756 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002757 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002758 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002759 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002760 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002761 break;
Eli Friedman33465822011-07-08 23:31:17 +00002762 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002763 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2764 return false;
2765
2766 // Can't do this earlier because we need to be able to explicitly enable
2767 // or disable these features and the things that they depend upon.
2768
2769 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2770 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002771 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002772 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2773 FeaturesVec.end())
2774 Features["popcnt"] = true;
2775
2776 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2777 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002778 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002779 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2780 FeaturesVec.end())
2781 Features["prfchw"] = true;
2782
Eric Christophera7260af2015-10-08 20:10:18 +00002783 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2784 // then enable MMX.
2785 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002786 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002787 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2788 FeaturesVec.end())
2789 Features["mmx"] = true;
2790
Eric Christopherbbd746d2015-10-08 20:10:14 +00002791 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002792}
2793
Rafael Espindolae62e2792013-08-20 13:44:29 +00002794void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002795 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002796 if (Enabled) {
2797 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002798 case AVX512F:
2799 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002800 case AVX2:
2801 Features["avx2"] = true;
2802 case AVX:
2803 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002804 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002805 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002806 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002807 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002808 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002809 case SSSE3:
2810 Features["ssse3"] = true;
2811 case SSE3:
2812 Features["sse3"] = true;
2813 case SSE2:
2814 Features["sse2"] = true;
2815 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002816 Features["sse"] = true;
2817 case NoSSE:
2818 break;
2819 }
2820 return;
2821 }
2822
2823 switch (Level) {
2824 case NoSSE:
2825 case SSE1:
2826 Features["sse"] = false;
2827 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002828 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2829 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002830 case SSE3:
2831 Features["sse3"] = false;
2832 setXOPLevel(Features, NoXOP, false);
2833 case SSSE3:
2834 Features["ssse3"] = false;
2835 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002836 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002837 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002838 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002839 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002840 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2841 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002842 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002843 case AVX2:
2844 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002845 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002846 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002847 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2848 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002849 }
2850}
2851
2852void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002853 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002854 if (Enabled) {
2855 switch (Level) {
2856 case AMD3DNowAthlon:
2857 Features["3dnowa"] = true;
2858 case AMD3DNow:
2859 Features["3dnow"] = true;
2860 case MMX:
2861 Features["mmx"] = true;
2862 case NoMMX3DNow:
2863 break;
2864 }
2865 return;
2866 }
2867
2868 switch (Level) {
2869 case NoMMX3DNow:
2870 case MMX:
2871 Features["mmx"] = false;
2872 case AMD3DNow:
2873 Features["3dnow"] = false;
2874 case AMD3DNowAthlon:
2875 Features["3dnowa"] = false;
2876 }
2877}
2878
2879void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002880 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002881 if (Enabled) {
2882 switch (Level) {
2883 case XOP:
2884 Features["xop"] = true;
2885 case FMA4:
2886 Features["fma4"] = true;
2887 setSSELevel(Features, AVX, true);
2888 case SSE4A:
2889 Features["sse4a"] = true;
2890 setSSELevel(Features, SSE3, true);
2891 case NoXOP:
2892 break;
2893 }
2894 return;
2895 }
2896
2897 switch (Level) {
2898 case NoXOP:
2899 case SSE4A:
2900 Features["sse4a"] = false;
2901 case FMA4:
2902 Features["fma4"] = false;
2903 case XOP:
2904 Features["xop"] = false;
2905 }
2906}
2907
Craig Topper86d79ef2013-09-17 04:51:29 +00002908void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2909 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002910 // This is a bit of a hack to deal with the sse4 target feature when used
2911 // as part of the target attribute. We handle sse4 correctly everywhere
2912 // else. See below for more information on how we handle the sse4 options.
2913 if (Name != "sse4")
2914 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002915
Craig Topper29561122013-09-19 01:13:07 +00002916 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002917 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002918 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002919 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002920 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002921 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002922 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002923 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002924 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002925 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002926 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002927 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002928 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002929 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002930 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002931 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002932 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002933 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002934 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002935 if (Enabled)
2936 setSSELevel(Features, SSE2, Enabled);
2937 } else if (Name == "pclmul") {
2938 if (Enabled)
2939 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002940 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002941 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002942 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002943 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002944 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002945 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002946 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2947 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002948 if (Enabled)
2949 setSSELevel(Features, AVX512F, Enabled);
2950 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002951 if (Enabled)
2952 setSSELevel(Features, AVX, Enabled);
2953 } else if (Name == "fma4") {
2954 setXOPLevel(Features, FMA4, Enabled);
2955 } else if (Name == "xop") {
2956 setXOPLevel(Features, XOP, Enabled);
2957 } else if (Name == "sse4a") {
2958 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002959 } else if (Name == "f16c") {
2960 if (Enabled)
2961 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002962 } else if (Name == "sha") {
2963 if (Enabled)
2964 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002965 } else if (Name == "sse4") {
2966 // We can get here via the __target__ attribute since that's not controlled
2967 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2968 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2969 // disabled.
2970 if (Enabled)
2971 setSSELevel(Features, SSE42, Enabled);
2972 else
2973 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00002974 } else if (Name == "xsave") {
2975 if (Enabled)
2976 setSSELevel(Features, AVX, Enabled);
2977 else
2978 Features["xsaveopt"] = false;
2979 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
2980 if (Enabled) {
2981 Features["xsave"] = true;
2982 setSSELevel(Features, AVX, Enabled);
2983 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002984 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002985}
2986
Eric Christopher3ff21b32013-10-16 21:26:26 +00002987/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002988/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002989bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002990 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00002991 for (const auto &Feature : Features) {
2992 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00002993 continue;
2994
Eric Christopher610fe112015-08-26 08:21:55 +00002995 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00002996 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002997 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00002998 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00002999 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003000 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003001 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003002 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003003 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003004 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003005 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003006 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003007 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003008 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003009 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003010 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003011 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003012 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003013 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003014 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003015 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003016 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003017 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003018 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003019 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003020 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003021 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003022 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003023 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003024 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003025 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003026 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003027 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003028 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003029 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003030 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003031 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003032 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003033 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003034 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003035 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003036 HasAVX512VL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003037 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003038 HasSHA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003039 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003040 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003041 } else if (Feature == "+fxsr") {
3042 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003043 } else if (Feature == "+xsave") {
3044 HasXSAVE = true;
3045 } else if (Feature == "+xsaveopt") {
3046 HasXSAVEOPT = true;
3047 } else if (Feature == "+xsavec") {
3048 HasXSAVEC = true;
3049 } else if (Feature == "+xsaves") {
3050 HasXSAVES = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003051 } else if (Feature == "+pku") {
3052 HasPKU = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003053 }
3054
Benjamin Kramer27402c62012-03-05 15:10:44 +00003055 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003056 .Case("+avx512f", AVX512F)
3057 .Case("+avx2", AVX2)
3058 .Case("+avx", AVX)
3059 .Case("+sse4.2", SSE42)
3060 .Case("+sse4.1", SSE41)
3061 .Case("+ssse3", SSSE3)
3062 .Case("+sse3", SSE3)
3063 .Case("+sse2", SSE2)
3064 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003065 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003066 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003067
Eli Friedman33465822011-07-08 23:31:17 +00003068 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003069 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003070 .Case("+3dnowa", AMD3DNowAthlon)
3071 .Case("+3dnow", AMD3DNow)
3072 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003073 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003074 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003075
3076 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003077 .Case("+xop", XOP)
3078 .Case("+fma4", FMA4)
3079 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003080 .Default(NoXOP);
3081 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003082 }
Eli Friedman33465822011-07-08 23:31:17 +00003083
Rafael Espindolaeb265472013-08-21 21:59:03 +00003084 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3085 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003086 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3087 (FPMath == FP_387 && SSELevel >= SSE1)) {
3088 Diags.Report(diag::err_target_unsupported_fpmath) <<
3089 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003090 return false;
3091 }
3092
Alexey Bataev00396512015-07-02 03:40:19 +00003093 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003094 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003095 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003096}
Chris Lattnerecd49032009-03-02 22:27:17 +00003097
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003098/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3099/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003100void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003101 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003102 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003103 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003104 Builder.defineMacro("__amd64__");
3105 Builder.defineMacro("__amd64");
3106 Builder.defineMacro("__x86_64");
3107 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003108 if (getTriple().getArchName() == "x86_64h") {
3109 Builder.defineMacro("__x86_64h");
3110 Builder.defineMacro("__x86_64h__");
3111 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003112 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003113 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003114 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003115
Chris Lattnerecd49032009-03-02 22:27:17 +00003116 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003117 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3118 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003119 switch (CPU) {
3120 case CK_Generic:
3121 break;
3122 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003123 // The rest are coming from the i386 define above.
3124 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003125 break;
3126 case CK_i486:
3127 case CK_WinChipC6:
3128 case CK_WinChip2:
3129 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003130 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003131 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003132 case CK_PentiumMMX:
3133 Builder.defineMacro("__pentium_mmx__");
3134 Builder.defineMacro("__tune_pentium_mmx__");
3135 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003136 case CK_i586:
3137 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003138 defineCPUMacros(Builder, "i586");
3139 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003140 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003141 case CK_Pentium3:
3142 case CK_Pentium3M:
3143 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003144 Builder.defineMacro("__tune_pentium3__");
3145 // Fallthrough
3146 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003147 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003148 Builder.defineMacro("__tune_pentium2__");
3149 // Fallthrough
3150 case CK_PentiumPro:
3151 Builder.defineMacro("__tune_i686__");
3152 Builder.defineMacro("__tune_pentiumpro__");
3153 // Fallthrough
3154 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003155 Builder.defineMacro("__i686");
3156 Builder.defineMacro("__i686__");
3157 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3158 Builder.defineMacro("__pentiumpro");
3159 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003160 break;
3161 case CK_Pentium4:
3162 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003163 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003164 break;
3165 case CK_Yonah:
3166 case CK_Prescott:
3167 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003168 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003169 break;
3170 case CK_Core2:
3171 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003172 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003173 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003174 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003175 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003176 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003177 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003178 defineCPUMacros(Builder, "slm");
3179 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003180 case CK_Nehalem:
3181 case CK_Westmere:
3182 case CK_SandyBridge:
3183 case CK_IvyBridge:
3184 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003185 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003186 // FIXME: Historically, we defined this legacy name, it would be nice to
3187 // remove it at some point. We've never exposed fine-grained names for
3188 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003189 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003190 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003191 case CK_Skylake:
3192 // FIXME: Historically, we defined this legacy name, it would be nice to
3193 // remove it at some point. This is the only fine-grained CPU macro in the
3194 // main intel CPU line, and it would be better to not have these and force
3195 // people to use ISA macros.
3196 defineCPUMacros(Builder, "skx");
3197 break;
Craig Topper449314e2013-08-20 07:09:39 +00003198 case CK_KNL:
3199 defineCPUMacros(Builder, "knl");
3200 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003201 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003202 Builder.defineMacro("__k6_2__");
3203 Builder.defineMacro("__tune_k6_2__");
3204 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003205 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003206 if (CPU != CK_K6_2) { // In case of fallthrough
3207 // FIXME: GCC may be enabling these in cases where some other k6
3208 // architecture is specified but -m3dnow is explicitly provided. The
3209 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003210 Builder.defineMacro("__k6_3__");
3211 Builder.defineMacro("__tune_k6_3__");
3212 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003213 // Fallthrough
3214 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003215 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003216 break;
3217 case CK_Athlon:
3218 case CK_AthlonThunderbird:
3219 case CK_Athlon4:
3220 case CK_AthlonXP:
3221 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003222 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003223 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003224 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003225 Builder.defineMacro("__tune_athlon_sse__");
3226 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003227 break;
3228 case CK_K8:
3229 case CK_K8SSE3:
3230 case CK_x86_64:
3231 case CK_Opteron:
3232 case CK_OpteronSSE3:
3233 case CK_Athlon64:
3234 case CK_Athlon64SSE3:
3235 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003236 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003237 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003238 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003239 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003240 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003241 case CK_BTVER1:
3242 defineCPUMacros(Builder, "btver1");
3243 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003244 case CK_BTVER2:
3245 defineCPUMacros(Builder, "btver2");
3246 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003247 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003248 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003249 break;
3250 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003251 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003252 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003253 case CK_BDVER3:
3254 defineCPUMacros(Builder, "bdver3");
3255 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003256 case CK_BDVER4:
3257 defineCPUMacros(Builder, "bdver4");
3258 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003259 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003260 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003261 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003262 }
Chris Lattner96e43572009-03-02 22:40:39 +00003263
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003264 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003265 Builder.defineMacro("__REGISTER_PREFIX__", "");
3266
Chris Lattner6df41af2009-04-19 17:32:33 +00003267 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3268 // functions in glibc header files that use FP Stack inline asm which the
3269 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003270 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003271
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003272 if (HasAES)
3273 Builder.defineMacro("__AES__");
3274
Craig Topper3f122a72012-05-31 05:18:48 +00003275 if (HasPCLMUL)
3276 Builder.defineMacro("__PCLMUL__");
3277
Craig Topper22967d42011-12-25 05:06:45 +00003278 if (HasLZCNT)
3279 Builder.defineMacro("__LZCNT__");
3280
Benjamin Kramer1e250392012-07-07 09:39:18 +00003281 if (HasRDRND)
3282 Builder.defineMacro("__RDRND__");
3283
Craig Topper8c7f2512014-11-03 06:51:41 +00003284 if (HasFSGSBASE)
3285 Builder.defineMacro("__FSGSBASE__");
3286
Craig Topper22967d42011-12-25 05:06:45 +00003287 if (HasBMI)
3288 Builder.defineMacro("__BMI__");
3289
3290 if (HasBMI2)
3291 Builder.defineMacro("__BMI2__");
3292
Craig Topper1de83482011-12-29 16:10:46 +00003293 if (HasPOPCNT)
3294 Builder.defineMacro("__POPCNT__");
3295
Michael Liao625a8752012-11-10 05:17:46 +00003296 if (HasRTM)
3297 Builder.defineMacro("__RTM__");
3298
Michael Liao74f4eaf2013-03-26 17:52:08 +00003299 if (HasPRFCHW)
3300 Builder.defineMacro("__PRFCHW__");
3301
Michael Liaoffaae352013-03-29 05:17:55 +00003302 if (HasRDSEED)
3303 Builder.defineMacro("__RDSEED__");
3304
Robert Khasanov50e6f582014-09-19 09:53:48 +00003305 if (HasADX)
3306 Builder.defineMacro("__ADX__");
3307
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003308 if (HasTBM)
3309 Builder.defineMacro("__TBM__");
3310
Rafael Espindolae62e2792013-08-20 13:44:29 +00003311 switch (XOPLevel) {
3312 case XOP:
3313 Builder.defineMacro("__XOP__");
3314 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003315 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003316 case SSE4A:
3317 Builder.defineMacro("__SSE4A__");
3318 case NoXOP:
3319 break;
3320 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003321
Craig Topperbba778b2012-06-03 21:46:30 +00003322 if (HasFMA)
3323 Builder.defineMacro("__FMA__");
3324
Manman Rena45358c2012-10-11 00:59:55 +00003325 if (HasF16C)
3326 Builder.defineMacro("__F16C__");
3327
Craig Topper679b53a2013-08-21 05:29:10 +00003328 if (HasAVX512CD)
3329 Builder.defineMacro("__AVX512CD__");
3330 if (HasAVX512ER)
3331 Builder.defineMacro("__AVX512ER__");
3332 if (HasAVX512PF)
3333 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003334 if (HasAVX512DQ)
3335 Builder.defineMacro("__AVX512DQ__");
3336 if (HasAVX512BW)
3337 Builder.defineMacro("__AVX512BW__");
3338 if (HasAVX512VL)
3339 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003340
Ben Langmuir58078d02013-09-19 13:22:04 +00003341 if (HasSHA)
3342 Builder.defineMacro("__SHA__");
3343
Craig Toppere33f51f2015-10-16 06:22:36 +00003344 if (HasFXSR)
3345 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003346 if (HasXSAVE)
3347 Builder.defineMacro("__XSAVE__");
3348 if (HasXSAVEOPT)
3349 Builder.defineMacro("__XSAVEOPT__");
3350 if (HasXSAVEC)
3351 Builder.defineMacro("__XSAVEC__");
3352 if (HasXSAVES)
3353 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003354 if (HasPKU)
3355 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003356 if (HasCX16)
3357 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3358
Chris Lattner96e43572009-03-02 22:40:39 +00003359 // Each case falls through to the previous one here.
3360 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003361 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003362 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003363 case AVX2:
3364 Builder.defineMacro("__AVX2__");
3365 case AVX:
3366 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003367 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003368 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003369 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003370 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003371 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003372 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003373 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003374 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003375 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003376 Builder.defineMacro("__SSE2__");
3377 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003378 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003379 Builder.defineMacro("__SSE__");
3380 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003381 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003382 break;
3383 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003384
Derek Schuffc7dd7222012-10-11 15:52:22 +00003385 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003386 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003387 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003388 case AVX2:
3389 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003390 case SSE42:
3391 case SSE41:
3392 case SSSE3:
3393 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003394 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003395 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003396 break;
3397 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003398 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003399 break;
3400 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003401 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003402 }
3403 }
3404
Anders Carlssone437c682010-01-27 03:47:49 +00003405 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003406 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003407 case AMD3DNowAthlon:
3408 Builder.defineMacro("__3dNOW_A__");
3409 case AMD3DNow:
3410 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003411 case MMX:
3412 Builder.defineMacro("__MMX__");
3413 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003414 break;
3415 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003416
3417 if (CPU >= CK_i486) {
3418 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3419 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3420 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3421 }
3422 if (CPU >= CK_i586)
3423 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003424}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003425
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003426bool X86TargetInfo::hasFeature(StringRef Feature) const {
3427 return llvm::StringSwitch<bool>(Feature)
3428 .Case("aes", HasAES)
3429 .Case("avx", SSELevel >= AVX)
3430 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003431 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003432 .Case("avx512cd", HasAVX512CD)
3433 .Case("avx512er", HasAVX512ER)
3434 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003435 .Case("avx512dq", HasAVX512DQ)
3436 .Case("avx512bw", HasAVX512BW)
3437 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003438 .Case("bmi", HasBMI)
3439 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003440 .Case("cx16", HasCX16)
3441 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003442 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003443 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003444 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003445 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003446 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003447 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3448 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3449 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003450 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003451 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003452 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003453 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003454 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003455 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003456 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003457 .Case("sse", SSELevel >= SSE1)
3458 .Case("sse2", SSELevel >= SSE2)
3459 .Case("sse3", SSELevel >= SSE3)
3460 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003461 .Case("sse4.1", SSELevel >= SSE41)
3462 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003463 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003464 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003465 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003466 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3467 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003468 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003469 .Case("xsave", HasXSAVE)
3470 .Case("xsavec", HasXSAVEC)
3471 .Case("xsaves", HasXSAVES)
3472 .Case("xsaveopt", HasXSAVEOPT)
Asaf Badouha9d1e182015-12-31 14:14:07 +00003473 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003474 .Default(false);
3475}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003476
Eric Christopherd9832702015-06-29 21:00:05 +00003477// We can't use a generic validation scheme for the features accepted here
3478// versus subtarget features accepted in the target attribute because the
3479// bitfield structure that's initialized in the runtime only supports the
3480// below currently rather than the full range of subtarget features. (See
3481// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3482bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3483 return llvm::StringSwitch<bool>(FeatureStr)
3484 .Case("cmov", true)
3485 .Case("mmx", true)
3486 .Case("popcnt", true)
3487 .Case("sse", true)
3488 .Case("sse2", true)
3489 .Case("sse3", true)
3490 .Case("sse4.1", true)
3491 .Case("sse4.2", true)
3492 .Case("avx", true)
3493 .Case("avx2", true)
3494 .Case("sse4a", true)
3495 .Case("fma4", true)
3496 .Case("xop", true)
3497 .Case("fma", true)
3498 .Case("avx512f", true)
3499 .Case("bmi", true)
3500 .Case("bmi2", true)
3501 .Default(false);
3502}
3503
Eli Friedman3fd920a2008-08-20 02:34:37 +00003504bool
Anders Carlsson58436352009-02-28 17:11:49 +00003505X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003506 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003507 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003508 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003509 // Constant constraints.
3510 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3511 // instructions.
3512 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3513 // x86_64 instructions.
3514 case 's':
3515 Info.setRequiresImmediate();
3516 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003517 case 'I':
3518 Info.setRequiresImmediate(0, 31);
3519 return true;
3520 case 'J':
3521 Info.setRequiresImmediate(0, 63);
3522 return true;
3523 case 'K':
3524 Info.setRequiresImmediate(-128, 127);
3525 return true;
3526 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003527 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003528 return true;
3529 case 'M':
3530 Info.setRequiresImmediate(0, 3);
3531 return true;
3532 case 'N':
3533 Info.setRequiresImmediate(0, 255);
3534 return true;
3535 case 'O':
3536 Info.setRequiresImmediate(0, 127);
3537 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003538 // Register constraints.
3539 case 'Y': // 'Y' is the first character for several 2-character constraints.
3540 // Shift the pointer to the second character of the constraint.
3541 Name++;
3542 switch (*Name) {
3543 default:
3544 return false;
3545 case '0': // First SSE register.
3546 case 't': // Any SSE register, when SSE2 is enabled.
3547 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3548 case 'm': // Any MMX register, when inter-unit moves enabled.
3549 Info.setAllowsRegister();
3550 return true;
3551 }
3552 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003553 // Constraint 'f' cannot be used for output operands.
3554 if (Info.ConstraintStr[0] == '=')
3555 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003556 Info.setAllowsRegister();
3557 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003558 case 'a': // eax.
3559 case 'b': // ebx.
3560 case 'c': // ecx.
3561 case 'd': // edx.
3562 case 'S': // esi.
3563 case 'D': // edi.
3564 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003565 case 't': // Top of floating point stack.
3566 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003567 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003568 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003569 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003570 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003571 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3572 case 'l': // "Index" registers: any general register that can be used as an
3573 // index in a base+index memory access.
3574 Info.setAllowsRegister();
3575 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003576 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003577 case 'C': // SSE floating point constant.
3578 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003579 return true;
3580 }
3581}
3582
Akira Hatanaka974131e2014-09-18 18:17:18 +00003583bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3584 unsigned Size) const {
3585 // Strip off constraint modifiers.
3586 while (Constraint[0] == '=' ||
3587 Constraint[0] == '+' ||
3588 Constraint[0] == '&')
3589 Constraint = Constraint.substr(1);
3590
3591 return validateOperandSize(Constraint, Size);
3592}
3593
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003594bool X86TargetInfo::validateInputSize(StringRef Constraint,
3595 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003596 return validateOperandSize(Constraint, Size);
3597}
3598
3599bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3600 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003601 switch (Constraint[0]) {
3602 default: break;
3603 case 'y':
3604 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003605 case 'f':
3606 case 't':
3607 case 'u':
3608 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003609 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003610 if (SSELevel >= AVX512F)
3611 // 512-bit zmm registers can be used if target supports AVX512F.
3612 return Size <= 512U;
3613 else if (SSELevel >= AVX)
3614 // 256-bit ymm registers can be used if target supports AVX.
3615 return Size <= 256U;
3616 return Size <= 128U;
3617 case 'Y':
3618 // 'Y' is the first character for several 2-character constraints.
3619 switch (Constraint[1]) {
3620 default: break;
3621 case 'm':
3622 // 'Ym' is synonymous with 'y'.
3623 return Size <= 64;
3624 case 'i':
3625 case 't':
3626 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3627 if (SSELevel >= AVX512F)
3628 return Size <= 512U;
3629 else if (SSELevel >= AVX)
3630 return Size <= 256U;
3631 return SSELevel >= SSE2 && Size <= 128U;
3632 }
3633
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003634 }
3635
3636 return true;
3637}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003638
Eli Friedman3fd920a2008-08-20 02:34:37 +00003639std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003640X86TargetInfo::convertConstraint(const char *&Constraint) const {
3641 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003642 case 'a': return std::string("{ax}");
3643 case 'b': return std::string("{bx}");
3644 case 'c': return std::string("{cx}");
3645 case 'd': return std::string("{dx}");
3646 case 'S': return std::string("{si}");
3647 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003648 case 'p': // address
3649 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003650 case 't': // top of floating point stack.
3651 return std::string("{st}");
3652 case 'u': // second from top of floating point stack.
3653 return std::string("{st(1)}"); // second from top of floating point stack.
3654 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003655 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003656 }
3657}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003658
Eli Friedman3fd920a2008-08-20 02:34:37 +00003659// X86-32 generic target
3660class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003661public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003662 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003663 DoubleAlign = LongLongAlign = 32;
3664 LongDoubleWidth = 96;
3665 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003666 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003667 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003668 SizeType = UnsignedInt;
3669 PtrDiffType = SignedInt;
3670 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003671 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003672
3673 // Use fpret for all types.
3674 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3675 (1 << TargetInfo::Double) |
3676 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003677
3678 // x86-32 has atomics up to 8 bytes
3679 // FIXME: Check that we actually have cmpxchg8b before setting
3680 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3681 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003682 }
Craig Topper3164f332014-03-11 03:39:26 +00003683 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003684 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003685 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003686
Craig Topper3164f332014-03-11 03:39:26 +00003687 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003688 if (RegNo == 0) return 0;
3689 if (RegNo == 1) return 2;
3690 return -1;
3691 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003692 bool validateOperandSize(StringRef Constraint,
3693 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003694 switch (Constraint[0]) {
3695 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003696 case 'R':
3697 case 'q':
3698 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003699 case 'a':
3700 case 'b':
3701 case 'c':
3702 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003703 case 'S':
3704 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003705 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003706 case 'A':
3707 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003708 }
3709
Akira Hatanaka974131e2014-09-18 18:17:18 +00003710 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003711 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003712};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003713
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003714class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3715public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003716 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3717 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003718
Craig Topper3164f332014-03-11 03:39:26 +00003719 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003720 unsigned Major, Minor, Micro;
3721 getTriple().getOSVersion(Major, Minor, Micro);
3722 // New NetBSD uses the default rounding mode.
3723 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3724 return X86_32TargetInfo::getFloatEvalMethod();
3725 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003726 return 1;
3727 }
3728};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003729
Eli Friedmane3aa4542009-07-05 18:47:56 +00003730class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3731public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003732 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3733 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003734 SizeType = UnsignedLong;
3735 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003736 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003737 }
3738};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003739
Eli Friedman9fa28852012-08-08 23:57:20 +00003740class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3741public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003742 BitrigI386TargetInfo(const llvm::Triple &Triple)
3743 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003744 SizeType = UnsignedLong;
3745 IntPtrType = SignedLong;
3746 PtrDiffType = SignedLong;
3747 }
3748};
Eli Friedman9fa28852012-08-08 23:57:20 +00003749
Torok Edwinb2b37c62009-06-30 17:10:35 +00003750class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003751public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003752 DarwinI386TargetInfo(const llvm::Triple &Triple)
3753 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003754 LongDoubleWidth = 128;
3755 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003756 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00003757 MaxVectorAlign = 256;
3758 // The watchOS simulator uses the builtin bool type for Objective-C.
3759 llvm::Triple T = llvm::Triple(Triple);
3760 if (T.isWatchOS())
3761 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003762 SizeType = UnsignedLong;
3763 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003764 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003765 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003766 }
3767
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003768 bool handleTargetFeatures(std::vector<std::string> &Features,
3769 DiagnosticsEngine &Diags) override {
3770 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3771 Diags))
3772 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003773 // We now know the features we have: we can decide how to align vectors.
3774 MaxVectorAlign =
3775 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003776 return true;
3777 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003778};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003779
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003780// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003781class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003782public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003783 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3784 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003785 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003786 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003787 bool IsWinCOFF =
3788 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003789 DataLayoutString = IsWinCOFF
3790 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3791 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003792 }
Craig Topper3164f332014-03-11 03:39:26 +00003793 void getTargetDefines(const LangOptions &Opts,
3794 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003795 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3796 }
3797};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003798
3799// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003800class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003801public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003802 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003803 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003804 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003805 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3806 }
Craig Topper3164f332014-03-11 03:39:26 +00003807 void getTargetDefines(const LangOptions &Opts,
3808 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003809 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3810 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3811 // The value of the following reflects processor type.
3812 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3813 // We lost the original triple, so we use the default.
3814 Builder.defineMacro("_M_IX86", "600");
3815 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003816};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003817
David Majnemerae1ed0e2015-05-28 04:36:18 +00003818static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003819 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3820 // supports __declspec natively under -fms-extensions, but we define a no-op
3821 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003822 if (Opts.MicrosoftExt)
3823 Builder.defineMacro("__declspec", "__declspec");
3824 else
3825 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3826
3827 if (!Opts.MicrosoftExt) {
3828 // Provide macros for all the calling convention keywords. Provide both
3829 // single and double underscore prefixed variants. These are available on
3830 // x64 as well as x86, even though they have no effect.
3831 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3832 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003833 std::string GCCSpelling = "__attribute__((__";
3834 GCCSpelling += CC;
3835 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003836 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3837 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3838 }
3839 }
3840}
3841
David Majnemerae1ed0e2015-05-28 04:36:18 +00003842static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3843 Builder.defineMacro("__MSVCRT__");
3844 Builder.defineMacro("__MINGW32__");
3845 addCygMingDefines(Opts, Builder);
3846}
3847
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003848// x86-32 MinGW target
3849class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3850public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003851 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003852 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003853 void getTargetDefines(const LangOptions &Opts,
3854 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003855 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003856 DefineStd(Builder, "WIN32", Opts);
3857 DefineStd(Builder, "WINNT", Opts);
3858 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003859 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003860 }
3861};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003862
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003863// x86-32 Cygwin target
3864class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3865public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003866 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3867 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003868 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003869 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003870 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 +00003871 }
Craig Topper3164f332014-03-11 03:39:26 +00003872 void getTargetDefines(const LangOptions &Opts,
3873 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003874 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003875 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003876 Builder.defineMacro("__CYGWIN__");
3877 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003878 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003879 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003880 if (Opts.CPlusPlus)
3881 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003882 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003883};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003884
Chris Lattnerb986aba2010-04-11 19:29:39 +00003885// x86-32 Haiku target
3886class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3887public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003888 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003889 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003890 IntPtrType = SignedLong;
3891 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003892 ProcessIDType = SignedLong;
James Y Knighta3518ad2016-01-27 01:04:51 +00003893 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003894 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003895 }
Craig Topper3164f332014-03-11 03:39:26 +00003896 void getTargetDefines(const LangOptions &Opts,
3897 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003898 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3899 Builder.defineMacro("__INTEL__");
3900 Builder.defineMacro("__HAIKU__");
3901 }
3902};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003903
Alexey Bataevc99b0492015-11-25 09:24:26 +00003904// X86-32 MCU target
3905class MCUX86_32TargetInfo : public X86_32TargetInfo {
3906public:
3907 MCUX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3908 LongDoubleWidth = 64;
3909 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Andrey Bokhanko4f8867f2016-01-14 10:59:36 +00003910 UserLabelPrefix = "";
Alexey Bataevc99b0492015-11-25 09:24:26 +00003911 }
3912
3913 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3914 // On MCU we support only C calling convention.
3915 return CC == CC_C ? CCCR_OK : CCCR_Warning;
3916 }
3917
3918 void getTargetDefines(const LangOptions &Opts,
3919 MacroBuilder &Builder) const override {
3920 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3921 Builder.defineMacro("__iamcu");
3922 Builder.defineMacro("__iamcu__");
3923 }
3924};
3925
Douglas Gregor9fabd852011-07-01 22:41:14 +00003926// RTEMS Target
3927template<typename Target>
3928class RTEMSTargetInfo : public OSTargetInfo<Target> {
3929protected:
Craig Topper3164f332014-03-11 03:39:26 +00003930 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3931 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003932 // RTEMS defines; list based off of gcc output
3933
Douglas Gregor9fabd852011-07-01 22:41:14 +00003934 Builder.defineMacro("__rtems__");
3935 Builder.defineMacro("__ELF__");
3936 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003937
Douglas Gregor9fabd852011-07-01 22:41:14 +00003938public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003939 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +00003940 this->UserLabelPrefix = "";
3941
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003942 switch (Triple.getArch()) {
3943 default:
3944 case llvm::Triple::x86:
3945 // this->MCountName = ".mcount";
3946 break;
3947 case llvm::Triple::mips:
3948 case llvm::Triple::mipsel:
3949 case llvm::Triple::ppc:
3950 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003951 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003952 // this->MCountName = "_mcount";
3953 break;
3954 case llvm::Triple::arm:
3955 // this->MCountName = "__mcount";
3956 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003957 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003958 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003959};
3960
Douglas Gregor9fabd852011-07-01 22:41:14 +00003961// x86-32 RTEMS target
3962class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3963public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003964 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003965 SizeType = UnsignedLong;
3966 IntPtrType = SignedLong;
3967 PtrDiffType = SignedLong;
James Y Knighta3518ad2016-01-27 01:04:51 +00003968 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003969 }
Craig Topper3164f332014-03-11 03:39:26 +00003970 void getTargetDefines(const LangOptions &Opts,
3971 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003972 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3973 Builder.defineMacro("__INTEL__");
3974 Builder.defineMacro("__rtems__");
3975 }
3976};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003977
Eli Friedman3fd920a2008-08-20 02:34:37 +00003978// x86-64 generic target
3979class X86_64TargetInfo : public X86TargetInfo {
3980public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003981 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003982 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003983 bool IsWinCOFF =
3984 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003985 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003986 LongDoubleWidth = 128;
3987 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003988 LargeArrayMinWidth = 128;
3989 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003990 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00003991 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3992 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3993 IntPtrType = IsX32 ? SignedInt : SignedLong;
3994 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00003995 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003996 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00003997
Eric Christopher917e9522014-11-18 22:36:15 +00003998 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00003999 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4000 : IsWinCOFF
4001 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4002 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004003
4004 // Use fpret only for long double.
4005 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004006
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004007 // Use fp2ret for _Complex long double.
4008 ComplexLongDoubleUsesFP2Ret = true;
4009
Charles Davisc7d5c942015-09-17 20:55:33 +00004010 // Make __builtin_ms_va_list available.
4011 HasBuiltinMSVaList = true;
4012
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004013 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004014 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004015 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004016 }
Craig Topper3164f332014-03-11 03:39:26 +00004017 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004018 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004019 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004020
Craig Topper3164f332014-03-11 03:39:26 +00004021 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004022 if (RegNo == 0) return 0;
4023 if (RegNo == 1) return 1;
4024 return -1;
4025 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004026
Craig Topper3164f332014-03-11 03:39:26 +00004027 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00004028 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00004029 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00004030 CC == CC_IntelOclBicc ||
4031 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004032 }
4033
Craig Topper3164f332014-03-11 03:39:26 +00004034 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004035 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004036 }
4037
Pavel Chupinfd223e12014-08-04 12:39:43 +00004038 // for x32 we need it here explicitly
4039 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004040 unsigned getUnwindWordWidth() const override { return 64; }
4041 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004042
4043 bool validateGlobalRegisterVariable(StringRef RegName,
4044 unsigned RegSize,
4045 bool &HasSizeMismatch) const override {
4046 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4047 // handle.
4048 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4049 // Check that the register size is 64-bit.
4050 HasSizeMismatch = RegSize != 64;
4051 return true;
4052 }
4053
4054 // Check if the register is a 32-bit register the backend can handle.
4055 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4056 HasSizeMismatch);
4057 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004058};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004059
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004060// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004061class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004062public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004063 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
4064 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004065 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004066 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004067 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004068 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004069 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004070 SizeType = UnsignedLongLong;
4071 PtrDiffType = SignedLongLong;
4072 IntPtrType = SignedLongLong;
James Y Knighta3518ad2016-01-27 01:04:51 +00004073 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004074 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004075
Craig Topper3164f332014-03-11 03:39:26 +00004076 void getTargetDefines(const LangOptions &Opts,
4077 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004078 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004079 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004080 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004081
Craig Topper3164f332014-03-11 03:39:26 +00004082 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004083 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004084 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004085
Craig Topper3164f332014-03-11 03:39:26 +00004086 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004087 switch (CC) {
4088 case CC_X86StdCall:
4089 case CC_X86ThisCall:
4090 case CC_X86FastCall:
4091 return CCCR_Ignore;
4092 case CC_C:
4093 case CC_X86VectorCall:
4094 case CC_IntelOclBicc:
4095 case CC_X86_64SysV:
4096 return CCCR_OK;
4097 default:
4098 return CCCR_Warning;
4099 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004100 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004101};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004102
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004103// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004104class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004105public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004106 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004107 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00004108 LongDoubleWidth = LongDoubleAlign = 64;
4109 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004110 }
Craig Topper3164f332014-03-11 03:39:26 +00004111 void getTargetDefines(const LangOptions &Opts,
4112 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004113 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4114 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004115 Builder.defineMacro("_M_X64", "100");
4116 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004117 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004118};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004119
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004120// x86-64 MinGW target
4121class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4122public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004123 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Reid Kleckner11a17192015-10-28 22:29:52 +00004124 : WindowsX86_64TargetInfo(Triple) {
4125 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4126 // with x86 FP ops. Weird.
4127 LongDoubleWidth = LongDoubleAlign = 128;
4128 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4129 }
4130
Craig Topper3164f332014-03-11 03:39:26 +00004131 void getTargetDefines(const LangOptions &Opts,
4132 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004133 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004134 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004135 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004136 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004137
4138 // GCC defines this macro when it is using __gxx_personality_seh0.
4139 if (!Opts.SjLjExceptions)
4140 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004141 }
4142};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004143
Yaron Kerend030d112015-07-22 17:38:19 +00004144// x86-64 Cygwin target
4145class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4146public:
4147 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4148 : X86_64TargetInfo(Triple) {
4149 TLSSupported = false;
4150 WCharType = UnsignedShort;
4151 }
4152 void getTargetDefines(const LangOptions &Opts,
4153 MacroBuilder &Builder) const override {
4154 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4155 Builder.defineMacro("__x86_64__");
4156 Builder.defineMacro("__CYGWIN__");
4157 Builder.defineMacro("__CYGWIN64__");
4158 addCygMingDefines(Opts, Builder);
4159 DefineStd(Builder, "unix", Opts);
4160 if (Opts.CPlusPlus)
4161 Builder.defineMacro("_GNU_SOURCE");
4162
4163 // GCC defines this macro when it is using __gxx_personality_seh0.
4164 if (!Opts.SjLjExceptions)
4165 Builder.defineMacro("__SEH__");
4166 }
4167};
4168
Eli Friedman2857ccb2009-07-01 03:36:11 +00004169class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4170public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004171 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4172 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004173 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004174 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4175 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004176 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004177 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004178 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004179 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004180
4181 bool handleTargetFeatures(std::vector<std::string> &Features,
4182 DiagnosticsEngine &Diags) override {
4183 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4184 Diags))
4185 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004186 // We now know the features we have: we can decide how to align vectors.
4187 MaxVectorAlign =
4188 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004189 return true;
4190 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004191};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004192
Eli Friedman245f2292009-07-05 22:31:18 +00004193class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4194public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004195 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4196 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004197 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004198 Int64Type = SignedLongLong;
4199 }
4200};
Eli Friedman245f2292009-07-05 22:31:18 +00004201
Eli Friedman9fa28852012-08-08 23:57:20 +00004202class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4203public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004204 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4205 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4206 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004207 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004208 }
4209};
Tim Northover9bb857a2013-01-31 12:13:10 +00004210
Eli Friedmanf05b7722008-08-20 07:44:10 +00004211class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004212 // Possible FPU choices.
4213 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004214 VFP2FPU = (1 << 0),
4215 VFP3FPU = (1 << 1),
4216 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004217 NeonFPU = (1 << 3),
4218 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004219 };
4220
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004221 // Possible HWDiv features.
4222 enum HWDivMode {
4223 HWDivThumb = (1 << 0),
4224 HWDivARM = (1 << 1)
4225 };
4226
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004227 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004228 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004229 }
4230
4231 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4232 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004233
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004234 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004235
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004236 StringRef CPUProfile;
4237 StringRef CPUAttr;
4238
Rafael Espindolaeb265472013-08-21 21:59:03 +00004239 enum {
4240 FP_Default,
4241 FP_VFP,
4242 FP_Neon
4243 } FPMath;
4244
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004245 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004246 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004247 unsigned ArchProfile;
4248 unsigned ArchVersion;
4249
Bernard Ogdenda13af32013-10-24 18:32:51 +00004250 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004251
Logan Chien57086ce2012-10-10 06:56:20 +00004252 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004253 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004254
4255 // Initialized via features.
4256 unsigned SoftFloat : 1;
4257 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004258
Bernard Ogden18b57012013-10-29 09:47:51 +00004259 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004260 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004261 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004262 unsigned Unaligned : 1;
4263
4264 enum {
4265 LDREX_B = (1 << 0), /// byte (8-bit)
4266 LDREX_H = (1 << 1), /// half (16-bit)
4267 LDREX_W = (1 << 2), /// word (32-bit)
4268 LDREX_D = (1 << 3), /// double (64-bit)
4269 };
4270
4271 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004272
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004273 // ACLE 6.5.1 Hardware floating point
4274 enum {
4275 HW_FP_HP = (1 << 1), /// half (16-bit)
4276 HW_FP_SP = (1 << 2), /// single (32-bit)
4277 HW_FP_DP = (1 << 3), /// double (64-bit)
4278 };
4279 uint32_t HW_FP;
4280
Chris Lattner5cc15e02010-03-03 19:03:45 +00004281 static const Builtin::Info BuiltinInfo[];
4282
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004283 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004284 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004285
4286 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004287 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004288
Renato Golin9ba39232015-02-27 16:35:48 +00004289 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4290 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4291 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004292 SizeType = UnsignedLong;
4293 else
4294 SizeType = UnsignedInt;
4295
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004296 switch (T.getOS()) {
4297 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004298 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004299 break;
4300 case llvm::Triple::Win32:
4301 WCharType = UnsignedShort;
4302 break;
4303 case llvm::Triple::Linux:
4304 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004305 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4306 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004307 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004308 }
4309
4310 UseBitFieldTypeAlignment = true;
4311
4312 ZeroLengthBitfieldBoundary = 0;
4313
Tim Northover147cd2f2014-10-14 22:12:21 +00004314 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4315 // so set preferred for small types to 32.
4316 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004317 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004318 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4319 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4320 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004321 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004322 DataLayoutString = "e"
4323 "-m:w"
4324 "-p:32:32"
4325 "-i64:64"
4326 "-v128:64:128"
4327 "-a:0:32"
4328 "-n32"
4329 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004330 } else if (T.isOSNaCl()) {
4331 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004332 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004333 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004334 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004335 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4336 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004337 }
4338
4339 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004340 }
4341
Tim Northover5627d392015-10-30 16:30:45 +00004342 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004343 const llvm::Triple &T = getTriple();
4344
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004345 IsAAPCS = false;
4346
Tim Northover5627d392015-10-30 16:30:45 +00004347 if (IsAAPCS16)
4348 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4349 else
4350 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004351
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004352 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004353 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004354 SizeType = UnsignedInt;
4355 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004356 SizeType = UnsignedLong;
4357
4358 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4359 WCharType = SignedInt;
4360
4361 // Do not respect the alignment of bit-field types when laying out
4362 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4363 UseBitFieldTypeAlignment = false;
4364
4365 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4366 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4367 /// gcc.
4368 ZeroLengthBitfieldBoundary = 32;
4369
Tim Northover5627d392015-10-30 16:30:45 +00004370 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4371 assert(!BigEndian && "AAPCS16 does not support big-endian");
4372 DataLayoutString = "e-m:o-p:32:32-i64:64-a:0:32-n32-S128";
4373 } else if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004374 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004375 BigEndian
4376 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4377 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4378 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004379 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004380 BigEndian
4381 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4382 : "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 +00004383
4384 // FIXME: Override "preferred align" for double and long long.
4385 }
4386
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004387 void setArchInfo() {
4388 StringRef ArchName = getTriple().getArchName();
4389
Renato Goline84b0002015-10-08 16:43:26 +00004390 ArchISA = llvm::ARM::parseArchISA(ArchName);
4391 CPU = llvm::ARM::getDefaultCPU(ArchName);
4392 unsigned AK = llvm::ARM::parseArch(ArchName);
4393 if (AK != llvm::ARM::AK_INVALID)
4394 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004395 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004396 }
4397
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004398 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004399 StringRef SubArch;
4400
4401 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004402 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004403 SubArch = llvm::ARM::getSubArch(ArchKind);
4404 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4405 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004406
4407 // cache CPU related strings
4408 CPUAttr = getCPUAttr();
4409 CPUProfile = getCPUProfile();
4410 }
4411
4412 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004413 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004414 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004415 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004416 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4417 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004418 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004419 if (ArchProfile == llvm::ARM::PK_M) {
4420 MaxAtomicPromoteWidth = 32;
4421 if (ShouldUseInlineAtomic)
4422 MaxAtomicInlineWidth = 32;
4423 }
4424 else {
4425 MaxAtomicPromoteWidth = 64;
4426 if (ShouldUseInlineAtomic)
4427 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004428 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004429 }
4430
4431 bool isThumb() const {
4432 return (ArchISA == llvm::ARM::IK_THUMB);
4433 }
4434
4435 bool supportsThumb() const {
4436 return CPUAttr.count('T') || ArchVersion >= 6;
4437 }
4438
4439 bool supportsThumb2() const {
4440 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4441 }
4442
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004443 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004444 // For most sub-arches, the build attribute CPU name is enough.
4445 // For Cortex variants, it's slightly different.
4446 switch(ArchKind) {
4447 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004448 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004449 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004450 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004451 case llvm::ARM::AK_ARMV7S:
4452 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004453 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004454 return "7A";
4455 case llvm::ARM::AK_ARMV7R:
4456 return "7R";
4457 case llvm::ARM::AK_ARMV7M:
4458 return "7M";
4459 case llvm::ARM::AK_ARMV7EM:
4460 return "7EM";
4461 case llvm::ARM::AK_ARMV8A:
4462 return "8A";
4463 case llvm::ARM::AK_ARMV8_1A:
4464 return "8_1A";
4465 }
4466 }
4467
4468 StringRef getCPUProfile() const {
4469 switch(ArchProfile) {
4470 case llvm::ARM::PK_A:
4471 return "A";
4472 case llvm::ARM::PK_R:
4473 return "R";
4474 case llvm::ARM::PK_M:
4475 return "M";
4476 default:
4477 return "";
4478 }
4479 }
4480
Chris Lattner17df24e2008-04-21 18:56:49 +00004481public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004482 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004483 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004484 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004485 BigEndian = IsBigEndian;
4486
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004487 switch (getTriple().getOS()) {
4488 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004489 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004490 break;
4491 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004492 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004493 break;
4494 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004495
Renato Goline84b0002015-10-08 16:43:26 +00004496 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004497 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004498
Chris Lattner1a8f3942010-04-23 16:29:58 +00004499 // {} in inline assembly are neon specifiers, not assembly variant
4500 // specifiers.
4501 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004502
Eric Christopher0e261882014-12-05 01:06:59 +00004503 // FIXME: This duplicates code from the driver that sets the -target-abi
4504 // option - this code is used if -target-abi isn't passed and should
4505 // be unified in some way.
4506 if (Triple.isOSBinFormatMachO()) {
4507 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4508 // the frontend matches that.
4509 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4510 Triple.getOS() == llvm::Triple::UnknownOS ||
4511 StringRef(CPU).startswith("cortex-m")) {
4512 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004513 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004514 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004515 } else {
4516 setABI("apcs-gnu");
4517 }
4518 } else if (Triple.isOSWindows()) {
4519 // FIXME: this is invalid for WindowsCE
4520 setABI("aapcs");
4521 } else {
4522 // Select the default based on the platform.
4523 switch (Triple.getEnvironment()) {
4524 case llvm::Triple::Android:
4525 case llvm::Triple::GNUEABI:
4526 case llvm::Triple::GNUEABIHF:
4527 setABI("aapcs-linux");
4528 break;
4529 case llvm::Triple::EABIHF:
4530 case llvm::Triple::EABI:
4531 setABI("aapcs");
4532 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004533 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004534 setABI("apcs-gnu");
4535 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004536 default:
4537 if (Triple.getOS() == llvm::Triple::NetBSD)
4538 setABI("apcs-gnu");
4539 else
4540 setABI("aapcs");
4541 break;
4542 }
4543 }
John McCall86353412010-08-21 22:46:04 +00004544
4545 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004546 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004547
Renato Golin15b86152015-07-03 16:41:13 +00004548 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004549 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004550
James Molloya7139222012-03-12 09:14:10 +00004551 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004552 // the alignment of the zero-length bitfield is greater than the member
4553 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004554 // zero length bitfield.
4555 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004556 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004557
Alp Toker4925ba72014-06-07 23:30:42 +00004558 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004559
Craig Topper3164f332014-03-11 03:39:26 +00004560 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004561 ABI = Name;
4562
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004563 // The defaults (above) are for AAPCS, check if we need to change them.
4564 //
4565 // FIXME: We need support for -meabi... we could just mangle it into the
4566 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004567 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004568 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004569 return true;
4570 }
4571 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4572 setABIAAPCS();
4573 return true;
4574 }
4575 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004576 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004577
Renato Golinf5c4dec2015-05-27 13:33:00 +00004578 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004579 bool
4580 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4581 StringRef CPU,
4582 const std::vector<std::string> &FeaturesVec) const override {
4583
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004584 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004585 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004586
4587 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004588 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004589 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4590
4591 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004592 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004593 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4594
4595 for (const char *Feature : TargetFeatures)
4596 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004597 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004598
Eric Christopher007b0a02015-08-28 22:32:01 +00004599 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004600 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004601
Craig Topper3164f332014-03-11 03:39:26 +00004602 bool handleTargetFeatures(std::vector<std::string> &Features,
4603 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004604 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004605 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004606 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004607 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004608 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004609 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004610 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004611
Ranjeet Singhac08e532015-06-24 23:39:25 +00004612 // This does not diagnose illegal cases like having both
4613 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4614 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004615 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004616 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004617 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004618 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004619 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004620 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004621 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004622 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004623 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004624 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004625 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004626 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004627 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004628 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004629 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004630 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004631 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004632 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004633 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004634 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004635 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004636 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004637 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004638 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004639 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004640 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004641 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004642 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004643 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004644 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004645 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004646 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004647 } else if (Feature == "+strict-align") {
4648 Unaligned = 0;
4649 } else if (Feature == "+fp16") {
4650 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004651 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004652 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004653 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004654
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004655 switch (ArchVersion) {
4656 case 6:
4657 if (ArchProfile == llvm::ARM::PK_M)
4658 LDREX = 0;
4659 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4660 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4661 else
4662 LDREX = LDREX_W;
4663 break;
4664 case 7:
4665 if (ArchProfile == llvm::ARM::PK_M)
4666 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4667 else
4668 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4669 break;
4670 case 8:
4671 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4672 }
4673
Rafael Espindolaeb265472013-08-21 21:59:03 +00004674 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4675 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4676 return false;
4677 }
4678
4679 if (FPMath == FP_Neon)
4680 Features.push_back("+neonfp");
4681 else if (FPMath == FP_VFP)
4682 Features.push_back("-neonfp");
4683
Daniel Dunbar893d4752009-12-19 04:15:38 +00004684 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004685 auto Feature =
4686 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4687 if (Feature != Features.end())
4688 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004689
Rafael Espindolaeb265472013-08-21 21:59:03 +00004690 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004691 }
4692
Craig Topper3164f332014-03-11 03:39:26 +00004693 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004694 return llvm::StringSwitch<bool>(Feature)
4695 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004696 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004697 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004698 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004699 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004700 .Case("hwdiv", HWDiv & HWDivThumb)
4701 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004702 .Default(false);
4703 }
Renato Golin15b86152015-07-03 16:41:13 +00004704
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004705 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004706 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004707 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004708
Renato Golin15b86152015-07-03 16:41:13 +00004709 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004710 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004711 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004712 CPU = Name;
4713 return true;
4714 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004715
Craig Topper3164f332014-03-11 03:39:26 +00004716 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004717
Craig Topper3164f332014-03-11 03:39:26 +00004718 void getTargetDefines(const LangOptions &Opts,
4719 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004720 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004721 Builder.defineMacro("__arm");
4722 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004723
Chris Lattnerecd49032009-03-02 22:27:17 +00004724 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004725 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00004726
4727 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
4728 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00004729 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00004730 Builder.defineMacro("__ARM_ARCH_7K__", "2");
4731
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004732 if (!CPUAttr.empty())
4733 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004734
4735 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004736 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00004737 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004738
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004739 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004740 // ACLE 6.5.7 Crypto Extension
4741 if (Crypto)
4742 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4743 // ACLE 6.5.8 CRC32 Extension
4744 if (CRC)
4745 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4746 // ACLE 6.5.10 Numeric Maximum and Minimum
4747 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4748 // ACLE 6.5.9 Directed Rounding
4749 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004750 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004751
4752 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4753 // is not defined for the M-profile.
4754 // NOTE that the deffault profile is assumed to be 'A'
4755 if (CPUProfile.empty() || CPUProfile != "M")
4756 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4757
4758 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4759 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4760 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004761 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004762 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004763 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004764 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4765
4766 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4767 // instruction set such as ARM or Thumb.
4768 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4769
4770 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4771
4772 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004773 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004774 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004775
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004776 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004777 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004778 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004779
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004780 // ACLE 6.4.4 LDREX/STREX
4781 if (LDREX)
4782 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4783
4784 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004785 if (ArchVersion == 5 ||
4786 (ArchVersion == 6 && CPUProfile != "M") ||
4787 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004788 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4789
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004790 // ACLE 6.5.1 Hardware Floating Point
4791 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004792 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004793
Yi Konga44c4d72014-06-27 21:25:42 +00004794 // ACLE predefines.
4795 Builder.defineMacro("__ARM_ACLE", "200");
4796
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004797 // FP16 support (we currently only support IEEE format).
4798 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4799 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4800
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004801 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4802 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4803 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4804
Mike Stump9d54bd72009-04-08 02:07:04 +00004805 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004806
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004807 // FIXME: It's more complicated than this and we don't really support
4808 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004809 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004810 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004811 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004812
David Tweed8f676532012-10-25 13:33:01 +00004813 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004814 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004815 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4816 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004817 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004818 Builder.defineMacro("__ARM_PCS", "1");
4819
David Tweed8f676532012-10-25 13:33:01 +00004820 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004821 Builder.defineMacro("__ARM_PCS_VFP", "1");
4822 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004823
Daniel Dunbar893d4752009-12-19 04:15:38 +00004824 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004825 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004826
4827 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004828 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004829
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004830 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004831 Builder.defineMacro("__THUMBEL__");
4832 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004833 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004834 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004835 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004836
4837 // ACLE 6.4.9 32-bit SIMD instructions
4838 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4839 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4840
4841 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004842 if (((HWDiv & HWDivThumb) && isThumb()) ||
4843 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004844 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004845 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004846 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004847
4848 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004849 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004850
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004851 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004852 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004853 if (FPU & VFP2FPU)
4854 Builder.defineMacro("__ARM_VFPV2__");
4855 if (FPU & VFP3FPU)
4856 Builder.defineMacro("__ARM_VFPV3__");
4857 if (FPU & VFP4FPU)
4858 Builder.defineMacro("__ARM_VFPV4__");
4859 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004860
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004861 // This only gets set when Neon instructions are actually available, unlike
4862 // the VFP define, hence the soft float and arch check. This is subtly
4863 // different from gcc, we follow the intent which was that it should be set
4864 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004865 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004866 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004867 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004868 // current AArch32 NEON implementations do not support double-precision
4869 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004870 Builder.defineMacro("__ARM_NEON_FP",
4871 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004872 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004873
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004874 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4875 Opts.ShortWChar ? "2" : "4");
4876
4877 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4878 Opts.ShortEnums ? "1" : "4");
4879
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004880 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004881 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4882 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4883 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4884 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4885 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004886
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004887 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004888 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004889 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004890 }
4891
4892 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004893 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004894 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4895 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004896 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004897 }
4898
4899 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004900 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004901 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004902
4903 if (Opts.UnsafeFPMath)
4904 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00004905
4906 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
4907 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004908 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004909
Craig Topper6c03a542015-10-19 04:51:35 +00004910 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4911 return llvm::makeArrayRef(BuiltinInfo,
4912 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00004913 }
Craig Topper3164f332014-03-11 03:39:26 +00004914 bool isCLZForZeroUndef() const override { return false; }
4915 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00004916 return IsAAPCS
4917 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00004918 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
4919 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00004920 }
Craig Topperf054e3a2015-10-19 03:52:27 +00004921 ArrayRef<const char *> getGCCRegNames() const override;
4922 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00004923 bool validateAsmConstraint(const char *&Name,
4924 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004925 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004926 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004927 case 'l': // r0-r7
4928 case 'h': // r8-r15
4929 case 'w': // VFP Floating point register single precision
4930 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004931 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004932 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004933 case 'I':
4934 case 'J':
4935 case 'K':
4936 case 'L':
4937 case 'M':
4938 // FIXME
4939 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004940 case 'Q': // A memory address that is a single base register.
4941 Info.setAllowsMemory();
4942 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004943 case 'U': // a memory reference...
4944 switch (Name[1]) {
4945 case 'q': // ...ARMV4 ldrsb
4946 case 'v': // ...VFP load/store (reg+constant offset)
4947 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004948 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004949 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004950 case 'n': // valid address for Neon doubleword vector load/store
4951 case 'm': // valid address for Neon element and structure load/store
4952 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004953 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004954 Info.setAllowsMemory();
4955 Name++;
4956 return true;
4957 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004958 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004959 return false;
4960 }
Craig Topper3164f332014-03-11 03:39:26 +00004961 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004962 std::string R;
4963 switch (*Constraint) {
4964 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004965 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004966 Constraint++;
4967 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004968 case 'p': // 'p' should be translated to 'r' by default.
4969 R = std::string("r");
4970 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004971 default:
4972 return std::string(1, *Constraint);
4973 }
4974 return R;
4975 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004976 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004977 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004978 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004979 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004980 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004981
Bill Wendling9d1ee112012-10-25 23:28:48 +00004982 // Strip off constraint modifiers.
4983 while (Constraint[0] == '=' ||
4984 Constraint[0] == '+' ||
4985 Constraint[0] == '&')
4986 Constraint = Constraint.substr(1);
4987
4988 switch (Constraint[0]) {
4989 default: break;
4990 case 'r': {
4991 switch (Modifier) {
4992 default:
Tim Northover8f24b172013-12-08 15:24:55 +00004993 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00004994 case 'q':
4995 // A register of size 32 cannot fit a vector type.
4996 return false;
4997 }
4998 }
4999 }
5000
5001 return true;
5002 }
Craig Topper3164f332014-03-11 03:39:26 +00005003 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005004 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005005 return "";
5006 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005007
Craig Topper3164f332014-03-11 03:39:26 +00005008 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005009 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
5010 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005011
Craig Topper3164f332014-03-11 03:39:26 +00005012 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005013 if (RegNo == 0) return 0;
5014 if (RegNo == 1) return 1;
5015 return -1;
5016 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005017
5018 bool hasSjLjLowering() const override {
5019 return true;
5020 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005021};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005022
Rafael Espindolaeb265472013-08-21 21:59:03 +00005023bool ARMTargetInfo::setFPMath(StringRef Name) {
5024 if (Name == "neon") {
5025 FPMath = FP_Neon;
5026 return true;
5027 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5028 Name == "vfp4") {
5029 FPMath = FP_VFP;
5030 return true;
5031 }
5032 return false;
5033}
5034
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005035const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005036 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005037 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005038 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5039
5040 // Float registers
5041 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5042 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5043 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005044 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005045
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005046 // Double registers
5047 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5048 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005049 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5050 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005051
5052 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005053 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5054 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005055};
5056
Craig Topperf054e3a2015-10-19 03:52:27 +00005057ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5058 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005059}
5060
5061const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005062 { { "a1" }, "r0" },
5063 { { "a2" }, "r1" },
5064 { { "a3" }, "r2" },
5065 { { "a4" }, "r3" },
5066 { { "v1" }, "r4" },
5067 { { "v2" }, "r5" },
5068 { { "v3" }, "r6" },
5069 { { "v4" }, "r7" },
5070 { { "v5" }, "r8" },
5071 { { "v6", "rfp" }, "r9" },
5072 { { "sl" }, "r10" },
5073 { { "fp" }, "r11" },
5074 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005075 { { "r13" }, "sp" },
5076 { { "r14" }, "lr" },
5077 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005078 // The S, D and Q registers overlap, but aren't really aliases; we
5079 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005080};
5081
Craig Topperf054e3a2015-10-19 03:52:27 +00005082ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5083 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005084}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005085
5086const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005087#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005088 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005089#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5090 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005091#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005092
Craig Topper07d3b622015-08-07 05:14:44 +00005093#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005094 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005095#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005096 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005097#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5098 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005099#include "clang/Basic/BuiltinsARM.def"
5100};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005101
5102class ARMleTargetInfo : public ARMTargetInfo {
5103public:
5104 ARMleTargetInfo(const llvm::Triple &Triple)
5105 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005106 void getTargetDefines(const LangOptions &Opts,
5107 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005108 Builder.defineMacro("__ARMEL__");
5109 ARMTargetInfo::getTargetDefines(Opts, Builder);
5110 }
5111};
5112
5113class ARMbeTargetInfo : public ARMTargetInfo {
5114public:
5115 ARMbeTargetInfo(const llvm::Triple &Triple)
5116 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005117 void getTargetDefines(const LangOptions &Opts,
5118 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005119 Builder.defineMacro("__ARMEB__");
5120 Builder.defineMacro("__ARM_BIG_ENDIAN");
5121 ARMTargetInfo::getTargetDefines(Opts, Builder);
5122 }
5123};
Chris Lattner17df24e2008-04-21 18:56:49 +00005124
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005125class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5126 const llvm::Triple Triple;
5127public:
5128 WindowsARMTargetInfo(const llvm::Triple &Triple)
5129 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005130 WCharType = UnsignedShort;
5131 SizeType = UnsignedInt;
James Y Knighta3518ad2016-01-27 01:04:51 +00005132 UserLabelPrefix = "";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005133 }
5134 void getVisualStudioDefines(const LangOptions &Opts,
5135 MacroBuilder &Builder) const {
5136 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5137
5138 // FIXME: this is invalid for WindowsCE
5139 Builder.defineMacro("_M_ARM_NT", "1");
5140 Builder.defineMacro("_M_ARMT", "_M_ARM");
5141 Builder.defineMacro("_M_THUMB", "_M_ARM");
5142
5143 assert((Triple.getArch() == llvm::Triple::arm ||
5144 Triple.getArch() == llvm::Triple::thumb) &&
5145 "invalid architecture for Windows ARM target info");
5146 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5147 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5148
5149 // TODO map the complete set of values
5150 // 31: VFPv3 40: VFPv4
5151 Builder.defineMacro("_M_ARM_FP", "31");
5152 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005153 BuiltinVaListKind getBuiltinVaListKind() const override {
5154 return TargetInfo::CharPtrBuiltinVaList;
5155 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005156 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5157 switch (CC) {
5158 case CC_X86StdCall:
5159 case CC_X86ThisCall:
5160 case CC_X86FastCall:
5161 case CC_X86VectorCall:
5162 return CCCR_Ignore;
5163 case CC_C:
5164 return CCCR_OK;
5165 default:
5166 return CCCR_Warning;
5167 }
5168 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005169};
5170
5171// Windows ARM + Itanium C++ ABI Target
5172class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5173public:
5174 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5175 : WindowsARMTargetInfo(Triple) {
5176 TheCXXABI.set(TargetCXXABI::GenericARM);
5177 }
5178
5179 void getTargetDefines(const LangOptions &Opts,
5180 MacroBuilder &Builder) const override {
5181 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5182
5183 if (Opts.MSVCCompat)
5184 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5185 }
5186};
5187
5188// Windows ARM, MS (C++) ABI
5189class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5190public:
5191 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5192 : WindowsARMTargetInfo(Triple) {
5193 TheCXXABI.set(TargetCXXABI::Microsoft);
5194 }
5195
5196 void getTargetDefines(const LangOptions &Opts,
5197 MacroBuilder &Builder) const override {
5198 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5199 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5200 }
5201};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005202
Yaron Keren321249c2015-07-15 13:32:23 +00005203// ARM MinGW target
5204class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5205public:
5206 MinGWARMTargetInfo(const llvm::Triple &Triple)
5207 : WindowsARMTargetInfo(Triple) {
5208 TheCXXABI.set(TargetCXXABI::GenericARM);
5209 }
5210
5211 void getTargetDefines(const LangOptions &Opts,
5212 MacroBuilder &Builder) const override {
5213 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5214 DefineStd(Builder, "WIN32", Opts);
5215 DefineStd(Builder, "WINNT", Opts);
5216 Builder.defineMacro("_ARM_");
5217 addMinGWDefines(Opts, Builder);
5218 }
5219};
5220
5221// ARM Cygwin target
5222class CygwinARMTargetInfo : public ARMleTargetInfo {
5223public:
5224 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5225 TLSSupported = false;
5226 WCharType = UnsignedShort;
5227 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005228 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005229 }
5230 void getTargetDefines(const LangOptions &Opts,
5231 MacroBuilder &Builder) const override {
5232 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5233 Builder.defineMacro("_ARM_");
5234 Builder.defineMacro("__CYGWIN__");
5235 Builder.defineMacro("__CYGWIN32__");
5236 DefineStd(Builder, "unix", Opts);
5237 if (Opts.CPlusPlus)
5238 Builder.defineMacro("_GNU_SOURCE");
5239 }
5240};
5241
Mike Stump11289f42009-09-09 15:08:12 +00005242class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005243 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005244protected:
Craig Topper3164f332014-03-11 03:39:26 +00005245 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5246 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005247 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005248 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005249
Torok Edwinb2b37c62009-06-30 17:10:35 +00005250public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005251 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005252 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005253 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005254 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005255 // FIXME: This should be based off of the target features in
5256 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005257 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005258
Tim Northoverd88ecb32016-01-27 19:32:40 +00005259 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005260 // Darwin on iOS uses a variant of the ARM C++ ABI.
5261 TheCXXABI.set(TargetCXXABI::WatchOS);
5262
5263 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5264 // size_t is long, it's a bit weird for it to be int.
5265 PtrDiffType = SignedLong;
5266
5267 // BOOL should be a real boolean on the new ABI
5268 UseSignedCharForObjCBool = false;
5269 } else
5270 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005271 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005272};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005273
Tim Northover573cbee2014-05-24 12:52:07 +00005274class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005275 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005276 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5277 static const char *const GCCRegNames[];
5278
James Molloy75f5f9e2014-04-16 15:33:48 +00005279 enum FPUModeEnum {
5280 FPUMode,
5281 NeonMode
5282 };
5283
5284 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005285 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005286 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005287 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005288 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005289
Tim Northovera2ee4332014-03-29 15:09:45 +00005290 static const Builtin::Info BuiltinInfo[];
5291
5292 std::string ABI;
5293
5294public:
Tim Northover573cbee2014-05-24 12:52:07 +00005295 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005296 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005297
5298 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5299 WCharType = SignedInt;
5300
5301 // NetBSD apparently prefers consistency across ARM targets to consistency
5302 // across 64-bit targets.
5303 Int64Type = SignedLongLong;
5304 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005305 } else {
5306 WCharType = UnsignedInt;
5307 Int64Type = SignedLong;
5308 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005309 }
5310
Tim Northovera2ee4332014-03-29 15:09:45 +00005311 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005312 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005313 MaxAtomicInlineWidth = 128;
5314 MaxAtomicPromoteWidth = 128;
5315
Tim Northovera6a19f12015-02-06 01:25:07 +00005316 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005317 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5318
Tim Northovera2ee4332014-03-29 15:09:45 +00005319 // {} in inline assembly are neon specifiers, not assembly variant
5320 // specifiers.
5321 NoAsmVariants = true;
5322
Tim Northover7ad87af2015-01-16 18:44:04 +00005323 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5324 // contributes to the alignment of the containing aggregate in the same way
5325 // a plain (non bit-field) member of that type would, without exception for
5326 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005327 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005328 UseZeroLengthBitfieldAlignment = true;
5329
Tim Northover573cbee2014-05-24 12:52:07 +00005330 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005331 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5332 }
5333
Alp Toker4925ba72014-06-07 23:30:42 +00005334 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005335 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005336 if (Name != "aapcs" && Name != "darwinpcs")
5337 return false;
5338
5339 ABI = Name;
5340 return true;
5341 }
5342
David Blaikie1cbb9712014-11-14 19:09:44 +00005343 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005344 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005345 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005346 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5347 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005348 .Case("cyclone", true)
5349 .Default(false);
5350 return CPUKnown;
5351 }
5352
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005353 void getTargetDefines(const LangOptions &Opts,
5354 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005355 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005356 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005357
5358 // Target properties.
5359 Builder.defineMacro("_LP64");
5360 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005361
5362 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5363 Builder.defineMacro("__ARM_ACLE", "200");
5364 Builder.defineMacro("__ARM_ARCH", "8");
5365 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5366
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005367 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005368 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005369 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005370
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005371 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5372 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5373 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5374 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005375 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005376 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5377 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005378
5379 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5380
5381 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005382 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005383
5384 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5385 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005386 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5387 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005388
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005389 if (Opts.UnsafeFPMath)
5390 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005391
5392 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5393
5394 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5395 Opts.ShortEnums ? "1" : "4");
5396
James Molloy75f5f9e2014-04-16 15:33:48 +00005397 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005398 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005399 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005400 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005401 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005402
Bradley Smith418c5932014-05-02 15:17:51 +00005403 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005404 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005405
James Molloy75f5f9e2014-04-16 15:33:48 +00005406 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005407 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5408
5409 if (Unaligned)
5410 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005411
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005412 if (V8_1A)
5413 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5414
Reid Klecknerd167d422015-05-06 15:31:46 +00005415 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5416 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5417 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5418 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5419 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005420 }
5421
Craig Topper6c03a542015-10-19 04:51:35 +00005422 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5423 return llvm::makeArrayRef(BuiltinInfo,
5424 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005425 }
5426
David Blaikie1cbb9712014-11-14 19:09:44 +00005427 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005428 return Feature == "aarch64" ||
5429 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005430 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005431 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005432 }
5433
James Molloy5e73df52014-04-16 15:06:20 +00005434 bool handleTargetFeatures(std::vector<std::string> &Features,
5435 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005436 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005437 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005438 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005439 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005440 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005441
Eric Christopher610fe112015-08-26 08:21:55 +00005442 for (const auto &Feature : Features) {
5443 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005444 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005445 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005446 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005447 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005448 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005449 if (Feature == "+strict-align")
5450 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005451 if (Feature == "+v8.1a")
5452 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005453 }
5454
Eric Christopher964a5f32015-08-05 23:48:05 +00005455 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005456
5457 return true;
5458 }
5459
David Blaikie1cbb9712014-11-14 19:09:44 +00005460 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005461
David Blaikie1cbb9712014-11-14 19:09:44 +00005462 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005463 return TargetInfo::AArch64ABIBuiltinVaList;
5464 }
5465
Craig Topperf054e3a2015-10-19 03:52:27 +00005466 ArrayRef<const char *> getGCCRegNames() const override;
5467 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005468
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005469 bool validateAsmConstraint(const char *&Name,
5470 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005471 switch (*Name) {
5472 default:
5473 return false;
5474 case 'w': // Floating point and SIMD registers (V0-V31)
5475 Info.setAllowsRegister();
5476 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005477 case 'I': // Constant that can be used with an ADD instruction
5478 case 'J': // Constant that can be used with a SUB instruction
5479 case 'K': // Constant that can be used with a 32-bit logical instruction
5480 case 'L': // Constant that can be used with a 64-bit logical instruction
5481 case 'M': // Constant that can be used as a 32-bit MOV immediate
5482 case 'N': // Constant that can be used as a 64-bit MOV immediate
5483 case 'Y': // Floating point constant zero
5484 case 'Z': // Integer constant zero
5485 return true;
5486 case 'Q': // A memory reference with base register and no offset
5487 Info.setAllowsMemory();
5488 return true;
5489 case 'S': // A symbolic address
5490 Info.setAllowsRegister();
5491 return true;
5492 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005493 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5494 // Utf: A memory address suitable for ldp/stp in TF mode.
5495 // Usa: An absolute symbolic address.
5496 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5497 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005498 case 'z': // Zero register, wzr or xzr
5499 Info.setAllowsRegister();
5500 return true;
5501 case 'x': // Floating point and SIMD registers (V0-V15)
5502 Info.setAllowsRegister();
5503 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005504 }
5505 return false;
5506 }
5507
Akira Hatanaka987f1862014-08-22 06:05:21 +00005508 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005509 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005510 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005511 // Strip off constraint modifiers.
5512 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5513 Constraint = Constraint.substr(1);
5514
5515 switch (Constraint[0]) {
5516 default:
5517 return true;
5518 case 'z':
5519 case 'r': {
5520 switch (Modifier) {
5521 case 'x':
5522 case 'w':
5523 // For now assume that the person knows what they're
5524 // doing with the modifier.
5525 return true;
5526 default:
5527 // By default an 'r' constraint will be in the 'x'
5528 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005529 if (Size == 64)
5530 return true;
5531
5532 SuggestedModifier = "w";
5533 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005534 }
5535 }
5536 }
5537 }
5538
David Blaikie1cbb9712014-11-14 19:09:44 +00005539 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005540
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005541 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005542 if (RegNo == 0)
5543 return 0;
5544 if (RegNo == 1)
5545 return 1;
5546 return -1;
5547 }
5548};
5549
Tim Northover573cbee2014-05-24 12:52:07 +00005550const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005551 // 32-bit Integer registers
5552 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5553 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5554 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5555
5556 // 64-bit Integer registers
5557 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5558 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5559 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5560
5561 // 32-bit floating point regsisters
5562 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5563 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5564 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5565
5566 // 64-bit floating point regsisters
5567 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5568 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5569 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5570
5571 // Vector registers
5572 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5573 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5574 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5575};
5576
Craig Topperf054e3a2015-10-19 03:52:27 +00005577ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5578 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005579}
5580
Tim Northover573cbee2014-05-24 12:52:07 +00005581const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005582 { { "w31" }, "wsp" },
5583 { { "x29" }, "fp" },
5584 { { "x30" }, "lr" },
5585 { { "x31" }, "sp" },
5586 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5587 // don't want to substitute one of these for a different-sized one.
5588};
5589
Craig Topperf054e3a2015-10-19 03:52:27 +00005590ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5591 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005592}
5593
Tim Northover573cbee2014-05-24 12:52:07 +00005594const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005595#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005596 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005597#include "clang/Basic/BuiltinsNEON.def"
5598
5599#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005600 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005601#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005602};
James Molloy5e73df52014-04-16 15:06:20 +00005603
Tim Northover573cbee2014-05-24 12:52:07 +00005604class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005605 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005606 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005607 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005608 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005609 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005610 }
5611
5612public:
Tim Northover573cbee2014-05-24 12:52:07 +00005613 AArch64leTargetInfo(const llvm::Triple &Triple)
5614 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005615 BigEndian = false;
5616 }
5617 void getTargetDefines(const LangOptions &Opts,
5618 MacroBuilder &Builder) const override {
5619 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005620 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005621 }
5622};
5623
Tim Northover573cbee2014-05-24 12:52:07 +00005624class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005625 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005626 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005627 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005628 }
5629
5630public:
Tim Northover573cbee2014-05-24 12:52:07 +00005631 AArch64beTargetInfo(const llvm::Triple &Triple)
5632 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005633 void getTargetDefines(const LangOptions &Opts,
5634 MacroBuilder &Builder) const override {
5635 Builder.defineMacro("__AARCH64EB__");
5636 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5637 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005638 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005639 }
5640};
Tim Northovera2ee4332014-03-29 15:09:45 +00005641
Tim Northover573cbee2014-05-24 12:52:07 +00005642class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005643protected:
5644 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5645 MacroBuilder &Builder) const override {
5646 Builder.defineMacro("__AARCH64_SIMD__");
5647 Builder.defineMacro("__ARM64_ARCH_8__");
5648 Builder.defineMacro("__ARM_NEON__");
5649 Builder.defineMacro("__LITTLE_ENDIAN__");
5650 Builder.defineMacro("__REGISTER_PREFIX__", "");
5651 Builder.defineMacro("__arm64", "1");
5652 Builder.defineMacro("__arm64__", "1");
5653
5654 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5655 }
5656
Tim Northovera2ee4332014-03-29 15:09:45 +00005657public:
Tim Northover573cbee2014-05-24 12:52:07 +00005658 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5659 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005660 Int64Type = SignedLongLong;
5661 WCharType = SignedInt;
5662 UseSignedCharForObjCBool = false;
5663
Tim Northovera6a19f12015-02-06 01:25:07 +00005664 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005665 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5666
5667 TheCXXABI.set(TargetCXXABI::iOS64);
5668 }
5669
David Blaikie1cbb9712014-11-14 19:09:44 +00005670 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005671 return TargetInfo::CharPtrBuiltinVaList;
5672 }
5673};
Tim Northovera2ee4332014-03-29 15:09:45 +00005674
Tony Linthicum76329bf2011-12-12 21:14:55 +00005675// Hexagon abstract base class
5676class HexagonTargetInfo : public TargetInfo {
5677 static const Builtin::Info BuiltinInfo[];
5678 static const char * const GCCRegNames[];
5679 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5680 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005681 bool HasHVX, HasHVXDouble;
5682
Tony Linthicum76329bf2011-12-12 21:14:55 +00005683public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005684 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005685 BigEndian = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005686 DataLayoutString = "e-m:e-p:32:32:32-"
5687 "i64:64:64-i32:32:32-i16:16:16-i1:8:8-"
5688 "f64:64:64-f32:32:32-v64:64:64-v32:32:32-a:0-n16:32";
5689 SizeType = UnsignedInt;
5690 PtrDiffType = SignedInt;
5691 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005692
5693 // {} in inline assembly are packet specifiers, not assembly variant
5694 // specifiers.
5695 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005696
5697 LargeArrayMinWidth = 64;
5698 LargeArrayAlign = 64;
5699 UseBitFieldTypeAlignment = true;
5700 ZeroLengthBitfieldBoundary = 32;
5701 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005702 }
5703
Craig Topper6c03a542015-10-19 04:51:35 +00005704 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5705 return llvm::makeArrayRef(BuiltinInfo,
5706 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005707 }
5708
Craig Topper3164f332014-03-11 03:39:26 +00005709 bool validateAsmConstraint(const char *&Name,
5710 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005711 return true;
5712 }
5713
Craig Topper3164f332014-03-11 03:39:26 +00005714 void getTargetDefines(const LangOptions &Opts,
5715 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005716
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005717 bool isCLZForZeroUndef() const override { return false; }
5718
Craig Topper3164f332014-03-11 03:39:26 +00005719 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005720 return llvm::StringSwitch<bool>(Feature)
5721 .Case("hexagon", true)
5722 .Case("hvx", HasHVX)
5723 .Case("hvx-double", HasHVXDouble)
5724 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005725 }
Craig Topper3164f332014-03-11 03:39:26 +00005726
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005727 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5728 StringRef CPU, const std::vector<std::string> &FeaturesVec)
5729 const override;
5730
5731 bool handleTargetFeatures(std::vector<std::string> &Features,
5732 DiagnosticsEngine &Diags) override;
5733
Craig Topper3164f332014-03-11 03:39:26 +00005734 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005735 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005736 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005737 ArrayRef<const char *> getGCCRegNames() const override;
5738 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005739 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005740 return "";
5741 }
Sebastian Pop86500282012-01-13 20:37:10 +00005742
5743 static const char *getHexagonCPUSuffix(StringRef Name) {
5744 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005745 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005746 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005747 .Case("hexagonv55", "55")
5748 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00005749 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005750 }
5751
Craig Topper3164f332014-03-11 03:39:26 +00005752 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005753 if (!getHexagonCPUSuffix(Name))
5754 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005755 CPU = Name;
5756 return true;
5757 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005758
5759 int getEHDataRegisterNumber(unsigned RegNo) const override {
5760 return RegNo < 2 ? RegNo : -1;
5761 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005762};
5763
5764void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005765 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005766 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005767 Builder.defineMacro("__hexagon__", "1");
5768
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005769 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005770 Builder.defineMacro("__HEXAGON_V4__");
5771 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005772 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005773 Builder.defineMacro("__QDSP6_V4__");
5774 Builder.defineMacro("__QDSP6_ARCH__", "4");
5775 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005776 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005777 Builder.defineMacro("__HEXAGON_V5__");
5778 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5779 if(Opts.HexagonQdsp6Compat) {
5780 Builder.defineMacro("__QDSP6_V5__");
5781 Builder.defineMacro("__QDSP6_ARCH__", "5");
5782 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005783 } else if (CPU == "hexagonv60") {
5784 Builder.defineMacro("__HEXAGON_V60__");
5785 Builder.defineMacro("__HEXAGON_ARCH__", "60");
5786 Builder.defineMacro("__QDSP6_V60__");
5787 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005788 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005789}
5790
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005791bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
5792 DiagnosticsEngine &Diags) {
5793 for (auto &F : Features) {
5794 if (F == "+hvx")
5795 HasHVX = true;
5796 else if (F == "-hvx")
5797 HasHVX = HasHVXDouble = false;
5798 else if (F == "+hvx-double")
5799 HasHVX = HasHVXDouble = true;
5800 else if (F == "-hvx-double")
5801 HasHVXDouble = false;
5802 }
5803 return true;
5804}
5805
5806bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
5807 DiagnosticsEngine &Diags, StringRef CPU,
5808 const std::vector<std::string> &FeaturesVec) const {
5809 // Default for v60: -hvx, -hvx-double.
5810 Features["hvx"] = false;
5811 Features["hvx-double"] = false;
5812
5813 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
5814}
5815
5816
5817const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005818 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5819 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5820 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5821 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5822 "p0", "p1", "p2", "p3",
5823 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5824};
5825
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005826ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00005827 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005828}
5829
Tony Linthicum76329bf2011-12-12 21:14:55 +00005830const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5831 { { "sp" }, "r29" },
5832 { { "fp" }, "r30" },
5833 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005834};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005835
Craig Topperf054e3a2015-10-19 03:52:27 +00005836ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
5837 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005838}
5839
5840
5841const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005842#define BUILTIN(ID, TYPE, ATTRS) \
5843 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5844#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5845 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005846#include "clang/Basic/BuiltinsHexagon.def"
5847};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005848
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005849// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5850class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005851 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5852 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005853 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005854public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005855 SparcTargetInfo(const llvm::Triple &Triple)
James Y Knighta3518ad2016-01-27 01:04:51 +00005856 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005857
Craig Topper3164f332014-03-11 03:39:26 +00005858 bool handleTargetFeatures(std::vector<std::string> &Features,
5859 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005860 // The backend doesn't actually handle soft float yet, but in case someone
5861 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005862 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5863 if (Feature != Features.end()) {
5864 SoftFloat = true;
5865 Features.erase(Feature);
5866 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005867 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005868 }
Craig Topper3164f332014-03-11 03:39:26 +00005869 void getTargetDefines(const LangOptions &Opts,
5870 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005871 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005872 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005873
5874 if (SoftFloat)
5875 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005876 }
Craig Topper3164f332014-03-11 03:39:26 +00005877
5878 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005879 return llvm::StringSwitch<bool>(Feature)
5880 .Case("softfloat", SoftFloat)
5881 .Case("sparc", true)
5882 .Default(false);
5883 }
Craig Topper3164f332014-03-11 03:39:26 +00005884
Craig Topper6c03a542015-10-19 04:51:35 +00005885 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005886 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00005887 return None;
Gabor Greif49991682008-02-21 16:29:08 +00005888 }
Craig Topper3164f332014-03-11 03:39:26 +00005889 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005890 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005891 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005892 ArrayRef<const char *> getGCCRegNames() const override;
5893 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005894 bool validateAsmConstraint(const char *&Name,
5895 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005896 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005897 switch (*Name) {
5898 case 'I': // Signed 13-bit constant
5899 case 'J': // Zero
5900 case 'K': // 32-bit constant with the low 12 bits clear
5901 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5902 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5903 case 'N': // Same as 'K' but zext (required for SIMode)
5904 case 'O': // The constant 4096
5905 return true;
5906 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005907 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005908 }
Craig Topper3164f332014-03-11 03:39:26 +00005909 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005910 // FIXME: Implement!
5911 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005912 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00005913
5914 // No Sparc V7 for now, the backend doesn't support it anyway.
5915 enum CPUKind {
5916 CK_GENERIC,
5917 CK_V8,
5918 CK_SUPERSPARC,
5919 CK_SPARCLITE,
5920 CK_F934,
5921 CK_HYPERSPARC,
5922 CK_SPARCLITE86X,
5923 CK_SPARCLET,
5924 CK_TSC701,
5925 CK_V9,
5926 CK_ULTRASPARC,
5927 CK_ULTRASPARC3,
5928 CK_NIAGARA,
5929 CK_NIAGARA2,
5930 CK_NIAGARA3,
5931 CK_NIAGARA4
5932 } CPU = CK_GENERIC;
5933
5934 enum CPUGeneration {
5935 CG_V8,
5936 CG_V9,
5937 };
5938
5939 CPUGeneration getCPUGeneration(CPUKind Kind) const {
5940 switch (Kind) {
5941 case CK_GENERIC:
5942 case CK_V8:
5943 case CK_SUPERSPARC:
5944 case CK_SPARCLITE:
5945 case CK_F934:
5946 case CK_HYPERSPARC:
5947 case CK_SPARCLITE86X:
5948 case CK_SPARCLET:
5949 case CK_TSC701:
5950 return CG_V8;
5951 case CK_V9:
5952 case CK_ULTRASPARC:
5953 case CK_ULTRASPARC3:
5954 case CK_NIAGARA:
5955 case CK_NIAGARA2:
5956 case CK_NIAGARA3:
5957 case CK_NIAGARA4:
5958 return CG_V9;
5959 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00005960 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00005961 }
5962
5963 CPUKind getCPUKind(StringRef Name) const {
5964 return llvm::StringSwitch<CPUKind>(Name)
5965 .Case("v8", CK_V8)
5966 .Case("supersparc", CK_SUPERSPARC)
5967 .Case("sparclite", CK_SPARCLITE)
5968 .Case("f934", CK_F934)
5969 .Case("hypersparc", CK_HYPERSPARC)
5970 .Case("sparclite86x", CK_SPARCLITE86X)
5971 .Case("sparclet", CK_SPARCLET)
5972 .Case("tsc701", CK_TSC701)
5973 .Case("v9", CK_V9)
5974 .Case("ultrasparc", CK_ULTRASPARC)
5975 .Case("ultrasparc3", CK_ULTRASPARC3)
5976 .Case("niagara", CK_NIAGARA)
5977 .Case("niagara2", CK_NIAGARA2)
5978 .Case("niagara3", CK_NIAGARA3)
5979 .Case("niagara4", CK_NIAGARA4)
5980 .Default(CK_GENERIC);
5981 }
5982
5983 bool setCPU(const std::string &Name) override {
5984 CPU = getCPUKind(Name);
5985 return CPU != CK_GENERIC;
5986 }
Gabor Greif49991682008-02-21 16:29:08 +00005987};
5988
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005989const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00005990 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5991 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5992 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5993 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5994};
5995
Craig Topperf054e3a2015-10-19 03:52:27 +00005996ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
5997 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00005998}
5999
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006000const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006001 { { "g0" }, "r0" },
6002 { { "g1" }, "r1" },
6003 { { "g2" }, "r2" },
6004 { { "g3" }, "r3" },
6005 { { "g4" }, "r4" },
6006 { { "g5" }, "r5" },
6007 { { "g6" }, "r6" },
6008 { { "g7" }, "r7" },
6009 { { "o0" }, "r8" },
6010 { { "o1" }, "r9" },
6011 { { "o2" }, "r10" },
6012 { { "o3" }, "r11" },
6013 { { "o4" }, "r12" },
6014 { { "o5" }, "r13" },
6015 { { "o6", "sp" }, "r14" },
6016 { { "o7" }, "r15" },
6017 { { "l0" }, "r16" },
6018 { { "l1" }, "r17" },
6019 { { "l2" }, "r18" },
6020 { { "l3" }, "r19" },
6021 { { "l4" }, "r20" },
6022 { { "l5" }, "r21" },
6023 { { "l6" }, "r22" },
6024 { { "l7" }, "r23" },
6025 { { "i0" }, "r24" },
6026 { { "i1" }, "r25" },
6027 { { "i2" }, "r26" },
6028 { { "i3" }, "r27" },
6029 { { "i4" }, "r28" },
6030 { { "i5" }, "r29" },
6031 { { "i6", "fp" }, "r30" },
6032 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006033};
6034
Craig Topperf054e3a2015-10-19 03:52:27 +00006035ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6036 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006037}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006038
6039// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6040class SparcV8TargetInfo : public SparcTargetInfo {
6041public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006042 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00006043 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00006044 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6045 switch (getTriple().getOS()) {
6046 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006047 SizeType = UnsignedInt;
6048 IntPtrType = SignedInt;
6049 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006050 break;
6051 case llvm::Triple::NetBSD:
6052 case llvm::Triple::OpenBSD:
6053 SizeType = UnsignedLong;
6054 IntPtrType = SignedLong;
6055 PtrDiffType = SignedLong;
6056 break;
Brad Smith56495d52015-08-13 22:00:53 +00006057 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006058 }
6059
Craig Topper3164f332014-03-11 03:39:26 +00006060 void getTargetDefines(const LangOptions &Opts,
6061 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006062 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006063 switch (getCPUGeneration(CPU)) {
6064 case CG_V8:
6065 Builder.defineMacro("__sparcv8");
6066 if (getTriple().getOS() != llvm::Triple::Solaris)
6067 Builder.defineMacro("__sparcv8__");
6068 break;
6069 case CG_V9:
6070 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006071 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006072 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006073 Builder.defineMacro("__sparc_v9__");
6074 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006075 break;
6076 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006077 }
6078};
6079
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006080// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6081class SparcV8elTargetInfo : public SparcV8TargetInfo {
6082 public:
6083 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00006084 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006085 BigEndian = false;
6086 }
6087};
6088
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006089// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6090class SparcV9TargetInfo : public SparcTargetInfo {
6091public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006092 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006093 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00006094 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006095 // This is an LP64 platform.
6096 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006097
6098 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006099 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006100 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006101 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006102 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006103 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006104
6105 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6106 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6107 LongDoubleWidth = 128;
6108 LongDoubleAlign = 128;
6109 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006110 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006111 }
6112
Craig Topper3164f332014-03-11 03:39:26 +00006113 void getTargetDefines(const LangOptions &Opts,
6114 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006115 SparcTargetInfo::getTargetDefines(Opts, Builder);
6116 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006117 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006118 // Solaris doesn't need these variants, but the BSDs do.
6119 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006120 Builder.defineMacro("__sparc64__");
6121 Builder.defineMacro("__sparc_v9__");
6122 Builder.defineMacro("__sparcv9__");
6123 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006124 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006125
Craig Topper3164f332014-03-11 03:39:26 +00006126 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006127 if (!SparcTargetInfo::setCPU(Name))
6128 return false;
6129 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006130 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006131};
6132
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006133class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006134 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006135 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006136 std::string CPU;
6137 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006138 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006139
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006140public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006141 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00006142 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6143 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006144 IntMaxType = SignedLong;
6145 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006146 TLSSupported = true;
6147 IntWidth = IntAlign = 32;
6148 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6149 PointerWidth = PointerAlign = 64;
6150 LongDoubleWidth = 128;
6151 LongDoubleAlign = 64;
6152 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006153 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006154 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00006155 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 +00006156 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6157 }
6158 void getTargetDefines(const LangOptions &Opts,
6159 MacroBuilder &Builder) const override {
6160 Builder.defineMacro("__s390__");
6161 Builder.defineMacro("__s390x__");
6162 Builder.defineMacro("__zarch__");
6163 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006164 if (HasTransactionalExecution)
6165 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006166 if (Opts.ZVector)
6167 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006168 }
Craig Topper6c03a542015-10-19 04:51:35 +00006169 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6170 return llvm::makeArrayRef(BuiltinInfo,
6171 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006172 }
6173
Craig Topperf054e3a2015-10-19 03:52:27 +00006174 ArrayRef<const char *> getGCCRegNames() const override;
6175 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006176 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006177 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006178 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006179 bool validateAsmConstraint(const char *&Name,
6180 TargetInfo::ConstraintInfo &info) const override;
6181 const char *getClobbers() const override {
6182 // FIXME: Is this really right?
6183 return "";
6184 }
6185 BuiltinVaListKind getBuiltinVaListKind() const override {
6186 return TargetInfo::SystemZBuiltinVaList;
6187 }
6188 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006189 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006190 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6191 .Case("z10", true)
6192 .Case("z196", true)
6193 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006194 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006195 .Default(false);
6196
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006197 return CPUKnown;
6198 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006199 bool
6200 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6201 StringRef CPU,
6202 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006203 if (CPU == "zEC12")
6204 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006205 if (CPU == "z13") {
6206 Features["transactional-execution"] = true;
6207 Features["vector"] = true;
6208 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006209 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006210 }
6211
6212 bool handleTargetFeatures(std::vector<std::string> &Features,
6213 DiagnosticsEngine &Diags) override {
6214 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006215 for (const auto &Feature : Features) {
6216 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006217 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006218 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006219 HasVector = true;
6220 }
6221 // If we use the vector ABI, vector types are 64-bit aligned.
6222 if (HasVector) {
6223 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006224 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6225 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006226 }
6227 return true;
6228 }
6229
6230 bool hasFeature(StringRef Feature) const override {
6231 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006232 .Case("systemz", true)
6233 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006234 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006235 .Default(false);
6236 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006237
6238 StringRef getABI() const override {
6239 if (HasVector)
6240 return "vector";
6241 return "";
6242 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006243
6244 bool useFloat128ManglingForLongDouble() const override {
6245 return true;
6246 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006247};
6248
6249const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6250#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006251 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006252#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006253};
6254
6255const char *const SystemZTargetInfo::GCCRegNames[] = {
6256 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6257 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6258 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6259 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6260};
6261
Craig Topperf054e3a2015-10-19 03:52:27 +00006262ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6263 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006264}
6265
6266bool SystemZTargetInfo::
6267validateAsmConstraint(const char *&Name,
6268 TargetInfo::ConstraintInfo &Info) const {
6269 switch (*Name) {
6270 default:
6271 return false;
6272
6273 case 'a': // Address register
6274 case 'd': // Data register (equivalent to 'r')
6275 case 'f': // Floating-point register
6276 Info.setAllowsRegister();
6277 return true;
6278
6279 case 'I': // Unsigned 8-bit constant
6280 case 'J': // Unsigned 12-bit constant
6281 case 'K': // Signed 16-bit constant
6282 case 'L': // Signed 20-bit displacement (on all targets we support)
6283 case 'M': // 0x7fffffff
6284 return true;
6285
6286 case 'Q': // Memory with base and unsigned 12-bit displacement
6287 case 'R': // Likewise, plus an index
6288 case 'S': // Memory with base and signed 20-bit displacement
6289 case 'T': // Likewise, plus an index
6290 Info.setAllowsMemory();
6291 return true;
6292 }
6293}
Ulrich Weigand47445072013-05-06 16:26:41 +00006294
Eric Christopherc48497a2015-09-18 21:26:24 +00006295class MSP430TargetInfo : public TargetInfo {
6296 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006297
Eric Christopherc48497a2015-09-18 21:26:24 +00006298public:
6299 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6300 BigEndian = false;
6301 TLSSupported = false;
6302 IntWidth = 16;
6303 IntAlign = 16;
6304 LongWidth = 32;
6305 LongLongWidth = 64;
6306 LongAlign = LongLongAlign = 16;
6307 PointerWidth = 16;
6308 PointerAlign = 16;
6309 SuitableAlign = 16;
6310 SizeType = UnsignedInt;
6311 IntMaxType = SignedLongLong;
6312 IntPtrType = SignedInt;
6313 PtrDiffType = SignedInt;
6314 SigAtomicType = SignedLong;
6315 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006316 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006317 void getTargetDefines(const LangOptions &Opts,
6318 MacroBuilder &Builder) const override {
6319 Builder.defineMacro("MSP430");
6320 Builder.defineMacro("__MSP430__");
6321 // FIXME: defines for different 'flavours' of MCU
6322 }
Craig Topper6c03a542015-10-19 04:51:35 +00006323 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006324 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006325 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006326 }
6327 bool hasFeature(StringRef Feature) const override {
6328 return Feature == "msp430";
6329 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006330 ArrayRef<const char *> getGCCRegNames() const override;
6331 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006332 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006333 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006334 }
6335 bool validateAsmConstraint(const char *&Name,
6336 TargetInfo::ConstraintInfo &info) const override {
6337 // FIXME: implement
6338 switch (*Name) {
6339 case 'K': // the constant 1
6340 case 'L': // constant -1^20 .. 1^19
6341 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006342 return true;
6343 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006344 // No target constraints for now.
6345 return false;
6346 }
6347 const char *getClobbers() const override {
6348 // FIXME: Is this really right?
6349 return "";
6350 }
6351 BuiltinVaListKind getBuiltinVaListKind() const override {
6352 // FIXME: implement
6353 return TargetInfo::CharPtrBuiltinVaList;
6354 }
6355};
6356
6357const char *const MSP430TargetInfo::GCCRegNames[] = {
6358 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6359 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6360
Craig Topperf054e3a2015-10-19 03:52:27 +00006361ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6362 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006363}
6364
6365// LLVM and Clang cannot be used directly to output native binaries for
6366// target, but is used to compile C code to llvm bitcode with correct
6367// type and alignment information.
6368//
6369// TCE uses the llvm bitcode as input and uses it for generating customized
6370// target processor and program binary. TCE co-design environment is
6371// publicly available in http://tce.cs.tut.fi
6372
6373static const unsigned TCEOpenCLAddrSpaceMap[] = {
6374 3, // opencl_global
6375 4, // opencl_local
6376 5, // opencl_constant
6377 // FIXME: generic has to be added to the target
6378 0, // opencl_generic
6379 0, // cuda_device
6380 0, // cuda_constant
6381 0 // cuda_shared
6382};
6383
6384class TCETargetInfo : public TargetInfo {
6385public:
6386 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6387 TLSSupported = false;
6388 IntWidth = 32;
6389 LongWidth = LongLongWidth = 32;
6390 PointerWidth = 32;
6391 IntAlign = 32;
6392 LongAlign = LongLongAlign = 32;
6393 PointerAlign = 32;
6394 SuitableAlign = 32;
6395 SizeType = UnsignedInt;
6396 IntMaxType = SignedLong;
6397 IntPtrType = SignedInt;
6398 PtrDiffType = SignedInt;
6399 FloatWidth = 32;
6400 FloatAlign = 32;
6401 DoubleWidth = 32;
6402 DoubleAlign = 32;
6403 LongDoubleWidth = 32;
6404 LongDoubleAlign = 32;
6405 FloatFormat = &llvm::APFloat::IEEEsingle;
6406 DoubleFormat = &llvm::APFloat::IEEEsingle;
6407 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6408 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6409 "-f64:32-v64:32-v128:32-a:0:32-n32";
6410 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6411 UseAddrSpaceMapMangling = true;
6412 }
6413
6414 void getTargetDefines(const LangOptions &Opts,
6415 MacroBuilder &Builder) const override {
6416 DefineStd(Builder, "tce", Opts);
6417 Builder.defineMacro("__TCE__");
6418 Builder.defineMacro("__TCE_V1__");
6419 }
6420 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6421
Craig Topper6c03a542015-10-19 04:51:35 +00006422 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006423 const char *getClobbers() const override { return ""; }
6424 BuiltinVaListKind getBuiltinVaListKind() const override {
6425 return TargetInfo::VoidPtrBuiltinVaList;
6426 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006427 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006428 bool validateAsmConstraint(const char *&Name,
6429 TargetInfo::ConstraintInfo &info) const override {
6430 return true;
6431 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006432 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6433 return None;
6434 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006435};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006436
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006437class BPFTargetInfo : public TargetInfo {
6438public:
6439 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6440 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6441 SizeType = UnsignedLong;
6442 PtrDiffType = SignedLong;
6443 IntPtrType = SignedLong;
6444 IntMaxType = SignedLong;
6445 Int64Type = SignedLong;
6446 RegParmMax = 5;
6447 if (Triple.getArch() == llvm::Triple::bpfeb) {
6448 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006449 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006450 } else {
6451 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006452 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006453 }
6454 MaxAtomicPromoteWidth = 64;
6455 MaxAtomicInlineWidth = 64;
6456 TLSSupported = false;
6457 }
6458 void getTargetDefines(const LangOptions &Opts,
6459 MacroBuilder &Builder) const override {
6460 DefineStd(Builder, "bpf", Opts);
6461 Builder.defineMacro("__BPF__");
6462 }
6463 bool hasFeature(StringRef Feature) const override {
6464 return Feature == "bpf";
6465 }
6466
Craig Topper6c03a542015-10-19 04:51:35 +00006467 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006468 const char *getClobbers() const override {
6469 return "";
6470 }
6471 BuiltinVaListKind getBuiltinVaListKind() const override {
6472 return TargetInfo::VoidPtrBuiltinVaList;
6473 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006474 ArrayRef<const char *> getGCCRegNames() const override {
6475 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006476 }
6477 bool validateAsmConstraint(const char *&Name,
6478 TargetInfo::ConstraintInfo &info) const override {
6479 return true;
6480 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006481 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6482 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006483 }
6484};
6485
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006486class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006487 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006488
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006489 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006490 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006491 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006492 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006493 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006494 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006495 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006496 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006497 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006498 enum DspRevEnum {
6499 NoDSP, DSP1, DSP2
6500 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006501 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006502
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006503protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006504 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006505 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006506
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006507public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006508 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6509 const std::string &CPUStr)
6510 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006511 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006512 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6513 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6514 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006515
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006516 bool isNaN2008Default() const {
6517 return CPU == "mips32r6" || CPU == "mips64r6";
6518 }
6519
6520 bool isFP64Default() const {
6521 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6522 }
6523
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006524 bool isNan2008() const override {
6525 return IsNan2008;
6526 }
6527
Alp Toker4925ba72014-06-07 23:30:42 +00006528 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006529 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006530 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6531 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006532 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006533 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006534 .Case("mips1", IsMips32)
6535 .Case("mips2", IsMips32)
6536 .Case("mips3", true)
6537 .Case("mips4", true)
6538 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006539 .Case("mips32", IsMips32)
6540 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006541 .Case("mips32r3", IsMips32)
6542 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006543 .Case("mips32r6", IsMips32)
6544 .Case("mips64", true)
6545 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006546 .Case("mips64r3", true)
6547 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006548 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006549 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006550 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006551 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006552 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006553 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006554 bool
6555 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6556 StringRef CPU,
6557 const std::vector<std::string> &FeaturesVec) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006558 if (CPU == "octeon")
6559 Features["mips64r2"] = Features["cnmips"] = true;
6560 else
6561 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006562 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006563 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006564
Craig Topper3164f332014-03-11 03:39:26 +00006565 void getTargetDefines(const LangOptions &Opts,
6566 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006567 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006568 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006569 if (Opts.GNUMode)
6570 Builder.defineMacro("mips");
6571
Simon Atanasyan683535b2012-08-29 19:14:58 +00006572 Builder.defineMacro("__REGISTER_PREFIX__", "");
6573
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006574 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006575 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006576 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006577 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006578 case SoftFloat:
6579 Builder.defineMacro("__mips_soft_float", Twine(1));
6580 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006581 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006582
Simon Atanasyan16071912013-04-14 14:07:30 +00006583 if (IsSingleFloat)
6584 Builder.defineMacro("__mips_single_float", Twine(1));
6585
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006586 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6587 Builder.defineMacro("_MIPS_FPSET",
6588 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6589
Simon Atanasyan72244b62012-07-05 16:06:06 +00006590 if (IsMips16)
6591 Builder.defineMacro("__mips16", Twine(1));
6592
Simon Atanasyan60777612013-04-14 14:07:51 +00006593 if (IsMicromips)
6594 Builder.defineMacro("__mips_micromips", Twine(1));
6595
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006596 if (IsNan2008)
6597 Builder.defineMacro("__mips_nan2008", Twine(1));
6598
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006599 switch (DspRev) {
6600 default:
6601 break;
6602 case DSP1:
6603 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6604 Builder.defineMacro("__mips_dsp", Twine(1));
6605 break;
6606 case DSP2:
6607 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6608 Builder.defineMacro("__mips_dspr2", Twine(1));
6609 Builder.defineMacro("__mips_dsp", Twine(1));
6610 break;
6611 }
6612
Jack Carter44ff1e52013-08-12 17:20:29 +00006613 if (HasMSA)
6614 Builder.defineMacro("__mips_msa", Twine(1));
6615
Simon Atanasyan26f19672012-04-05 19:28:31 +00006616 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6617 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6618 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006619
6620 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6621 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00006622
6623 // These shouldn't be defined for MIPS-I but there's no need to check
6624 // for that since MIPS-I isn't supported.
6625 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6626 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6627 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006628 }
6629
Craig Topper6c03a542015-10-19 04:51:35 +00006630 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6631 return llvm::makeArrayRef(BuiltinInfo,
6632 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006633 }
Craig Topper3164f332014-03-11 03:39:26 +00006634 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006635 return llvm::StringSwitch<bool>(Feature)
6636 .Case("mips", true)
6637 .Case("fp64", HasFP64)
6638 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006639 }
Craig Topper3164f332014-03-11 03:39:26 +00006640 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006641 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006642 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006643 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006644 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006645 // CPU register names
6646 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006647 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6648 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6649 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006650 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6651 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006652 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6653 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6654 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6655 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006656 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006657 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006658 "$fcc5","$fcc6","$fcc7",
6659 // MSA register names
6660 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6661 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6662 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6663 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6664 // MSA control register names
6665 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6666 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006667 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006668 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006669 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006670 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006671 bool validateAsmConstraint(const char *&Name,
6672 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006673 switch (*Name) {
6674 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006675 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006676 case 'r': // CPU registers.
6677 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006678 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006679 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006680 case 'c': // $25 for indirect jumps
6681 case 'l': // lo register
6682 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006683 Info.setAllowsRegister();
6684 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006685 case 'I': // Signed 16-bit constant
6686 case 'J': // Integer 0
6687 case 'K': // Unsigned 16-bit constant
6688 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6689 case 'M': // Constants not loadable via lui, addiu, or ori
6690 case 'N': // Constant -1 to -65535
6691 case 'O': // A signed 15-bit constant
6692 case 'P': // A constant between 1 go 65535
6693 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006694 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006695 Info.setAllowsMemory();
6696 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006697 case 'Z':
6698 if (Name[1] == 'C') { // An address usable by ll, and sc.
6699 Info.setAllowsMemory();
6700 Name++; // Skip over 'Z'.
6701 return true;
6702 }
6703 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006704 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006705 }
6706
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006707 std::string convertConstraint(const char *&Constraint) const override {
6708 std::string R;
6709 switch (*Constraint) {
6710 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6711 if (Constraint[1] == 'C') {
6712 R = std::string("^") + std::string(Constraint, 2);
6713 Constraint++;
6714 return R;
6715 }
6716 break;
6717 }
6718 return TargetInfo::convertConstraint(Constraint);
6719 }
6720
Craig Topper3164f332014-03-11 03:39:26 +00006721 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006722 // In GCC, $1 is not widely used in generated code (it's used only in a few
6723 // specific situations), so there is no real need for users to add it to
6724 // the clobbers list if they want to use it in their inline assembly code.
6725 //
6726 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6727 // code generation, so using it in inline assembly without adding it to the
6728 // clobbers list can cause conflicts between the inline assembly code and
6729 // the surrounding generated code.
6730 //
6731 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6732 // operands, which will conflict with the ".set at" assembler option (which
6733 // we use only for inline assembly, in order to maintain compatibility with
6734 // GCC) and will also conflict with the user's usage of $1.
6735 //
6736 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6737 // register for generated code is to automatically clobber $1 for all inline
6738 // assembly code.
6739 //
6740 // FIXME: We should automatically clobber $1 only for inline assembly code
6741 // which actually uses it. This would allow LLVM to use $1 for inline
6742 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006743 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006744 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006745
Craig Topper3164f332014-03-11 03:39:26 +00006746 bool handleTargetFeatures(std::vector<std::string> &Features,
6747 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006748 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006749 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006750 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006751 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006752 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006753 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006754 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006755
Eric Christopher610fe112015-08-26 08:21:55 +00006756 for (const auto &Feature : Features) {
6757 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006758 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006759 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006760 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006761 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006762 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006763 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006764 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006765 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006766 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006767 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006768 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006769 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006770 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006771 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006772 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006773 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006774 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006775 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006776 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006777 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006778 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006779 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006780
Eric Christopher964a5f32015-08-05 23:48:05 +00006781 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006782
Rafael Espindolaeb265472013-08-21 21:59:03 +00006783 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006784 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006785
Craig Topper3164f332014-03-11 03:39:26 +00006786 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006787 if (RegNo == 0) return 4;
6788 if (RegNo == 1) return 5;
6789 return -1;
6790 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006791
6792 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006793};
6794
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006795const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006796#define BUILTIN(ID, TYPE, ATTRS) \
6797 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6798#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6799 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006800#include "clang/Basic/BuiltinsMips.def"
6801};
6802
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006803class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006804public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006805 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006806 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006807 SizeType = UnsignedInt;
6808 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006809 Int64Type = SignedLongLong;
6810 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006811 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006812 }
Craig Topper3164f332014-03-11 03:39:26 +00006813 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006814 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006815 ABI = Name;
6816 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006817 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006818 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006819 }
Craig Topper3164f332014-03-11 03:39:26 +00006820 void getTargetDefines(const LangOptions &Opts,
6821 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006822 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006823
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006824 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006825 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6826
6827 const std::string& CPUStr = getCPU();
6828 if (CPUStr == "mips32")
6829 Builder.defineMacro("__mips_isa_rev", "1");
6830 else if (CPUStr == "mips32r2")
6831 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006832 else if (CPUStr == "mips32r3")
6833 Builder.defineMacro("__mips_isa_rev", "3");
6834 else if (CPUStr == "mips32r5")
6835 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006836 else if (CPUStr == "mips32r6")
6837 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006838
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006839 if (ABI == "o32") {
6840 Builder.defineMacro("__mips_o32");
6841 Builder.defineMacro("_ABIO32", "1");
6842 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6843 }
6844 else if (ABI == "eabi")
6845 Builder.defineMacro("__mips_eabi");
6846 else
David Blaikie83d382b2011-09-23 05:06:16 +00006847 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006848 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006849 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006850 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6851 { { "at" }, "$1" },
6852 { { "v0" }, "$2" },
6853 { { "v1" }, "$3" },
6854 { { "a0" }, "$4" },
6855 { { "a1" }, "$5" },
6856 { { "a2" }, "$6" },
6857 { { "a3" }, "$7" },
6858 { { "t0" }, "$8" },
6859 { { "t1" }, "$9" },
6860 { { "t2" }, "$10" },
6861 { { "t3" }, "$11" },
6862 { { "t4" }, "$12" },
6863 { { "t5" }, "$13" },
6864 { { "t6" }, "$14" },
6865 { { "t7" }, "$15" },
6866 { { "s0" }, "$16" },
6867 { { "s1" }, "$17" },
6868 { { "s2" }, "$18" },
6869 { { "s3" }, "$19" },
6870 { { "s4" }, "$20" },
6871 { { "s5" }, "$21" },
6872 { { "s6" }, "$22" },
6873 { { "s7" }, "$23" },
6874 { { "t8" }, "$24" },
6875 { { "t9" }, "$25" },
6876 { { "k0" }, "$26" },
6877 { { "k1" }, "$27" },
6878 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006879 { { "sp","$sp" }, "$29" },
6880 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006881 { { "ra" }, "$31" }
6882 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006883 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006884 }
6885};
6886
6887class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006888 void setDataLayoutString() override {
6889 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006890 }
6891
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006892public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006893 Mips32EBTargetInfo(const llvm::Triple &Triple)
6894 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006895 }
Craig Topper3164f332014-03-11 03:39:26 +00006896 void getTargetDefines(const LangOptions &Opts,
6897 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006898 DefineStd(Builder, "MIPSEB", Opts);
6899 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006900 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006901 }
6902};
6903
6904class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006905 void setDataLayoutString() override {
6906 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006907 }
6908
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006909public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006910 Mips32ELTargetInfo(const llvm::Triple &Triple)
6911 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006912 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006913 }
Craig Topper3164f332014-03-11 03:39:26 +00006914 void getTargetDefines(const LangOptions &Opts,
6915 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006916 DefineStd(Builder, "MIPSEL", Opts);
6917 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006918 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006919 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006920};
Akira Hatanakabef17452011-09-20 19:21:49 +00006921
6922class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006923public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006924 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006925 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006926 LongDoubleWidth = LongDoubleAlign = 128;
6927 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006928 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6929 LongDoubleWidth = LongDoubleAlign = 64;
6930 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6931 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006932 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006933 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006934 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006935 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006936
6937 void setN64ABITypes() {
6938 LongWidth = LongAlign = 64;
6939 PointerWidth = PointerAlign = 64;
6940 SizeType = UnsignedLong;
6941 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006942 Int64Type = SignedLong;
6943 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006944 }
6945
6946 void setN32ABITypes() {
6947 LongWidth = LongAlign = 32;
6948 PointerWidth = PointerAlign = 32;
6949 SizeType = UnsignedInt;
6950 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006951 Int64Type = SignedLongLong;
6952 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006953 }
6954
Craig Topper3164f332014-03-11 03:39:26 +00006955 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006956 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006957 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006958 ABI = Name;
6959 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006960 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006961 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006962 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006963 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006964 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006965 }
6966 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006967 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006968
Craig Topper3164f332014-03-11 03:39:26 +00006969 void getTargetDefines(const LangOptions &Opts,
6970 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006971 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006972
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006973 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006974 Builder.defineMacro("__mips64");
6975 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006976 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6977
6978 const std::string& CPUStr = getCPU();
6979 if (CPUStr == "mips64")
6980 Builder.defineMacro("__mips_isa_rev", "1");
6981 else if (CPUStr == "mips64r2")
6982 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006983 else if (CPUStr == "mips64r3")
6984 Builder.defineMacro("__mips_isa_rev", "3");
6985 else if (CPUStr == "mips64r5")
6986 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006987 else if (CPUStr == "mips64r6")
6988 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006989
Akira Hatanakabef17452011-09-20 19:21:49 +00006990 if (ABI == "n32") {
6991 Builder.defineMacro("__mips_n32");
6992 Builder.defineMacro("_ABIN32", "2");
6993 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6994 }
6995 else if (ABI == "n64") {
6996 Builder.defineMacro("__mips_n64");
6997 Builder.defineMacro("_ABI64", "3");
6998 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6999 }
7000 else
David Blaikie83d382b2011-09-23 05:06:16 +00007001 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007002
7003 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007004 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007005 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007006 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7007 { { "at" }, "$1" },
7008 { { "v0" }, "$2" },
7009 { { "v1" }, "$3" },
7010 { { "a0" }, "$4" },
7011 { { "a1" }, "$5" },
7012 { { "a2" }, "$6" },
7013 { { "a3" }, "$7" },
7014 { { "a4" }, "$8" },
7015 { { "a5" }, "$9" },
7016 { { "a6" }, "$10" },
7017 { { "a7" }, "$11" },
7018 { { "t0" }, "$12" },
7019 { { "t1" }, "$13" },
7020 { { "t2" }, "$14" },
7021 { { "t3" }, "$15" },
7022 { { "s0" }, "$16" },
7023 { { "s1" }, "$17" },
7024 { { "s2" }, "$18" },
7025 { { "s3" }, "$19" },
7026 { { "s4" }, "$20" },
7027 { { "s5" }, "$21" },
7028 { { "s6" }, "$22" },
7029 { { "s7" }, "$23" },
7030 { { "t8" }, "$24" },
7031 { { "t9" }, "$25" },
7032 { { "k0" }, "$26" },
7033 { { "k1" }, "$27" },
7034 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007035 { { "sp","$sp" }, "$29" },
7036 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007037 { { "ra" }, "$31" }
7038 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007039 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007040 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007041
7042 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007043};
7044
7045class Mips64EBTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00007046 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007047 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00007048 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 +00007049 else
Eric Christopher964a5f32015-08-05 23:48:05 +00007050 DataLayoutString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanaka9064e362013-10-29 18:30:33 +00007051
Akira Hatanakabef17452011-09-20 19:21:49 +00007052 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007053
Akira Hatanakabef17452011-09-20 19:21:49 +00007054public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007055 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00007056 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00007057 void getTargetDefines(const LangOptions &Opts,
7058 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007059 DefineStd(Builder, "MIPSEB", Opts);
7060 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007061 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007062 }
7063};
7064
7065class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00007066 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007067 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00007068 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 +00007069 else
Eric Christopher964a5f32015-08-05 23:48:05 +00007070 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00007071 }
7072public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007073 Mips64ELTargetInfo(const llvm::Triple &Triple)
7074 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007075 // Default ABI is n64.
7076 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007077 }
Craig Topper3164f332014-03-11 03:39:26 +00007078 void getTargetDefines(const LangOptions &Opts,
7079 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007080 DefineStd(Builder, "MIPSEL", Opts);
7081 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007082 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007083 }
7084};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007085
Ivan Krasindd7403e2011-08-24 20:22:22 +00007086class PNaClTargetInfo : public TargetInfo {
7087public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007088 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007089 BigEndian = false;
James Y Knighta3518ad2016-01-27 01:04:51 +00007090 this->UserLabelPrefix = "";
Ivan Krasindd7403e2011-08-24 20:22:22 +00007091 this->LongAlign = 32;
7092 this->LongWidth = 32;
7093 this->PointerAlign = 32;
7094 this->PointerWidth = 32;
7095 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007096 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007097 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007098 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007099 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007100 this->SizeType = TargetInfo::UnsignedInt;
7101 this->PtrDiffType = TargetInfo::SignedInt;
7102 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007103 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007104 }
7105
Craig Toppere6f17d02014-03-11 04:07:52 +00007106 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007107 Builder.defineMacro("__le32__");
7108 Builder.defineMacro("__pnacl__");
7109 }
Craig Topper3164f332014-03-11 03:39:26 +00007110 void getTargetDefines(const LangOptions &Opts,
7111 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007112 getArchDefines(Opts, Builder);
7113 }
Craig Topper3164f332014-03-11 03:39:26 +00007114 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007115 return Feature == "pnacl";
7116 }
Craig Topper6c03a542015-10-19 04:51:35 +00007117 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007118 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007119 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007120 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007121 ArrayRef<const char *> getGCCRegNames() const override;
7122 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007123 bool validateAsmConstraint(const char *&Name,
7124 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007125 return false;
7126 }
7127
Craig Topper3164f332014-03-11 03:39:26 +00007128 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007129 return "";
7130 }
7131};
7132
Craig Topperf054e3a2015-10-19 03:52:27 +00007133ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7134 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007135}
7136
Craig Topperf054e3a2015-10-19 03:52:27 +00007137ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7138 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007139}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007140
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007141// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7142class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7143public:
7144 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00007145 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007146 }
7147
7148 BuiltinVaListKind getBuiltinVaListKind() const override {
7149 return TargetInfo::PNaClABIBuiltinVaList;
7150 }
7151};
7152
JF Bastien643817d2014-09-12 17:52:47 +00007153class Le64TargetInfo : public TargetInfo {
7154 static const Builtin::Info BuiltinInfo[];
7155
7156public:
7157 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7158 BigEndian = false;
7159 NoAsmVariants = true;
7160 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7161 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00007162 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00007163 }
7164
7165 void getTargetDefines(const LangOptions &Opts,
7166 MacroBuilder &Builder) const override {
7167 DefineStd(Builder, "unix", Opts);
7168 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7169 Builder.defineMacro("__ELF__");
7170 }
Craig Topper6c03a542015-10-19 04:51:35 +00007171 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7172 return llvm::makeArrayRef(BuiltinInfo,
7173 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007174 }
7175 BuiltinVaListKind getBuiltinVaListKind() const override {
7176 return TargetInfo::PNaClABIBuiltinVaList;
7177 }
7178 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007179 ArrayRef<const char *> getGCCRegNames() const override {
7180 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007181 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007182 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7183 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007184 }
7185 bool validateAsmConstraint(const char *&Name,
7186 TargetInfo::ConstraintInfo &Info) const override {
7187 return false;
7188 }
7189
7190 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007191};
Dan Gohmanc2853072015-09-03 22:51:53 +00007192
7193class WebAssemblyTargetInfo : public TargetInfo {
7194 static const Builtin::Info BuiltinInfo[];
7195
7196 enum SIMDEnum {
7197 NoSIMD,
7198 SIMD128,
7199 } SIMDLevel;
7200
7201public:
7202 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
7203 : TargetInfo(T), SIMDLevel(NoSIMD) {
7204 BigEndian = false;
7205 NoAsmVariants = true;
7206 SuitableAlign = 128;
7207 LargeArrayMinWidth = 128;
7208 LargeArrayAlign = 128;
7209 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007210 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007211 LongDoubleWidth = LongDoubleAlign = 128;
7212 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007213 }
7214
7215protected:
7216 void getTargetDefines(const LangOptions &Opts,
7217 MacroBuilder &Builder) const override {
7218 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7219 if (SIMDLevel >= SIMD128)
7220 Builder.defineMacro("__wasm_simd128__");
7221 }
7222
7223private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007224 bool
7225 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7226 StringRef CPU,
7227 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007228 if (CPU == "bleeding-edge")
7229 Features["simd128"] = true;
7230 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7231 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007232 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007233 return llvm::StringSwitch<bool>(Feature)
7234 .Case("simd128", SIMDLevel >= SIMD128)
7235 .Default(false);
7236 }
7237 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007238 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007239 for (const auto &Feature : Features) {
7240 if (Feature == "+simd128") {
7241 SIMDLevel = std::max(SIMDLevel, SIMD128);
7242 continue;
7243 }
7244 if (Feature == "-simd128") {
7245 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7246 continue;
7247 }
7248
7249 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7250 << "-target-feature";
7251 return false;
7252 }
7253 return true;
7254 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007255 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007256 return llvm::StringSwitch<bool>(Name)
7257 .Case("mvp", true)
7258 .Case("bleeding-edge", true)
7259 .Case("generic", true)
7260 .Default(false);
7261 }
Craig Topper6c03a542015-10-19 04:51:35 +00007262 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7263 return llvm::makeArrayRef(BuiltinInfo,
7264 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007265 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007266 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007267 return VoidPtrBuiltinVaList;
7268 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007269 ArrayRef<const char *> getGCCRegNames() const final {
7270 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007271 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007272 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7273 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007274 }
7275 bool
7276 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007277 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007278 return false;
7279 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007280 const char *getClobbers() const final { return ""; }
7281 bool isCLZForZeroUndef() const final { return false; }
7282 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007283 IntType getIntTypeByWidth(unsigned BitWidth,
7284 bool IsSigned) const final {
7285 // WebAssembly prefers long long for explicitly 64-bit integers.
7286 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7287 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7288 }
7289 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7290 bool IsSigned) const final {
7291 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7292 return BitWidth == 64
7293 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7294 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7295 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007296};
7297
7298const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7299#define BUILTIN(ID, TYPE, ATTRS) \
7300 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7301#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7302 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7303#include "clang/Basic/BuiltinsWebAssembly.def"
7304};
7305
7306class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7307public:
7308 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7309 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007310 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohman0d75f2c2016-01-07 03:20:15 +00007311 DataLayoutString = "e-m:e-p:32:32-i64:64-n32:64-S128";
Dan Gohmanc2853072015-09-03 22:51:53 +00007312 }
7313
7314protected:
7315 void getTargetDefines(const LangOptions &Opts,
7316 MacroBuilder &Builder) const override {
7317 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7318 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7319 }
7320};
7321
7322class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7323public:
7324 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7325 : WebAssemblyTargetInfo(T) {
7326 LongAlign = LongWidth = 64;
7327 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007328 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohman0d75f2c2016-01-07 03:20:15 +00007329 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Dan Gohmanc2853072015-09-03 22:51:53 +00007330 }
7331
7332protected:
7333 void getTargetDefines(const LangOptions &Opts,
7334 MacroBuilder &Builder) const override {
7335 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7336 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7337 }
7338};
7339
JF Bastien643817d2014-09-12 17:52:47 +00007340const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7341#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007342 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007343#include "clang/Basic/BuiltinsLe64.def"
7344};
7345
Eric Christopherc48497a2015-09-18 21:26:24 +00007346static const unsigned SPIRAddrSpaceMap[] = {
7347 1, // opencl_global
7348 3, // opencl_local
7349 2, // opencl_constant
7350 4, // opencl_generic
7351 0, // cuda_device
7352 0, // cuda_constant
7353 0 // cuda_shared
7354};
7355class SPIRTargetInfo : public TargetInfo {
7356public:
7357 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7358 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7359 "SPIR target must use unknown OS");
7360 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7361 "SPIR target must use unknown environment type");
7362 BigEndian = false;
7363 TLSSupported = false;
7364 LongWidth = LongAlign = 64;
7365 AddrSpaceMap = &SPIRAddrSpaceMap;
7366 UseAddrSpaceMapMangling = true;
7367 // Define available target features
7368 // These must be defined in sorted order!
7369 NoAsmVariants = true;
7370 }
7371 void getTargetDefines(const LangOptions &Opts,
7372 MacroBuilder &Builder) const override {
7373 DefineStd(Builder, "SPIR", Opts);
7374 }
7375 bool hasFeature(StringRef Feature) const override {
7376 return Feature == "spir";
7377 }
Craig Topper3164f332014-03-11 03:39:26 +00007378
Craig Topper6c03a542015-10-19 04:51:35 +00007379 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007380 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007381 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007382 bool validateAsmConstraint(const char *&Name,
7383 TargetInfo::ConstraintInfo &info) const override {
7384 return true;
7385 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007386 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7387 return None;
7388 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007389 BuiltinVaListKind getBuiltinVaListKind() const override {
7390 return TargetInfo::VoidPtrBuiltinVaList;
7391 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007392
Eric Christopherc48497a2015-09-18 21:26:24 +00007393 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7394 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7395 : CCCR_Warning;
7396 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007397
Eric Christopherc48497a2015-09-18 21:26:24 +00007398 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7399 return CC_SpirFunction;
7400 }
7401};
Guy Benyeib798fc92012-12-11 21:38:14 +00007402
Eric Christopherc48497a2015-09-18 21:26:24 +00007403class SPIR32TargetInfo : public SPIRTargetInfo {
7404public:
7405 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7406 PointerWidth = PointerAlign = 32;
7407 SizeType = TargetInfo::UnsignedInt;
7408 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7409 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7410 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7411 }
7412 void getTargetDefines(const LangOptions &Opts,
7413 MacroBuilder &Builder) const override {
7414 DefineStd(Builder, "SPIR32", Opts);
7415 }
7416};
Guy Benyeib798fc92012-12-11 21:38:14 +00007417
Eric Christopherc48497a2015-09-18 21:26:24 +00007418class SPIR64TargetInfo : public SPIRTargetInfo {
7419public:
7420 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7421 PointerWidth = PointerAlign = 64;
7422 SizeType = TargetInfo::UnsignedLong;
7423 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7424 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7425 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7426 }
7427 void getTargetDefines(const LangOptions &Opts,
7428 MacroBuilder &Builder) const override {
7429 DefineStd(Builder, "SPIR64", Opts);
7430 }
7431};
Guy Benyeib798fc92012-12-11 21:38:14 +00007432
Robert Lytton0e076492013-08-13 09:43:10 +00007433class XCoreTargetInfo : public TargetInfo {
7434 static const Builtin::Info BuiltinInfo[];
7435public:
7436 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7437 BigEndian = false;
7438 NoAsmVariants = true;
7439 LongLongAlign = 32;
7440 SuitableAlign = 32;
7441 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007442 SizeType = UnsignedInt;
7443 PtrDiffType = SignedInt;
7444 IntPtrType = SignedInt;
7445 WCharType = UnsignedChar;
7446 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007447 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007448 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7449 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007450 }
Craig Topper3164f332014-03-11 03:39:26 +00007451 void getTargetDefines(const LangOptions &Opts,
7452 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007453 Builder.defineMacro("__XS1B__");
7454 }
Craig Topper6c03a542015-10-19 04:51:35 +00007455 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7456 return llvm::makeArrayRef(BuiltinInfo,
7457 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007458 }
Craig Topper3164f332014-03-11 03:39:26 +00007459 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007460 return TargetInfo::VoidPtrBuiltinVaList;
7461 }
Craig Topper3164f332014-03-11 03:39:26 +00007462 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007463 return "";
7464 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007465 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007466 static const char * const GCCRegNames[] = {
7467 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7468 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7469 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007470 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007471 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007472 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7473 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007474 }
Craig Topper3164f332014-03-11 03:39:26 +00007475 bool validateAsmConstraint(const char *&Name,
7476 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007477 return false;
7478 }
Craig Topper3164f332014-03-11 03:39:26 +00007479 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007480 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7481 return (RegNo < 2)? RegNo : -1;
7482 }
Robert Lytton0e076492013-08-13 09:43:10 +00007483};
7484
7485const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007486#define BUILTIN(ID, TYPE, ATTRS) \
7487 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7488#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7489 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007490#include "clang/Basic/BuiltinsXCore.def"
7491};
Robert Lytton0e076492013-08-13 09:43:10 +00007492
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007493// x86_32 Android target
7494class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7495public:
7496 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7497 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7498 SuitableAlign = 32;
7499 LongDoubleWidth = 64;
7500 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7501 }
7502};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007503
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007504// x86_64 Android target
7505class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7506public:
7507 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7508 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7509 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7510 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007511
7512 bool useFloat128ManglingForLongDouble() const override {
7513 return true;
7514 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007515};
7516} // end anonymous namespace
7517
Chris Lattner5ba61f02006-10-14 07:39:34 +00007518//===----------------------------------------------------------------------===//
7519// Driver code
7520//===----------------------------------------------------------------------===//
7521
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007522static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007523 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007524
Daniel Dunbar52322032009-08-18 05:47:58 +00007525 switch (Triple.getArch()) {
7526 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007527 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007528
Tim Northover2a0783d2014-05-30 14:14:07 +00007529 case llvm::Triple::xcore:
7530 return new XCoreTargetInfo(Triple);
7531
7532 case llvm::Triple::hexagon:
7533 return new HexagonTargetInfo(Triple);
7534
7535 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007536 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007537 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007538
7539 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007540 case llvm::Triple::CloudABI:
7541 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple);
Ed Maste6a9eda52014-11-13 16:55:42 +00007542 case llvm::Triple::FreeBSD:
7543 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007544 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007545 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007546 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007547 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007548 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007549 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007550 }
7551
Christian Pirker9b019ae2014-02-25 13:51:00 +00007552 case llvm::Triple::aarch64_be:
7553 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007554 case llvm::Triple::FreeBSD:
7555 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007556 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007557 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007558 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007559 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007560 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007561 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007562 }
7563
Daniel Dunbar52322032009-08-18 05:47:58 +00007564 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007565 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007566 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007567 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007568
Daniel Dunbar52322032009-08-18 05:47:58 +00007569 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007570 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007571 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007572 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007573 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007574 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007575 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007576 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007577 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007578 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007579 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007580 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007581 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007582 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007583 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007584 case llvm::Triple::Win32:
7585 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007586 case llvm::Triple::Cygnus:
7587 return new CygwinARMTargetInfo(Triple);
7588 case llvm::Triple::GNU:
7589 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007590 case llvm::Triple::Itanium:
7591 return new ItaniumWindowsARMleTargetInfo(Triple);
7592 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007593 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007594 return new MicrosoftARMleTargetInfo(Triple);
7595 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007596 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007597 return new ARMleTargetInfo(Triple);
7598 }
7599
7600 case llvm::Triple::armeb:
7601 case llvm::Triple::thumbeb:
7602 if (Triple.isOSDarwin())
7603 return new DarwinARMTargetInfo(Triple);
7604
7605 switch (os) {
7606 case llvm::Triple::Linux:
7607 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7608 case llvm::Triple::FreeBSD:
7609 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7610 case llvm::Triple::NetBSD:
7611 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7612 case llvm::Triple::OpenBSD:
7613 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7614 case llvm::Triple::Bitrig:
7615 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7616 case llvm::Triple::RTEMS:
7617 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7618 case llvm::Triple::NaCl:
7619 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7620 default:
7621 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007622 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007623
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007624 case llvm::Triple::bpfeb:
7625 case llvm::Triple::bpfel:
7626 return new BPFTargetInfo(Triple);
7627
Daniel Dunbar52322032009-08-18 05:47:58 +00007628 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007629 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007630
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007631 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007632 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007633 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007634 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007635 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007636 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007637 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007638 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007639 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007640 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007641 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007642 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007643 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007644
7645 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007646 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007647 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007648 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007649 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007650 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007651 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007652 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007653 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007654 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007655 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007656 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007657 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007658 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007659 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007660
Akira Hatanakabef17452011-09-20 19:21:49 +00007661 case llvm::Triple::mips64:
7662 switch (os) {
7663 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007664 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007665 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007666 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007667 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007668 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007669 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007670 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007671 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007672 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007673 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007674 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007675 }
7676
7677 case llvm::Triple::mips64el:
7678 switch (os) {
7679 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007680 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007681 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007682 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007683 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007684 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007685 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007686 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007687 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007688 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007689 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007690 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007691 }
7692
Ivan Krasindd7403e2011-08-24 20:22:22 +00007693 case llvm::Triple::le32:
7694 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007695 case llvm::Triple::NaCl:
7696 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7697 default:
7698 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007699 }
7700
JF Bastien643817d2014-09-12 17:52:47 +00007701 case llvm::Triple::le64:
7702 return new Le64TargetInfo(Triple);
7703
Daniel Dunbar52322032009-08-18 05:47:58 +00007704 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007705 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007706 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007707 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007708 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007709 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007710 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007711 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007712 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007713 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007714 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007715 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007716 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007717 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007718 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007719 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007720 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007721
7722 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007723 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007724 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007725 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007726 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007727 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007728 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007729 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007730 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007731 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007732 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007733 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007734 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007735 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007736 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007737
Bill Schmidt778d3872013-07-26 01:36:11 +00007738 case llvm::Triple::ppc64le:
7739 switch (os) {
7740 case llvm::Triple::Linux:
7741 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007742 case llvm::Triple::NetBSD:
7743 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007744 default:
7745 return new PPC64TargetInfo(Triple);
7746 }
7747
Peter Collingbournec947aae2012-05-20 23:28:41 +00007748 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007749 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007750 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007751 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007752
Tom Stellardd8e38a32015-01-06 20:34:47 +00007753 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007754 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007755 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007756
Daniel Dunbar52322032009-08-18 05:47:58 +00007757 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007758 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007759 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007760 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007761 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007762 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007763 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007764 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007765 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007766 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007767 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007768 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007769 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007770 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007771 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007772
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007773 // The 'sparcel' architecture copies all the above cases except for Solaris.
7774 case llvm::Triple::sparcel:
7775 switch (os) {
7776 case llvm::Triple::Linux:
7777 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7778 case llvm::Triple::NetBSD:
7779 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7780 case llvm::Triple::OpenBSD:
7781 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7782 case llvm::Triple::RTEMS:
7783 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7784 default:
7785 return new SparcV8elTargetInfo(Triple);
7786 }
7787
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007788 case llvm::Triple::sparcv9:
7789 switch (os) {
7790 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007791 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007792 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007793 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007794 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007795 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007796 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007797 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007798 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007799 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007800 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007801 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007802 }
7803
Ulrich Weigand47445072013-05-06 16:26:41 +00007804 case llvm::Triple::systemz:
7805 switch (os) {
7806 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007807 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007808 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007809 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007810 }
7811
Eli Friedmana9c3d712009-08-19 20:47:07 +00007812 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007813 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007814
Daniel Dunbar52322032009-08-18 05:47:58 +00007815 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007816 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007817 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007818
Daniel Dunbar52322032009-08-18 05:47:58 +00007819 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007820 case llvm::Triple::CloudABI:
7821 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007822 case llvm::Triple::Linux: {
7823 switch (Triple.getEnvironment()) {
7824 default:
7825 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7826 case llvm::Triple::Android:
7827 return new AndroidX86_32TargetInfo(Triple);
7828 }
7829 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007830 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007831 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007832 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007833 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007834 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007835 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007836 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007837 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007838 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007839 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007840 case llvm::Triple::KFreeBSD:
7841 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007842 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007843 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007844 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007845 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007846 case llvm::Triple::Win32: {
7847 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007848 case llvm::Triple::Cygnus:
7849 return new CygwinX86_32TargetInfo(Triple);
7850 case llvm::Triple::GNU:
7851 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007852 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007853 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007854 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007855 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007856 }
7857 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007858 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007859 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007860 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007861 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007862 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007863 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Alexey Bataevc99b0492015-11-25 09:24:26 +00007864 case llvm::Triple::ELFIAMCU:
7865 return new MCUX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007866 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007867 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007868 }
7869
7870 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007871 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007872 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007873
Daniel Dunbar52322032009-08-18 05:47:58 +00007874 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007875 case llvm::Triple::CloudABI:
7876 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007877 case llvm::Triple::Linux: {
7878 switch (Triple.getEnvironment()) {
7879 default:
7880 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7881 case llvm::Triple::Android:
7882 return new AndroidX86_64TargetInfo(Triple);
7883 }
7884 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007885 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007886 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007887 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007888 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007889 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007890 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007891 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007892 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007893 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007894 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007895 case llvm::Triple::KFreeBSD:
7896 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007897 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007898 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007899 case llvm::Triple::Win32: {
7900 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007901 case llvm::Triple::Cygnus:
7902 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007903 case llvm::Triple::GNU:
7904 return new MinGWX86_64TargetInfo(Triple);
7905 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007906 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007907 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007908 }
7909 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007910 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007911 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007912 case llvm::Triple::PS4:
7913 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007914 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007915 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007916 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007917
Douglas Katzman78d7c542015-05-12 21:18:10 +00007918 case llvm::Triple::spir: {
7919 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7920 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7921 return nullptr;
7922 return new SPIR32TargetInfo(Triple);
7923 }
7924 case llvm::Triple::spir64: {
7925 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7926 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7927 return nullptr;
7928 return new SPIR64TargetInfo(Triple);
7929 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007930 case llvm::Triple::wasm32:
7931 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7932 return nullptr;
7933 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7934 case llvm::Triple::wasm64:
7935 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7936 return nullptr;
7937 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007938 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007939}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007940
7941/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007942/// options.
Alp Toker80758082014-07-06 05:26:44 +00007943TargetInfo *
7944TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7945 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007946 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007947
7948 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007949 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007950 if (!Target) {
7951 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007952 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007953 }
Alp Toker80758082014-07-06 05:26:44 +00007954 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007955
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007956 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007957 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7958 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007959 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007960 }
7961
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007962 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007963 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7964 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007965 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007966 }
7967
Rafael Espindolaeb265472013-08-21 21:59:03 +00007968 // Set the fp math unit.
7969 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7970 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007971 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007972 }
7973
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007974 // Compute the default target features, we need the target to handle this
7975 // because features may have dependencies on one another.
7976 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00007977 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
7978 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00007979 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007980
7981 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007982 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00007983 for (const auto &F : Features)
7984 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
7985
Eric Christopher3ff21b32013-10-16 21:26:26 +00007986 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00007987 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007988
Ahmed Charles9a16beb2014-03-07 19:33:25 +00007989 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007990}