blob: 2651cfe4ef46c39f1c94b225f121e3a661d3f829 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Chris Lattner5ba61f02006-10-14 07:39:34 +000015#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000016#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000022#include "clang/Basic/Version.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000023#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000024#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000025#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000026#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000027#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000028#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000029#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000030#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000031#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000032#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000033#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000034
Chris Lattner5ba61f02006-10-14 07:39:34 +000035using namespace clang;
36
Chris Lattner5ba61f02006-10-14 07:39:34 +000037//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000038// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
40
Chris Lattner1e1c0b92009-03-20 16:06:38 +000041/// DefineStd - Define a macro name and standard variants. For example if
42/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
43/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000044static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000045 const LangOptions &Opts) {
46 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000047
Chris Lattner1e1c0b92009-03-20 16:06:38 +000048 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
49 // in the user's namespace.
50 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000051 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000052
Chris Lattner1e1c0b92009-03-20 16:06:38 +000053 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000054 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000055
Chris Lattner1e1c0b92009-03-20 16:06:38 +000056 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000057 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058}
59
Benjamin Kramere3b442d2012-01-10 11:50:09 +000060static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
61 bool Tuning = true) {
62 Builder.defineMacro("__" + CPUName);
63 Builder.defineMacro("__" + CPUName + "__");
64 if (Tuning)
65 Builder.defineMacro("__tune_" + CPUName + "__");
66}
67
Chris Lattner09d98f52008-10-05 21:50:58 +000068//===----------------------------------------------------------------------===//
69// Defines specific to certain operating systems.
70//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000071
Torok Edwinb2b37c62009-06-30 17:10:35 +000072namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000073template<typename TgtInfo>
74class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000075protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000076 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000077 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000078public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +000079 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +000080 void getTargetDefines(const LangOptions &Opts,
81 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 TgtInfo::getTargetDefines(Opts, Builder);
83 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000084 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000085
86};
Chris Lattner30ba6742009-08-10 19:03:04 +000087
Eric Christopher7d0c7252015-09-24 21:17:04 +000088// CloudABI Target
89template <typename Target>
90class CloudABITargetInfo : public OSTargetInfo<Target> {
91protected:
92 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
93 MacroBuilder &Builder) const override {
94 Builder.defineMacro("__CloudABI__");
95 Builder.defineMacro("__ELF__");
96
97 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
98 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
99 Builder.defineMacro("__STDC_UTF_16__");
100 Builder.defineMacro("__STDC_UTF_32__");
101 }
102
103public:
104 CloudABITargetInfo(const llvm::Triple &Triple)
James Y Knighta3518ad2016-01-27 01:04:51 +0000105 : OSTargetInfo<Target>(Triple) {
106 this->UserLabelPrefix = "";
107 }
Eric Christopher7d0c7252015-09-24 21:17:04 +0000108};
109
Daniel Dunbard86666f2010-01-26 01:44:04 +0000110static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000111 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000112 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000113 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000114 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000115 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000116 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000117 // AddressSanitizer doesn't play well with source fortification, which is on
118 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000119 if (Opts.Sanitize.has(SanitizerKind::Address))
120 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000121
John McCall460ce582015-10-22 18:38:17 +0000122 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
123 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000124 // __weak is always defined, for use in blocks and with objc pointers.
125 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000126 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000127 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000128 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000129
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000130 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000131 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000132 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000133 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000134
135 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000136 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000137
Daniel Dunbarecf13562011-04-19 21:40:34 +0000138 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000139 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000140 if (Triple.isMacOSX()) {
141 Triple.getMacOSXVersion(Maj, Min, Rev);
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 PlatformName = "macosx";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000143 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 Triple.getOSVersion(Maj, Min, Rev);
145 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000146 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000147
Sebastian Pop422377c2012-01-20 22:01:23 +0000148 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000149 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000150 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
151 if (PlatformName == "win32") {
152 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
153 return;
154 }
155
Evan Cheng31dd9a62014-01-26 23:12:43 +0000156 // Set the appropriate OS version define.
157 if (Triple.isiOS()) {
158 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
159 char Str[6];
160 Str[0] = '0' + Maj;
161 Str[1] = '0' + (Min / 10);
162 Str[2] = '0' + (Min % 10);
163 Str[3] = '0' + (Rev / 10);
164 Str[4] = '0' + (Rev % 10);
165 Str[5] = '\0';
Tim Northover67465f82015-10-30 16:30:30 +0000166 if (Triple.isTvOS())
167 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
168 else
169 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
170 Str);
171
172 } else if (Triple.isWatchOS()) {
173 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
174 char Str[6];
175 Str[0] = '0' + Maj;
176 Str[1] = '0' + (Min / 10);
177 Str[2] = '0' + (Min % 10);
178 Str[3] = '0' + (Rev / 10);
179 Str[4] = '0' + (Rev % 10);
180 Str[5] = '\0';
181 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000182 } else if (Triple.isMacOSX()) {
183 // Note that the Driver allows versions which aren't representable in the
184 // define (because we only get a single digit for the minor and micro
185 // revision numbers). So, we limit them to the maximum representable
186 // version.
187 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000188 char Str[7];
189 if (Maj < 10 || (Maj == 10 && Min < 10)) {
190 Str[0] = '0' + (Maj / 10);
191 Str[1] = '0' + (Maj % 10);
192 Str[2] = '0' + std::min(Min, 9U);
193 Str[3] = '0' + std::min(Rev, 9U);
194 Str[4] = '\0';
195 } else {
196 // Handle versions > 10.9.
197 Str[0] = '0' + (Maj / 10);
198 Str[1] = '0' + (Maj % 10);
199 Str[2] = '0' + (Min / 10);
200 Str[3] = '0' + (Min % 10);
201 Str[4] = '0' + (Rev / 10);
202 Str[5] = '0' + (Rev % 10);
203 Str[6] = '\0';
204 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000205 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000206 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000207
Tim Northover157d9112014-01-16 08:48:16 +0000208 // Tell users about the kernel if there is one.
209 if (Triple.isOSDarwin())
210 Builder.defineMacro("__MACH__");
211
Daniel Dunbarecf13562011-04-19 21:40:34 +0000212 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000213}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000214
Torok Edwinb2b37c62009-06-30 17:10:35 +0000215template<typename Target>
216class DarwinTargetInfo : public OSTargetInfo<Target> {
217protected:
Craig Topper3164f332014-03-11 03:39:26 +0000218 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
219 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000220 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000221 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000222 }
Mike Stump11289f42009-09-09 15:08:12 +0000223
Torok Edwinb2b37c62009-06-30 17:10:35 +0000224public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000225 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000226 // By default, no TLS, and we whitelist permitted architecture/OS
227 // combinations.
228 this->TLSSupported = false;
229
230 if (Triple.isMacOSX())
231 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
232 else if (Triple.isiOS()) {
233 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
234 if (Triple.getArch() == llvm::Triple::x86_64 ||
235 Triple.getArch() == llvm::Triple::aarch64)
236 this->TLSSupported = !Triple.isOSVersionLT(8);
237 else if (Triple.getArch() == llvm::Triple::x86 ||
238 Triple.getArch() == llvm::Triple::arm ||
239 Triple.getArch() == llvm::Triple::thumb)
240 this->TLSSupported = !Triple.isOSVersionLT(9);
241 } else if (Triple.isWatchOS())
242 this->TLSSupported = !Triple.isOSVersionLT(2);
243
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000244 this->MCountName = "\01mcount";
245 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000246
Craig Topper3164f332014-03-11 03:39:26 +0000247 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000248 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000249 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000250 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000251 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000252 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000253 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000254 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000255
Craig Topper3164f332014-03-11 03:39:26 +0000256 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000257 // FIXME: We should return 0 when building kexts.
258 return "__TEXT,__StaticInit,regular,pure_instructions";
259 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000260
John McCalleed64c72012-01-29 01:20:30 +0000261 /// Darwin does not support protected visibility. Darwin's "default"
262 /// is very similar to ELF's "protected"; Darwin requires a "weak"
263 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000264 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000265 return false;
266 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000267};
268
Chris Lattner30ba6742009-08-10 19:03:04 +0000269
Torok Edwinb2b37c62009-06-30 17:10:35 +0000270// DragonFlyBSD Target
271template<typename Target>
272class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
273protected:
Craig Topper3164f332014-03-11 03:39:26 +0000274 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
275 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000276 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000277 Builder.defineMacro("__DragonFly__");
278 Builder.defineMacro("__DragonFly_cc_version", "100001");
279 Builder.defineMacro("__ELF__");
280 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
281 Builder.defineMacro("__tune_i386__");
282 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000283 }
284public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000285 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
286 : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +0000287 this->UserLabelPrefix = "";
288
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000289 switch (Triple.getArch()) {
290 default:
291 case llvm::Triple::x86:
292 case llvm::Triple::x86_64:
293 this->MCountName = ".mcount";
294 break;
295 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000296 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297};
298
299// FreeBSD Target
300template<typename Target>
301class FreeBSDTargetInfo : public OSTargetInfo<Target> {
302protected:
Craig Topper3164f332014-03-11 03:39:26 +0000303 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
304 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000305 // FreeBSD defines; list based off of gcc output
306
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000307 unsigned Release = Triple.getOSMajorVersion();
308 if (Release == 0U)
309 Release = 8;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000311 Builder.defineMacro("__FreeBSD__", Twine(Release));
312 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000313 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
314 DefineStd(Builder, "unix", Opts);
315 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000316
317 // On FreeBSD, wchar_t contains the number of the code point as
318 // used by the character set of the locale. These character sets are
319 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000320 //
321 // FIXME: This is wrong; the macro refers to the numerical values
322 // of wchar_t *literals*, which are not locale-dependent. However,
323 // FreeBSD systems apparently depend on us getting this wrong, and
324 // setting this to 1 is conforming even if all the basic source
325 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000326 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000327 }
328public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000329 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +0000330 this->UserLabelPrefix = "";
331
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000332 switch (Triple.getArch()) {
333 default:
334 case llvm::Triple::x86:
335 case llvm::Triple::x86_64:
336 this->MCountName = ".mcount";
337 break;
338 case llvm::Triple::mips:
339 case llvm::Triple::mipsel:
340 case llvm::Triple::ppc:
341 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000342 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000343 this->MCountName = "_mcount";
344 break;
345 case llvm::Triple::arm:
346 this->MCountName = "__mcount";
347 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000348 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000349 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000350};
351
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000352// GNU/kFreeBSD Target
353template<typename Target>
354class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
355protected:
Craig Topper3164f332014-03-11 03:39:26 +0000356 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
357 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000358 // GNU/kFreeBSD defines; list based off of gcc output
359
360 DefineStd(Builder, "unix", Opts);
361 Builder.defineMacro("__FreeBSD_kernel__");
362 Builder.defineMacro("__GLIBC__");
363 Builder.defineMacro("__ELF__");
364 if (Opts.POSIXThreads)
365 Builder.defineMacro("_REENTRANT");
366 if (Opts.CPlusPlus)
367 Builder.defineMacro("_GNU_SOURCE");
368 }
369public:
Eric Christopher917e9522014-11-18 22:36:15 +0000370 KFreeBSDTargetInfo(const llvm::Triple &Triple)
James Y Knighta3518ad2016-01-27 01:04:51 +0000371 : OSTargetInfo<Target>(Triple) {
372 this->UserLabelPrefix = "";
373 }
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000374};
375
Chris Lattner3e2ee142010-07-07 16:01:42 +0000376// Minix Target
377template<typename Target>
378class MinixTargetInfo : public OSTargetInfo<Target> {
379protected:
Craig Topper3164f332014-03-11 03:39:26 +0000380 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
381 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000382 // Minix defines
383
384 Builder.defineMacro("__minix", "3");
385 Builder.defineMacro("_EM_WSIZE", "4");
386 Builder.defineMacro("_EM_PSIZE", "4");
387 Builder.defineMacro("_EM_SSIZE", "2");
388 Builder.defineMacro("_EM_LSIZE", "4");
389 Builder.defineMacro("_EM_FSIZE", "4");
390 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000391 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000392 DefineStd(Builder, "unix", Opts);
393 }
394public:
James Y Knighta3518ad2016-01-27 01:04:51 +0000395 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
396 this->UserLabelPrefix = "";
397 }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000398};
399
Torok Edwinb2b37c62009-06-30 17:10:35 +0000400// Linux target
401template<typename Target>
402class LinuxTargetInfo : public OSTargetInfo<Target> {
403protected:
Craig Topper3164f332014-03-11 03:39:26 +0000404 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
405 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000406 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000407 DefineStd(Builder, "unix", Opts);
408 DefineStd(Builder, "linux", Opts);
409 Builder.defineMacro("__gnu_linux__");
410 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000411 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000412 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000413 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000414 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000415 this->PlatformName = "android";
416 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
417 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000418 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000419 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000420 if (Opts.CPlusPlus)
421 Builder.defineMacro("_GNU_SOURCE");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000422 }
423public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000424 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000425 this->UserLabelPrefix = "";
Douglas Gregore6d6e512011-01-12 21:19:25 +0000426 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000427
428 switch (Triple.getArch()) {
429 default:
430 break;
431 case llvm::Triple::ppc:
432 case llvm::Triple::ppc64:
433 case llvm::Triple::ppc64le:
434 this->MCountName = "_mcount";
435 break;
436 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000437 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000438
Craig Topper3164f332014-03-11 03:39:26 +0000439 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000440 return ".text.startup";
441 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000442};
443
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000444// NetBSD Target
445template<typename Target>
446class NetBSDTargetInfo : public OSTargetInfo<Target> {
447protected:
Craig Topper3164f332014-03-11 03:39:26 +0000448 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
449 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000450 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000451 Builder.defineMacro("__NetBSD__");
452 Builder.defineMacro("__unix__");
453 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000454 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000455 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000456
457 switch (Triple.getArch()) {
458 default:
459 break;
460 case llvm::Triple::arm:
461 case llvm::Triple::armeb:
462 case llvm::Triple::thumb:
463 case llvm::Triple::thumbeb:
464 Builder.defineMacro("__ARM_DWARF_EH__");
465 break;
466 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000467 }
468public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000469 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +0000470 this->UserLabelPrefix = "";
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000471 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000472 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000473};
474
Torok Edwinb2b37c62009-06-30 17:10:35 +0000475// OpenBSD Target
476template<typename Target>
477class OpenBSDTargetInfo : public OSTargetInfo<Target> {
478protected:
Craig Topper3164f332014-03-11 03:39:26 +0000479 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
480 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000481 // OpenBSD defines; list based off of gcc output
482
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000483 Builder.defineMacro("__OpenBSD__");
484 DefineStd(Builder, "unix", Opts);
485 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000486 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000487 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000488 }
489public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000490 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +0000491 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000492 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000493
Eli Friedman3715d1f2011-12-15 02:15:56 +0000494 switch (Triple.getArch()) {
495 default:
496 case llvm::Triple::x86:
497 case llvm::Triple::x86_64:
498 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000499 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000500 this->MCountName = "__mcount";
501 break;
502 case llvm::Triple::mips64:
503 case llvm::Triple::mips64el:
504 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000505 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000506 this->MCountName = "_mcount";
507 break;
508 }
509 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000510};
511
Eli Friedman9fa28852012-08-08 23:57:20 +0000512// Bitrig Target
513template<typename Target>
514class BitrigTargetInfo : public OSTargetInfo<Target> {
515protected:
Craig Topper3164f332014-03-11 03:39:26 +0000516 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
517 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000518 // Bitrig defines; list based off of gcc output
519
520 Builder.defineMacro("__Bitrig__");
521 DefineStd(Builder, "unix", Opts);
522 Builder.defineMacro("__ELF__");
523 if (Opts.POSIXThreads)
524 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000525
526 switch (Triple.getArch()) {
527 default:
528 break;
529 case llvm::Triple::arm:
530 case llvm::Triple::armeb:
531 case llvm::Triple::thumb:
532 case llvm::Triple::thumbeb:
533 Builder.defineMacro("__ARM_DWARF_EH__");
534 break;
535 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000536 }
537public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000538 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +0000539 this->UserLabelPrefix = "";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000540 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000541 }
542};
543
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000544// PSP Target
545template<typename Target>
546class PSPTargetInfo : public OSTargetInfo<Target> {
547protected:
Craig Topper3164f332014-03-11 03:39:26 +0000548 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
549 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000550 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000551 Builder.defineMacro("PSP");
552 Builder.defineMacro("_PSP");
553 Builder.defineMacro("__psp__");
554 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000555 }
556public:
James Y Knighta3518ad2016-01-27 01:04:51 +0000557 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
558 this->UserLabelPrefix = "";
559 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000560};
561
John Thompsone467e192009-11-19 17:18:50 +0000562// PS3 PPU Target
563template<typename Target>
564class PS3PPUTargetInfo : public OSTargetInfo<Target> {
565protected:
Craig Topper3164f332014-03-11 03:39:26 +0000566 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
567 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000568 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000569 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000570 Builder.defineMacro("__PPU__");
571 Builder.defineMacro("__CELLOS_LV2__");
572 Builder.defineMacro("__ELF__");
573 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000574 Builder.defineMacro("_ARCH_PPC64");
575 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000576 }
577public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000578 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +0000579 this->UserLabelPrefix = "";
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000580 this->LongWidth = this->LongAlign = 32;
581 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000582 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000583 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000584 this->SizeType = TargetInfo::UnsignedInt;
Eric Christopher964a5f32015-08-05 23:48:05 +0000585 this->DataLayoutString = "E-m:e-p:32:32-i64:64-n32:64";
John Thompsone467e192009-11-19 17:18:50 +0000586 }
587};
588
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000589template <typename Target>
590class PS4OSTargetInfo : public OSTargetInfo<Target> {
591protected:
592 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
593 MacroBuilder &Builder) const override {
594 Builder.defineMacro("__FreeBSD__", "9");
595 Builder.defineMacro("__FreeBSD_cc_version", "900001");
596 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
597 DefineStd(Builder, "unix", Opts);
598 Builder.defineMacro("__ELF__");
599 Builder.defineMacro("__PS4__");
600 }
601public:
602 PS4OSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
603 this->WCharType = this->UnsignedShort;
604
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000605 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
606 this->MaxTLSAlign = 256;
James Y Knighta3518ad2016-01-27 01:04:51 +0000607 this->UserLabelPrefix = "";
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000608
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000609 // On PS4, do not honor explicit bit field alignment,
610 // as in "__attribute__((aligned(2))) int b : 1;".
611 this->UseExplicitBitFieldAlignment = false;
612
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000613 switch (Triple.getArch()) {
614 default:
615 case llvm::Triple::x86_64:
616 this->MCountName = ".mcount";
617 break;
618 }
619 }
620};
621
Torok Edwinb2b37c62009-06-30 17:10:35 +0000622// Solaris target
623template<typename Target>
624class SolarisTargetInfo : public OSTargetInfo<Target> {
625protected:
Craig Topper3164f332014-03-11 03:39:26 +0000626 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
627 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000628 DefineStd(Builder, "sun", Opts);
629 DefineStd(Builder, "unix", Opts);
630 Builder.defineMacro("__ELF__");
631 Builder.defineMacro("__svr4__");
632 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000633 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
634 // newer, but to 500 for everything else. feature_test.h has a check to
635 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000636 // with a new version.
637 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000638 Builder.defineMacro("_XOPEN_SOURCE", "600");
639 else
640 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000641 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000642 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000643 Builder.defineMacro("_LARGEFILE_SOURCE");
644 Builder.defineMacro("_LARGEFILE64_SOURCE");
645 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000646 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000647 }
648public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000649 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000650 this->UserLabelPrefix = "";
David Chisnallb526e932012-03-28 18:04:14 +0000651 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000652 // FIXME: WIntType should be SignedLong
653 }
654};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000655
656// Windows target
657template<typename Target>
658class WindowsTargetInfo : public OSTargetInfo<Target> {
659protected:
Craig Topper3164f332014-03-11 03:39:26 +0000660 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
661 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000662 Builder.defineMacro("_WIN32");
663 }
664 void getVisualStudioDefines(const LangOptions &Opts,
665 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000666 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000667 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000668 Builder.defineMacro("_CPPRTTI");
669
Reid Kleckner16514352015-01-30 21:42:55 +0000670 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000671 Builder.defineMacro("_CPPUNWIND");
672 }
673
David Majnemer6a658902015-07-22 22:36:26 +0000674 if (Opts.Bool)
675 Builder.defineMacro("__BOOL_DEFINED");
676
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000677 if (!Opts.CharIsSigned)
678 Builder.defineMacro("_CHAR_UNSIGNED");
679
680 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
681 // but it works for now.
682 if (Opts.POSIXThreads)
683 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000684
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000685 if (Opts.MSCompatibilityVersion) {
686 Builder.defineMacro("_MSC_VER",
687 Twine(Opts.MSCompatibilityVersion / 100000));
688 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000689 // FIXME We cannot encode the revision information into 32-bits
690 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000691
David Majnemerb710a932015-05-11 03:57:49 +0000692 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000693 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000694 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000695
696 if (Opts.MicrosoftExt) {
697 Builder.defineMacro("_MSC_EXTENSIONS");
698
699 if (Opts.CPlusPlus11) {
700 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
701 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
702 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
703 }
704 }
705
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000706 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000707 }
708
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000709public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000710 WindowsTargetInfo(const llvm::Triple &Triple)
711 : OSTargetInfo<Target>(Triple) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000712};
713
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000714template <typename Target>
715class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000716protected:
Craig Topper3164f332014-03-11 03:39:26 +0000717 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
718 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000719 if (Opts.POSIXThreads)
720 Builder.defineMacro("_REENTRANT");
721 if (Opts.CPlusPlus)
722 Builder.defineMacro("_GNU_SOURCE");
723
724 DefineStd(Builder, "unix", Opts);
725 Builder.defineMacro("__ELF__");
726 Builder.defineMacro("__native_client__");
727 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000728
729public:
730 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +0000731 this->UserLabelPrefix = "";
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000732 this->LongAlign = 32;
733 this->LongWidth = 32;
734 this->PointerAlign = 32;
735 this->PointerWidth = 32;
736 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000737 this->Int64Type = TargetInfo::SignedLongLong;
738 this->DoubleAlign = 64;
739 this->LongDoubleWidth = 64;
740 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000741 this->LongLongWidth = 64;
742 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000743 this->SizeType = TargetInfo::UnsignedInt;
744 this->PtrDiffType = TargetInfo::SignedInt;
745 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000746 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000747 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000748 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000749 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000750 } else if (Triple.getArch() == llvm::Triple::x86) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000751 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000752 } else if (Triple.getArch() == llvm::Triple::x86_64) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000753 this->DataLayoutString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000754 } else if (Triple.getArch() == llvm::Triple::mipsel) {
Eric Christopher964a5f32015-08-05 23:48:05 +0000755 // Handled on mips' setDataLayoutString.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000756 } else {
757 assert(Triple.getArch() == llvm::Triple::le32);
Eric Christopher964a5f32015-08-05 23:48:05 +0000758 this->DataLayoutString = "e-p:32:32-i64:64";
Rafael Espindola1c09b262013-12-18 23:41:04 +0000759 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000760 }
761};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000762
Dan Gohmanc2853072015-09-03 22:51:53 +0000763// WebAssembly target
764template <typename Target>
765class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
766 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000767 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000768 // A common platform macro.
769 if (Opts.POSIXThreads)
770 Builder.defineMacro("_REENTRANT");
771 // Follow g++ convention and predefine _GNU_SOURCE for C++.
772 if (Opts.CPlusPlus)
773 Builder.defineMacro("_GNU_SOURCE");
774 }
775
776 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000777 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000778 return ".text.__startup";
779 }
780
781public:
782 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple)
783 : OSTargetInfo<Target>(Triple) {
784 this->MCountName = "__mcount";
James Y Knighta3518ad2016-01-27 01:04:51 +0000785 this->UserLabelPrefix = "";
Dan Gohmanc2853072015-09-03 22:51:53 +0000786 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
787 }
788};
Dan Gohmanc2853072015-09-03 22:51:53 +0000789
Chris Lattner09d98f52008-10-05 21:50:58 +0000790//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000791// Specific target implementations.
792//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000793
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000794// PPC abstract base class
795class PPCTargetInfo : public TargetInfo {
796 static const Builtin::Info BuiltinInfo[];
797 static const char * const GCCRegNames[];
798 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000799 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000800
801 // Target cpu features.
802 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000803 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000804 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000805 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000806 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000807 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000808 bool HasBPERMD;
809 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000810
Ulrich Weigand8afad612014-07-28 13:17:52 +0000811protected:
812 std::string ABI;
813
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000814public:
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000815 PPCTargetInfo(const llvm::Triple &Triple)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000816 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000817 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000818 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000819 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000820 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000821 LongDoubleWidth = LongDoubleAlign = 128;
822 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
823 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000824
Hal Finkel6b984f02012-07-03 16:51:04 +0000825 /// \brief Flags for architecture specific defines.
826 typedef enum {
827 ArchDefineNone = 0,
828 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
829 ArchDefinePpcgr = 1 << 1,
830 ArchDefinePpcsq = 1 << 2,
831 ArchDefine440 = 1 << 3,
832 ArchDefine603 = 1 << 4,
833 ArchDefine604 = 1 << 5,
834 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000835 ArchDefinePwr5 = 1 << 7,
836 ArchDefinePwr5x = 1 << 8,
837 ArchDefinePwr6 = 1 << 9,
838 ArchDefinePwr6x = 1 << 10,
839 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000840 ArchDefinePwr8 = 1 << 12,
841 ArchDefineA2 = 1 << 13,
842 ArchDefineA2q = 1 << 14
Hal Finkel6b984f02012-07-03 16:51:04 +0000843 } ArchDefineTypes;
844
Bill Schmidt38378a02013-02-01 20:23:10 +0000845 // Note: GCC recognizes the following additional cpus:
846 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
847 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
848 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000849 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000850 bool CPUKnown = llvm::StringSwitch<bool>(Name)
851 .Case("generic", true)
852 .Case("440", true)
853 .Case("450", true)
854 .Case("601", true)
855 .Case("602", true)
856 .Case("603", true)
857 .Case("603e", true)
858 .Case("603ev", true)
859 .Case("604", true)
860 .Case("604e", true)
861 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000862 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000863 .Case("g3", true)
864 .Case("7400", true)
865 .Case("g4", true)
866 .Case("7450", true)
867 .Case("g4+", true)
868 .Case("750", true)
869 .Case("970", true)
870 .Case("g5", true)
871 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000872 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000873 .Case("e500mc", true)
874 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000875 .Case("power3", true)
876 .Case("pwr3", true)
877 .Case("power4", true)
878 .Case("pwr4", true)
879 .Case("power5", true)
880 .Case("pwr5", true)
881 .Case("power5x", true)
882 .Case("pwr5x", true)
883 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000884 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000885 .Case("power6x", true)
886 .Case("pwr6x", true)
887 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000888 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000889 .Case("power8", true)
890 .Case("pwr8", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000891 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000892 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000893 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000894 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000895 .Case("powerpc64le", true)
896 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000897 .Default(false);
898
899 if (CPUKnown)
900 CPU = Name;
901
902 return CPUKnown;
903 }
904
Ulrich Weigand8afad612014-07-28 13:17:52 +0000905
906 StringRef getABI() const override { return ABI; }
907
Craig Topper6c03a542015-10-19 04:51:35 +0000908 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
909 return llvm::makeArrayRef(BuiltinInfo,
910 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000911 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000912
Craig Topper3164f332014-03-11 03:39:26 +0000913 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000914
Craig Topper3164f332014-03-11 03:39:26 +0000915 void getTargetDefines(const LangOptions &Opts,
916 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000917
Eric Christopher8c47b422015-10-09 18:39:55 +0000918 bool
919 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
920 StringRef CPU,
921 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000922
Craig Topper3164f332014-03-11 03:39:26 +0000923 bool handleTargetFeatures(std::vector<std::string> &Features,
924 DiagnosticsEngine &Diags) override;
925 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000926 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
927 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000928
Craig Topperf054e3a2015-10-19 03:52:27 +0000929 ArrayRef<const char *> getGCCRegNames() const override;
930 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000931 bool validateAsmConstraint(const char *&Name,
932 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000933 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000934 default: return false;
935 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +0000936 break;
Anders Carlssonf511f642007-11-27 04:11:28 +0000937 case 'b': // Base register
938 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +0000939 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +0000940 break;
941 // FIXME: The following are added to allow parsing.
942 // I just took a guess at what the actions should be.
943 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000944 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +0000945 case 'v': // Altivec vector register
946 Info.setAllowsRegister();
947 break;
948 case 'w':
949 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000950 case 'd':// VSX vector register to hold vector double data
951 case 'f':// VSX vector register to hold vector float data
952 case 's':// VSX vector register to hold scalar float data
953 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +0000954 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +0000955 break;
956 default:
957 return false;
958 }
959 Info.setAllowsRegister();
960 Name++; // Skip over 'w'.
961 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000962 case 'h': // `MQ', `CTR', or `LINK' register
963 case 'q': // `MQ' register
964 case 'c': // `CTR' register
965 case 'l': // `LINK' register
966 case 'x': // `CR' register (condition register) number 0
967 case 'y': // `CR' register (condition register)
968 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +0000969 Info.setAllowsRegister();
970 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000971 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000972 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000973 // (use `L' instead for SImode constants)
974 case 'K': // Unsigned 16-bit constant
975 case 'L': // Signed 16-bit constant shifted left 16 bits
976 case 'M': // Constant larger than 31
977 case 'N': // Exact power of 2
978 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +0000979 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000980 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +0000981 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000982 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +0000983 break;
984 case 'm': // Memory operand. Note that on PowerPC targets, m can
985 // include addresses that update the base register. It
986 // is therefore only safe to use `m' in an asm statement
987 // if that asm statement accesses the operand exactly once.
988 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +0000989 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000990 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +0000991 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000992 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +0000993 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
994 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000995 // register to be updated.
996 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +0000997 if (Name[1] != 's')
998 return false;
Sebastian Redldd008712010-08-17 22:42:34 +0000999 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001000 // include any automodification of the base register. Unlike
1001 // `m', this constraint can be used in asm statements that
1002 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001003 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001004 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001005 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001006 break;
1007 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001008 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001009 case 'Z': // Memory operand that is an indexed or indirect from a
1010 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001011 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001012 Info.setAllowsMemory();
1013 Info.setAllowsRegister();
1014 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001015 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001016 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001017 // register (`p' is preferable for asm statements)
1018 case 'S': // Constant suitable as a 64-bit mask operand
1019 case 'T': // Constant suitable as a 32-bit mask operand
1020 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001021 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001022 // instructions
1023 case 'W': // Vector constant that does not require memory
1024 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001025 break;
1026 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001027 }
John Thompson07a61a42010-06-24 22:44:13 +00001028 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001029 }
Craig Topper3164f332014-03-11 03:39:26 +00001030 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001031 std::string R;
1032 switch (*Constraint) {
1033 case 'e':
1034 case 'w':
1035 // Two-character constraint; add "^" hint for later parsing.
1036 R = std::string("^") + std::string(Constraint, 2);
1037 Constraint++;
1038 break;
1039 default:
1040 return TargetInfo::convertConstraint(Constraint);
1041 }
1042 return R;
1043 }
Craig Topper3164f332014-03-11 03:39:26 +00001044 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001045 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001046 }
Craig Topper3164f332014-03-11 03:39:26 +00001047 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001048 if (RegNo == 0) return 3;
1049 if (RegNo == 1) return 4;
1050 return -1;
1051 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001052
1053 bool hasSjLjLowering() const override {
1054 return true;
1055 }
David Majnemer2617ea62015-06-09 18:05:33 +00001056
1057 bool useFloat128ManglingForLongDouble() const override {
1058 return LongDoubleWidth == 128 &&
1059 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1060 getTriple().isOSBinFormatELF();
1061 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001062};
Anders Carlssonf511f642007-11-27 04:11:28 +00001063
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001064const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001065#define BUILTIN(ID, TYPE, ATTRS) \
1066 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1067#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1068 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001069#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001070};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001071
Eric Christopher917e9522014-11-18 22:36:15 +00001072/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001073/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001074bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001075 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001076 for (const auto &Feature : Features) {
1077 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001078 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001079 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001080 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001081 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001082 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001083 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001084 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001085 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001086 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001087 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001088 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001089 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001090 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001091 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001092 HasHTM = true;
Kit Barton8246f282015-03-25 19:41:41 +00001093 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001094 // TODO: Finish this list and add an assert that we've handled them
1095 // all.
1096 }
Eric Christopher02c33352015-08-25 00:59:11 +00001097
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001098 return true;
1099}
1100
Chris Lattnerecd49032009-03-02 22:27:17 +00001101/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1102/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001103void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001104 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001105 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001106 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001107 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001108 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001109 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001110 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001111 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001112 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001113 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001114 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001115 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001116 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001117
Chris Lattnerecd49032009-03-02 22:27:17 +00001118 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001119 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1120 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001121 } else {
1122 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1123 getTriple().getOS() != llvm::Triple::OpenBSD)
1124 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001125 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001126
Ulrich Weigand8afad612014-07-28 13:17:52 +00001127 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001128 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001129 Builder.defineMacro("_CALL_ELF", "1");
1130 if (ABI == "elfv2")
1131 Builder.defineMacro("_CALL_ELF", "2");
1132
Chris Lattnerecd49032009-03-02 22:27:17 +00001133 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001134 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1135 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001136
Chris Lattnerecd49032009-03-02 22:27:17 +00001137 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001138 if (LongDoubleWidth == 128)
1139 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001140
John Thompsone467e192009-11-19 17:18:50 +00001141 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001142 Builder.defineMacro("__VEC__", "10206");
1143 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001144 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001145
1146 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001147 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1148 .Case("440", ArchDefineName)
1149 .Case("450", ArchDefineName | ArchDefine440)
1150 .Case("601", ArchDefineName)
1151 .Case("602", ArchDefineName | ArchDefinePpcgr)
1152 .Case("603", ArchDefineName | ArchDefinePpcgr)
1153 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1154 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1155 .Case("604", ArchDefineName | ArchDefinePpcgr)
1156 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1157 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001158 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001159 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1160 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1161 .Case("750", ArchDefineName | ArchDefinePpcgr)
1162 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1163 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001164 .Case("a2", ArchDefineA2)
1165 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001166 .Case("pwr3", ArchDefinePpcgr)
1167 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1168 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1169 | ArchDefinePpcsq)
1170 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1171 | ArchDefinePpcgr | ArchDefinePpcsq)
1172 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1173 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1174 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1175 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1176 | ArchDefinePpcsq)
1177 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1178 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001179 | ArchDefinePpcgr | ArchDefinePpcsq)
1180 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1181 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1182 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001183 .Case("power3", ArchDefinePpcgr)
1184 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1185 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1186 | ArchDefinePpcsq)
1187 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1188 | ArchDefinePpcgr | ArchDefinePpcsq)
1189 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1190 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1191 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1192 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1193 | ArchDefinePpcsq)
1194 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1195 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001196 | ArchDefinePpcgr | ArchDefinePpcsq)
1197 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1198 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1199 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001200 .Default(ArchDefineNone);
1201
1202 if (defs & ArchDefineName)
1203 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1204 if (defs & ArchDefinePpcgr)
1205 Builder.defineMacro("_ARCH_PPCGR");
1206 if (defs & ArchDefinePpcsq)
1207 Builder.defineMacro("_ARCH_PPCSQ");
1208 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001209 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001210 if (defs & ArchDefine603)
1211 Builder.defineMacro("_ARCH_603");
1212 if (defs & ArchDefine604)
1213 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001214 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001215 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001216 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001217 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001218 if (defs & ArchDefinePwr5x)
1219 Builder.defineMacro("_ARCH_PWR5X");
1220 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001221 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001222 if (defs & ArchDefinePwr6x)
1223 Builder.defineMacro("_ARCH_PWR6X");
1224 if (defs & ArchDefinePwr7)
1225 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001226 if (defs & ArchDefinePwr8)
1227 Builder.defineMacro("_ARCH_PWR8");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001228 if (defs & ArchDefineA2)
1229 Builder.defineMacro("_ARCH_A2");
1230 if (defs & ArchDefineA2q) {
1231 Builder.defineMacro("_ARCH_A2Q");
1232 Builder.defineMacro("_ARCH_QP");
1233 }
1234
1235 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1236 Builder.defineMacro("__bg__");
1237 Builder.defineMacro("__THW_BLUEGENE__");
1238 Builder.defineMacro("__bgq__");
1239 Builder.defineMacro("__TOS_BGQ__");
1240 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001241
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001242 if (HasVSX)
1243 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001244 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001245 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001246 if (HasP8Crypto)
1247 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001248 if (HasHTM)
1249 Builder.defineMacro("__HTM__");
Hal Finkela57b8902015-10-01 13:39:49 +00001250
1251 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1252 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1253 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1254 if (PointerWidth == 64)
1255 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001256
Bill Schmidt38378a02013-02-01 20:23:10 +00001257 // FIXME: The following are not yet generated here by Clang, but are
1258 // generated by GCC:
1259 //
1260 // _SOFT_FLOAT_
1261 // __RECIP_PRECISION__
1262 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001263 // __RECIP__
1264 // __RECIPF__
1265 // __RSQRTE__
1266 // __RSQRTEF__
1267 // _SOFT_DOUBLE_
1268 // __NO_LWSYNC__
1269 // __HAVE_BSWAP__
1270 // __LONGDOUBLE128
1271 // __CMODEL_MEDIUM__
1272 // __CMODEL_LARGE__
1273 // _CALL_SYSV
1274 // _CALL_DARWIN
1275 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001276}
1277
Eric Christophera8a14c32015-08-31 18:39:16 +00001278// Handle explicit options being passed to the compiler here: if we've
1279// explicitly turned off vsx and turned on power8-vector or direct-move then
1280// go ahead and error since the customer has expressed a somewhat incompatible
1281// set of options.
1282static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001283 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001284
1285 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1286 FeaturesVec.end()) {
1287 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1288 FeaturesVec.end()) {
1289 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1290 << "-mno-vsx";
1291 return false;
1292 }
1293
1294 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1295 FeaturesVec.end()) {
1296 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1297 << "-mno-vsx";
1298 return false;
1299 }
1300 }
1301
1302 return true;
1303}
1304
Eric Christopher8c47b422015-10-09 18:39:55 +00001305bool PPCTargetInfo::initFeatureMap(
1306 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1307 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001308 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1309 .Case("7400", true)
1310 .Case("g4", true)
1311 .Case("7450", true)
1312 .Case("g4+", true)
1313 .Case("970", true)
1314 .Case("g5", true)
1315 .Case("pwr6", true)
1316 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001317 .Case("pwr8", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001318 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001319 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001320 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001321
1322 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001323 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1324 .Case("ppc64le", true)
1325 .Case("pwr8", true)
1326 .Default(false);
1327 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1328 .Case("ppc64le", true)
1329 .Case("pwr8", true)
1330 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001331 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1332 .Case("ppc64le", true)
1333 .Case("pwr8", true)
1334 .Case("pwr7", true)
1335 .Default(false);
1336 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1337 .Case("ppc64le", true)
1338 .Case("pwr8", true)
1339 .Case("pwr7", true)
1340 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001341 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1342 .Case("ppc64le", true)
1343 .Case("pwr8", true)
1344 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001345 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1346 .Case("ppc64le", true)
1347 .Case("pwr8", true)
1348 .Case("pwr7", true)
1349 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001350
Eric Christophera8a14c32015-08-31 18:39:16 +00001351 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1352 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001353
Eric Christopher007b0a02015-08-28 22:32:01 +00001354 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001355}
1356
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001357bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001358 return llvm::StringSwitch<bool>(Feature)
1359 .Case("powerpc", true)
1360 .Case("vsx", HasVSX)
1361 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001362 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001363 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001364 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001365 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001366 .Case("bpermd", HasBPERMD)
1367 .Case("extdiv", HasExtDiv)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001368 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001369}
Chris Lattner17df24e2008-04-21 18:56:49 +00001370
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001371void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1372 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001373 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1374 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1375 // incompatible options.
1376 if (Enabled) {
1377 if (Name == "vsx") {
1378 Features[Name] = true;
1379 } else if (Name == "direct-move") {
1380 Features[Name] = Features["vsx"] = true;
1381 } else if (Name == "power8-vector") {
1382 Features[Name] = Features["vsx"] = true;
1383 } else {
1384 Features[Name] = true;
1385 }
1386 } else {
1387 if (Name == "vsx") {
1388 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
1389 false;
1390 } else {
1391 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001392 }
1393 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001394}
1395
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001396const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001397 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1398 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1399 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1400 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1401 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1402 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1403 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1404 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001405 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001406 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001407 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001408 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1409 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1410 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1411 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001412 "vrsave", "vscr",
1413 "spe_acc", "spefscr",
1414 "sfp"
1415};
Chris Lattner10a5b382007-01-29 05:24:35 +00001416
Craig Topperf054e3a2015-10-19 03:52:27 +00001417ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1418 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001419}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001420
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001421const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1422 // While some of these aliases do map to different registers
1423 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001424 { { "0" }, "r0" },
1425 { { "1"}, "r1" },
1426 { { "2" }, "r2" },
1427 { { "3" }, "r3" },
1428 { { "4" }, "r4" },
1429 { { "5" }, "r5" },
1430 { { "6" }, "r6" },
1431 { { "7" }, "r7" },
1432 { { "8" }, "r8" },
1433 { { "9" }, "r9" },
1434 { { "10" }, "r10" },
1435 { { "11" }, "r11" },
1436 { { "12" }, "r12" },
1437 { { "13" }, "r13" },
1438 { { "14" }, "r14" },
1439 { { "15" }, "r15" },
1440 { { "16" }, "r16" },
1441 { { "17" }, "r17" },
1442 { { "18" }, "r18" },
1443 { { "19" }, "r19" },
1444 { { "20" }, "r20" },
1445 { { "21" }, "r21" },
1446 { { "22" }, "r22" },
1447 { { "23" }, "r23" },
1448 { { "24" }, "r24" },
1449 { { "25" }, "r25" },
1450 { { "26" }, "r26" },
1451 { { "27" }, "r27" },
1452 { { "28" }, "r28" },
1453 { { "29" }, "r29" },
1454 { { "30" }, "r30" },
1455 { { "31" }, "r31" },
1456 { { "fr0" }, "f0" },
1457 { { "fr1" }, "f1" },
1458 { { "fr2" }, "f2" },
1459 { { "fr3" }, "f3" },
1460 { { "fr4" }, "f4" },
1461 { { "fr5" }, "f5" },
1462 { { "fr6" }, "f6" },
1463 { { "fr7" }, "f7" },
1464 { { "fr8" }, "f8" },
1465 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001466 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001467 { { "fr11" }, "f11" },
1468 { { "fr12" }, "f12" },
1469 { { "fr13" }, "f13" },
1470 { { "fr14" }, "f14" },
1471 { { "fr15" }, "f15" },
1472 { { "fr16" }, "f16" },
1473 { { "fr17" }, "f17" },
1474 { { "fr18" }, "f18" },
1475 { { "fr19" }, "f19" },
1476 { { "fr20" }, "f20" },
1477 { { "fr21" }, "f21" },
1478 { { "fr22" }, "f22" },
1479 { { "fr23" }, "f23" },
1480 { { "fr24" }, "f24" },
1481 { { "fr25" }, "f25" },
1482 { { "fr26" }, "f26" },
1483 { { "fr27" }, "f27" },
1484 { { "fr28" }, "f28" },
1485 { { "fr29" }, "f29" },
1486 { { "fr30" }, "f30" },
1487 { { "fr31" }, "f31" },
1488 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001489};
1490
Craig Topperf054e3a2015-10-19 03:52:27 +00001491ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1492 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001493}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001494
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001495class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001496public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001497 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001498 DataLayoutString = "E-m:e-p:32:32-i64:64-n32";
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001499
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001500 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001501 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001502 case llvm::Triple::FreeBSD:
1503 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001504 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001505 PtrDiffType = SignedInt;
1506 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001507 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001508 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001509 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001510 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001511
Roman Divacky3ffe7462012-03-13 19:20:17 +00001512 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1513 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001514 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001515 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001516
1517 // PPC32 supports atomics up to 4 bytes.
1518 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001519 }
1520
Craig Topper3164f332014-03-11 03:39:26 +00001521 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001522 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001523 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001524 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001525};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001526
Bill Schmidt778d3872013-07-26 01:36:11 +00001527// Note: ABI differences may eventually require us to have a separate
1528// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001529class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001530public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001531 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001532 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001533 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001534 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001535
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001536 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001537 DataLayoutString = "e-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001538 ABI = "elfv2";
1539 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001540 DataLayoutString = "E-m:e-i64:64-n32:64";
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001541 ABI = "elfv1";
1542 }
1543
1544 switch (getTriple().getOS()) {
1545 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001546 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001547 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001548 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001549 case llvm::Triple::NetBSD:
1550 IntMaxType = SignedLongLong;
1551 Int64Type = SignedLongLong;
1552 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001553 default:
1554 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001555 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001556
1557 // PPC64 supports atomics up to 8 bytes.
1558 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001559 }
Craig Topper3164f332014-03-11 03:39:26 +00001560 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001561 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001562 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001563 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001564 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001565 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001566 ABI = Name;
1567 return true;
1568 }
1569 return false;
1570 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001571};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001572
Roman Divacky965b0b72011-01-06 08:27:10 +00001573class DarwinPPC32TargetInfo :
1574 public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001575public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001576 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1577 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001578 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001579 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001580 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001581 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001582 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001583 DataLayoutString = "E-m:o-p:32:32-f64:32:64-n32";
Roman Divacky965b0b72011-01-06 08:27:10 +00001584 }
Craig Topper3164f332014-03-11 03:39:26 +00001585 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001586 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001587 }
1588};
1589
1590class DarwinPPC64TargetInfo :
1591 public DarwinTargetInfo<PPC64TargetInfo> {
1592public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00001593 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1594 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001595 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001596 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00001597 DataLayoutString = "E-m:o-i64:64-n32:64";
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001598 }
1599};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001600
Eric Christopherc48497a2015-09-18 21:26:24 +00001601static const unsigned NVPTXAddrSpaceMap[] = {
1602 1, // opencl_global
1603 3, // opencl_local
1604 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001605 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001606 0, // opencl_generic
1607 1, // cuda_device
1608 4, // cuda_constant
1609 3, // cuda_shared
1610};
1611
1612class NVPTXTargetInfo : public TargetInfo {
1613 static const char *const GCCRegNames[];
1614 static const Builtin::Info BuiltinInfo[];
Reid Klecknerbbc01782014-12-03 21:53:36 +00001615
1616 // The GPU profiles supported by the NVPTX backend
1617 enum GPUKind {
1618 GK_NONE,
1619 GK_SM20,
1620 GK_SM21,
1621 GK_SM30,
1622 GK_SM35,
Eli Bendersky7a0d8912015-03-31 17:03:16 +00001623 GK_SM37,
Reid Klecknerbbc01782014-12-03 21:53:36 +00001624 } GPU;
1625
Eric Christopherc48497a2015-09-18 21:26:24 +00001626public:
1627 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1628 BigEndian = false;
1629 TLSSupported = false;
1630 LongWidth = LongAlign = 64;
1631 AddrSpaceMap = &NVPTXAddrSpaceMap;
1632 UseAddrSpaceMapMangling = true;
1633 // Define available target features
1634 // These must be defined in sorted order!
1635 NoAsmVariants = true;
1636 // Set the default GPU to sm20
1637 GPU = GK_SM20;
1638 }
1639 void getTargetDefines(const LangOptions &Opts,
1640 MacroBuilder &Builder) const override {
1641 Builder.defineMacro("__PTX__");
1642 Builder.defineMacro("__NVPTX__");
1643 if (Opts.CUDAIsDevice) {
1644 // Set __CUDA_ARCH__ for the GPU specified.
1645 std::string CUDAArchCode;
1646 switch (GPU) {
1647 case GK_SM20:
1648 CUDAArchCode = "200";
1649 break;
1650 case GK_SM21:
1651 CUDAArchCode = "210";
1652 break;
1653 case GK_SM30:
1654 CUDAArchCode = "300";
1655 break;
1656 case GK_SM35:
1657 CUDAArchCode = "350";
1658 break;
1659 case GK_SM37:
1660 CUDAArchCode = "370";
1661 break;
1662 default:
1663 llvm_unreachable("Unhandled target CPU");
Reid Klecknerbbc01782014-12-03 21:53:36 +00001664 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001665 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001666 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001667 }
Craig Topper6c03a542015-10-19 04:51:35 +00001668 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1669 return llvm::makeArrayRef(BuiltinInfo,
1670 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001671 }
1672 bool hasFeature(StringRef Feature) const override {
1673 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001674 }
1675
Craig Topperf054e3a2015-10-19 03:52:27 +00001676 ArrayRef<const char *> getGCCRegNames() const override;
1677 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001678 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001679 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001680 }
1681 bool validateAsmConstraint(const char *&Name,
1682 TargetInfo::ConstraintInfo &Info) const override {
1683 switch (*Name) {
1684 default:
1685 return false;
1686 case 'c':
1687 case 'h':
1688 case 'r':
1689 case 'l':
1690 case 'f':
1691 case 'd':
1692 Info.setAllowsRegister();
1693 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001694 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001695 }
1696 const char *getClobbers() const override {
1697 // FIXME: Is this really right?
1698 return "";
1699 }
1700 BuiltinVaListKind getBuiltinVaListKind() const override {
1701 // FIXME: implement
1702 return TargetInfo::CharPtrBuiltinVaList;
1703 }
1704 bool setCPU(const std::string &Name) override {
1705 GPU = llvm::StringSwitch<GPUKind>(Name)
1706 .Case("sm_20", GK_SM20)
1707 .Case("sm_21", GK_SM21)
1708 .Case("sm_30", GK_SM30)
1709 .Case("sm_35", GK_SM35)
1710 .Case("sm_37", GK_SM37)
1711 .Default(GK_NONE);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001712
Eric Christopherc48497a2015-09-18 21:26:24 +00001713 return GPU != GK_NONE;
1714 }
1715};
1716
1717const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1718#define BUILTIN(ID, TYPE, ATTRS) \
1719 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1720#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1721 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1722#include "clang/Basic/BuiltinsNVPTX.def"
1723};
1724
1725const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1726
Craig Topperf054e3a2015-10-19 03:52:27 +00001727ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1728 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001729}
1730
1731class NVPTX32TargetInfo : public NVPTXTargetInfo {
1732public:
1733 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001734 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001735 PointerWidth = PointerAlign = 32;
1736 SizeType = TargetInfo::UnsignedInt;
1737 PtrDiffType = TargetInfo::SignedInt;
1738 IntPtrType = TargetInfo::SignedInt;
1739 DataLayoutString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
1740 }
1741};
1742
1743class NVPTX64TargetInfo : public NVPTXTargetInfo {
1744public:
1745 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1746 PointerWidth = PointerAlign = 64;
1747 SizeType = TargetInfo::UnsignedLong;
1748 PtrDiffType = TargetInfo::SignedLong;
1749 IntPtrType = TargetInfo::SignedLong;
1750 DataLayoutString = "e-i64:64-v16:16-v32:32-n16:32:64";
1751 }
1752};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001753
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001754static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001755 1, // opencl_global
1756 3, // opencl_local
1757 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001758 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001759 1, // cuda_device
1760 2, // cuda_constant
1761 3 // cuda_shared
1762};
1763
Tom Stellarda96344b2014-08-21 13:58:40 +00001764// If you edit the description strings, make sure you update
1765// getPointerWidthV().
1766
Craig Topper273dbc62015-10-18 05:29:26 +00001767static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001768 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1769 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001770
Craig Topper273dbc62015-10-18 05:29:26 +00001771static const char *const DataLayoutStringR600DoubleOps =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001772 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1773 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001774
Craig Topper273dbc62015-10-18 05:29:26 +00001775static const char *const DataLayoutStringSI =
Matt Arsenault23e7b082014-05-22 18:33:55 +00001776 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001777 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1778 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001779
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001780class AMDGPUTargetInfo : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001781 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001782 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001783
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001784 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001785 enum GPUKind {
1786 GK_NONE,
1787 GK_R600,
1788 GK_R600_DOUBLE_OPS,
1789 GK_R700,
1790 GK_R700_DOUBLE_OPS,
1791 GK_EVERGREEN,
1792 GK_EVERGREEN_DOUBLE_OPS,
1793 GK_NORTHERN_ISLANDS,
1794 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001795 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001796 GK_SEA_ISLANDS,
1797 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001798 } GPU;
1799
Jan Veselyeebeaea2015-05-04 19:53:36 +00001800 bool hasFP64:1;
1801 bool hasFMAF:1;
1802 bool hasLDEXPF:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001803
Eli Friedmand13b41e2012-10-12 23:32:00 +00001804public:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001805 AMDGPUTargetInfo(const llvm::Triple &Triple)
1806 : TargetInfo(Triple) {
Tom Stellardd99fb952015-01-28 15:38:44 +00001807
1808 if (Triple.getArch() == llvm::Triple::amdgcn) {
Eric Christopher964a5f32015-08-05 23:48:05 +00001809 DataLayoutString = DataLayoutStringSI;
Tom Stellardd99fb952015-01-28 15:38:44 +00001810 GPU = GK_SOUTHERN_ISLANDS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001811 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001812 hasFMAF = true;
1813 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001814 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00001815 DataLayoutString = DataLayoutStringR600;
Tom Stellardd99fb952015-01-28 15:38:44 +00001816 GPU = GK_R600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001817 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001818 hasFMAF = false;
1819 hasLDEXPF = false;
Tom Stellardd99fb952015-01-28 15:38:44 +00001820 }
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001821 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001822 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001823 }
1824
Tom Stellarda96344b2014-08-21 13:58:40 +00001825 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1826 if (GPU <= GK_CAYMAN)
1827 return 32;
1828
1829 switch(AddrSpace) {
1830 default:
1831 return 64;
1832 case 0:
1833 case 3:
1834 case 5:
1835 return 32;
1836 }
1837 }
1838
Craig Topper3164f332014-03-11 03:39:26 +00001839 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001840 return "";
1841 }
1842
Craig Topperf054e3a2015-10-19 03:52:27 +00001843 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001844
Craig Topperf054e3a2015-10-19 03:52:27 +00001845 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
1846 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001847 }
1848
Craig Topper3164f332014-03-11 03:39:26 +00001849 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00001850 TargetInfo::ConstraintInfo &Info) const override {
1851 switch (*Name) {
1852 default: break;
1853 case 'v': // vgpr
1854 case 's': // sgpr
1855 Info.setAllowsRegister();
1856 return true;
1857 }
1858 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001859 }
1860
Craig Topper6c03a542015-10-19 04:51:35 +00001861 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1862 return llvm::makeArrayRef(BuiltinInfo,
1863 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00001864 }
1865
Craig Topper3164f332014-03-11 03:39:26 +00001866 void getTargetDefines(const LangOptions &Opts,
1867 MacroBuilder &Builder) const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001868 Builder.defineMacro("__R600__");
Jan Veselyeebeaea2015-05-04 19:53:36 +00001869 if (hasFMAF)
1870 Builder.defineMacro("__HAS_FMAF__");
1871 if (hasLDEXPF)
1872 Builder.defineMacro("__HAS_LDEXPF__");
Tom Stellard22041372015-07-17 13:16:52 +00001873 if (hasFP64 && Opts.OpenCL)
Tom Stellardfded50f2015-02-27 15:10:19 +00001874 Builder.defineMacro("cl_khr_fp64");
Tom Stellard22041372015-07-17 13:16:52 +00001875 if (Opts.OpenCL) {
1876 if (GPU >= GK_NORTHERN_ISLANDS) {
1877 Builder.defineMacro("cl_khr_byte_addressable_store");
1878 Builder.defineMacro("cl_khr_global_int32_base_atomics");
1879 Builder.defineMacro("cl_khr_global_int32_extended_atomics");
1880 Builder.defineMacro("cl_khr_local_int32_base_atomics");
1881 Builder.defineMacro("cl_khr_local_int32_extended_atomics");
1882 }
Jan Veselya3abd6d2015-05-01 17:38:13 +00001883 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001884 }
1885
Craig Topper3164f332014-03-11 03:39:26 +00001886 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001887 return TargetInfo::CharPtrBuiltinVaList;
1888 }
1889
Craig Topper3164f332014-03-11 03:39:26 +00001890 bool setCPU(const std::string &Name) override {
Tom Stellardc74b1e02013-03-04 17:40:53 +00001891 GPU = llvm::StringSwitch<GPUKind>(Name)
1892 .Case("r600" , GK_R600)
1893 .Case("rv610", GK_R600)
1894 .Case("rv620", GK_R600)
1895 .Case("rv630", GK_R600)
1896 .Case("rv635", GK_R600)
1897 .Case("rs780", GK_R600)
1898 .Case("rs880", GK_R600)
1899 .Case("rv670", GK_R600_DOUBLE_OPS)
1900 .Case("rv710", GK_R700)
1901 .Case("rv730", GK_R700)
1902 .Case("rv740", GK_R700_DOUBLE_OPS)
1903 .Case("rv770", GK_R700_DOUBLE_OPS)
1904 .Case("palm", GK_EVERGREEN)
1905 .Case("cedar", GK_EVERGREEN)
1906 .Case("sumo", GK_EVERGREEN)
1907 .Case("sumo2", GK_EVERGREEN)
1908 .Case("redwood", GK_EVERGREEN)
1909 .Case("juniper", GK_EVERGREEN)
1910 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1911 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1912 .Case("barts", GK_NORTHERN_ISLANDS)
1913 .Case("turks", GK_NORTHERN_ISLANDS)
1914 .Case("caicos", GK_NORTHERN_ISLANDS)
1915 .Case("cayman", GK_CAYMAN)
1916 .Case("aruba", GK_CAYMAN)
Tom Stellard785699322013-04-01 20:56:49 +00001917 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001918 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1919 .Case("verde", GK_SOUTHERN_ISLANDS)
1920 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00001921 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00001922 .Case("bonaire", GK_SEA_ISLANDS)
1923 .Case("kabini", GK_SEA_ISLANDS)
1924 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00001925 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00001926 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00001927 .Case("tonga", GK_VOLCANIC_ISLANDS)
1928 .Case("iceland", GK_VOLCANIC_ISLANDS)
1929 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00001930 .Default(GK_NONE);
1931
1932 if (GPU == GK_NONE) {
1933 return false;
1934 }
1935
1936 // Set the correct data layout
1937 switch (GPU) {
1938 case GK_NONE:
1939 case GK_R600:
1940 case GK_R700:
1941 case GK_EVERGREEN:
1942 case GK_NORTHERN_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001943 DataLayoutString = DataLayoutStringR600;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001944 hasFP64 = false;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001945 hasFMAF = false;
1946 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001947 break;
1948 case GK_R600_DOUBLE_OPS:
1949 case GK_R700_DOUBLE_OPS:
1950 case GK_EVERGREEN_DOUBLE_OPS:
1951 case GK_CAYMAN:
Eric Christopher964a5f32015-08-05 23:48:05 +00001952 DataLayoutString = DataLayoutStringR600DoubleOps;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001953 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001954 hasFMAF = true;
1955 hasLDEXPF = false;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001956 break;
1957 case GK_SOUTHERN_ISLANDS:
Tom Stellard08ded122013-10-29 16:38:29 +00001958 case GK_SEA_ISLANDS:
Tom Stellard64e0dd02015-06-18 21:13:29 +00001959 case GK_VOLCANIC_ISLANDS:
Eric Christopher964a5f32015-08-05 23:48:05 +00001960 DataLayoutString = DataLayoutStringSI;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001961 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001962 hasFMAF = true;
1963 hasLDEXPF = true;
Tom Stellardc74b1e02013-03-04 17:40:53 +00001964 break;
1965 }
1966
1967 return true;
1968 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00001969};
1970
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001971const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001972#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00001973 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001974#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00001975};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001976const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00001977 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1978 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1979 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1980 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1981 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
1982 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
1983 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
1984 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
1985 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
1986 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
1987 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
1988 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
1989 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
1990 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
1991 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
1992 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
1993 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
1994 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
1995 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
1996 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
1997 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
1998 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
1999 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2000 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2001 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2002 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2003 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2004 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2005 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2006 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2007 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2008 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2009 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2010 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2011 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2012 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2013 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2014 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2015 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2016 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2017 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2018 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2019 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2020 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2021 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2022 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2023 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
2024 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127"
2025 "exec", "vcc", "scc", "m0", "flat_scr", "exec_lo", "exec_hi",
2026 "vcc_lo", "vcc_hi", "flat_scr_lo", "flat_scr_hi"
2027};
2028
Craig Topperf054e3a2015-10-19 03:52:27 +00002029ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2030 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002031}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002032
Eli Friedman3fd920a2008-08-20 02:34:37 +00002033// Namespace for x86 abstract base class
2034const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002035#define BUILTIN(ID, TYPE, ATTRS) \
2036 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002037#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002038 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002039#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002040 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002041#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002042};
Eli Friedmanb5366062008-05-20 14:21:01 +00002043
Nuno Lopescfca1f02009-12-23 17:49:57 +00002044static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002045 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2046 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002047 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002048 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2049 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2050 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002051 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002052 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2053 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002054 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2055 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2056 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2057 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2058 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2059 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2060 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2061 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002062};
2063
Eric Christophercdd36352011-06-21 00:05:20 +00002064const TargetInfo::AddlRegName AddlRegNames[] = {
2065 { { "al", "ah", "eax", "rax" }, 0 },
2066 { { "bl", "bh", "ebx", "rbx" }, 3 },
2067 { { "cl", "ch", "ecx", "rcx" }, 2 },
2068 { { "dl", "dh", "edx", "rdx" }, 1 },
2069 { { "esi", "rsi" }, 4 },
2070 { { "edi", "rdi" }, 5 },
2071 { { "esp", "rsp" }, 7 },
2072 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002073 { { "r8d", "r8w", "r8b" }, 38 },
2074 { { "r9d", "r9w", "r9b" }, 39 },
2075 { { "r10d", "r10w", "r10b" }, 40 },
2076 { { "r11d", "r11w", "r11b" }, 41 },
2077 { { "r12d", "r12w", "r12b" }, 42 },
2078 { { "r13d", "r13w", "r13b" }, 43 },
2079 { { "r14d", "r14w", "r14b" }, 44 },
2080 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002081};
2082
2083// X86 target abstract base class; x86-32 and x86-64 are very close, so
2084// most of the implementation can be shared.
2085class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002086 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002087 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002088 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002089 enum MMX3DNowEnum {
2090 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002091 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002092 enum XOPEnum {
2093 NoXOP,
2094 SSE4A,
2095 FMA4,
2096 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002097 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002098
Craig Topper543f3bd2015-10-14 23:47:57 +00002099 bool HasAES = false;
2100 bool HasPCLMUL = false;
2101 bool HasLZCNT = false;
2102 bool HasRDRND = false;
2103 bool HasFSGSBASE = false;
2104 bool HasBMI = false;
2105 bool HasBMI2 = false;
2106 bool HasPOPCNT = false;
2107 bool HasRTM = false;
2108 bool HasPRFCHW = false;
2109 bool HasRDSEED = false;
2110 bool HasADX = false;
2111 bool HasTBM = false;
2112 bool HasFMA = false;
2113 bool HasF16C = false;
2114 bool HasAVX512CD = false;
2115 bool HasAVX512ER = false;
2116 bool HasAVX512PF = false;
2117 bool HasAVX512DQ = false;
2118 bool HasAVX512BW = false;
2119 bool HasAVX512VL = false;
2120 bool HasSHA = false;
2121 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002122 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002123 bool HasXSAVE = false;
2124 bool HasXSAVEOPT = false;
2125 bool HasXSAVEC = false;
2126 bool HasXSAVES = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002127 bool HasPKU = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002128
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002129 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2130 ///
2131 /// Each enumeration represents a particular CPU supported by Clang. These
2132 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2133 enum CPUKind {
2134 CK_Generic,
2135
2136 /// \name i386
2137 /// i386-generation processors.
2138 //@{
2139 CK_i386,
2140 //@}
2141
2142 /// \name i486
2143 /// i486-generation processors.
2144 //@{
2145 CK_i486,
2146 CK_WinChipC6,
2147 CK_WinChip2,
2148 CK_C3,
2149 //@}
2150
2151 /// \name i586
2152 /// i586-generation processors, P5 microarchitecture based.
2153 //@{
2154 CK_i586,
2155 CK_Pentium,
2156 CK_PentiumMMX,
2157 //@}
2158
2159 /// \name i686
2160 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2161 //@{
2162 CK_i686,
2163 CK_PentiumPro,
2164 CK_Pentium2,
2165 CK_Pentium3,
2166 CK_Pentium3M,
2167 CK_PentiumM,
2168 CK_C3_2,
2169
2170 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2171 /// Clang however has some logic to suport this.
2172 // FIXME: Warn, deprecate, and potentially remove this.
2173 CK_Yonah,
2174 //@}
2175
2176 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002177 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002178 //@{
2179 CK_Pentium4,
2180 CK_Pentium4M,
2181 CK_Prescott,
2182 CK_Nocona,
2183 //@}
2184
2185 /// \name Core
2186 /// Core microarchitecture based processors.
2187 //@{
2188 CK_Core2,
2189
2190 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2191 /// codename which GCC no longer accepts as an option to -march, but Clang
2192 /// has some logic for recognizing it.
2193 // FIXME: Warn, deprecate, and potentially remove this.
2194 CK_Penryn,
2195 //@}
2196
2197 /// \name Atom
2198 /// Atom processors
2199 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002200 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002201 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002202 //@}
2203
2204 /// \name Nehalem
2205 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002206 CK_Nehalem,
2207
2208 /// \name Westmere
2209 /// Westmere microarchitecture based processors.
2210 CK_Westmere,
2211
2212 /// \name Sandy Bridge
2213 /// Sandy Bridge microarchitecture based processors.
2214 CK_SandyBridge,
2215
2216 /// \name Ivy Bridge
2217 /// Ivy Bridge microarchitecture based processors.
2218 CK_IvyBridge,
2219
2220 /// \name Haswell
2221 /// Haswell microarchitecture based processors.
2222 CK_Haswell,
2223
2224 /// \name Broadwell
2225 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002226 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002227
2228 /// \name Skylake
2229 /// Skylake microarchitecture based processors.
2230 CK_Skylake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002231
Craig Topper449314e2013-08-20 07:09:39 +00002232 /// \name Knights Landing
2233 /// Knights Landing processor.
2234 CK_KNL,
2235
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002236 /// \name K6
2237 /// K6 architecture processors.
2238 //@{
2239 CK_K6,
2240 CK_K6_2,
2241 CK_K6_3,
2242 //@}
2243
2244 /// \name K7
2245 /// K7 architecture processors.
2246 //@{
2247 CK_Athlon,
2248 CK_AthlonThunderbird,
2249 CK_Athlon4,
2250 CK_AthlonXP,
2251 CK_AthlonMP,
2252 //@}
2253
2254 /// \name K8
2255 /// K8 architecture processors.
2256 //@{
2257 CK_Athlon64,
2258 CK_Athlon64SSE3,
2259 CK_AthlonFX,
2260 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002261 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002262 CK_Opteron,
2263 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002264 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002265 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002266
Benjamin Kramer569f2152012-01-10 11:50:18 +00002267 /// \name Bobcat
2268 /// Bobcat architecture processors.
2269 //@{
2270 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002271 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002272 //@}
2273
2274 /// \name Bulldozer
2275 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002276 //@{
2277 CK_BDVER1,
2278 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002279 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002280 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002281 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002282
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002283 /// This specification is deprecated and will be removed in the future.
2284 /// Users should prefer \see CK_K8.
2285 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002286 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002287 CK_x86_64,
2288 //@}
2289
2290 /// \name Geode
2291 /// Geode processors.
2292 //@{
2293 CK_Geode
2294 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002295 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002296
Eric Christopherc50738f2015-08-27 00:05:50 +00002297 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002298 return llvm::StringSwitch<CPUKind>(CPU)
2299 .Case("i386", CK_i386)
2300 .Case("i486", CK_i486)
2301 .Case("winchip-c6", CK_WinChipC6)
2302 .Case("winchip2", CK_WinChip2)
2303 .Case("c3", CK_C3)
2304 .Case("i586", CK_i586)
2305 .Case("pentium", CK_Pentium)
2306 .Case("pentium-mmx", CK_PentiumMMX)
2307 .Case("i686", CK_i686)
2308 .Case("pentiumpro", CK_PentiumPro)
2309 .Case("pentium2", CK_Pentium2)
2310 .Case("pentium3", CK_Pentium3)
2311 .Case("pentium3m", CK_Pentium3M)
2312 .Case("pentium-m", CK_PentiumM)
2313 .Case("c3-2", CK_C3_2)
2314 .Case("yonah", CK_Yonah)
2315 .Case("pentium4", CK_Pentium4)
2316 .Case("pentium4m", CK_Pentium4M)
2317 .Case("prescott", CK_Prescott)
2318 .Case("nocona", CK_Nocona)
2319 .Case("core2", CK_Core2)
2320 .Case("penryn", CK_Penryn)
2321 .Case("bonnell", CK_Bonnell)
2322 .Case("atom", CK_Bonnell) // Legacy name.
2323 .Case("silvermont", CK_Silvermont)
2324 .Case("slm", CK_Silvermont) // Legacy name.
2325 .Case("nehalem", CK_Nehalem)
2326 .Case("corei7", CK_Nehalem) // Legacy name.
2327 .Case("westmere", CK_Westmere)
2328 .Case("sandybridge", CK_SandyBridge)
2329 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2330 .Case("ivybridge", CK_IvyBridge)
2331 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2332 .Case("haswell", CK_Haswell)
2333 .Case("core-avx2", CK_Haswell) // Legacy name.
2334 .Case("broadwell", CK_Broadwell)
2335 .Case("skylake", CK_Skylake)
2336 .Case("skx", CK_Skylake) // Legacy name.
2337 .Case("knl", CK_KNL)
2338 .Case("k6", CK_K6)
2339 .Case("k6-2", CK_K6_2)
2340 .Case("k6-3", CK_K6_3)
2341 .Case("athlon", CK_Athlon)
2342 .Case("athlon-tbird", CK_AthlonThunderbird)
2343 .Case("athlon-4", CK_Athlon4)
2344 .Case("athlon-xp", CK_AthlonXP)
2345 .Case("athlon-mp", CK_AthlonMP)
2346 .Case("athlon64", CK_Athlon64)
2347 .Case("athlon64-sse3", CK_Athlon64SSE3)
2348 .Case("athlon-fx", CK_AthlonFX)
2349 .Case("k8", CK_K8)
2350 .Case("k8-sse3", CK_K8SSE3)
2351 .Case("opteron", CK_Opteron)
2352 .Case("opteron-sse3", CK_OpteronSSE3)
2353 .Case("barcelona", CK_AMDFAM10)
2354 .Case("amdfam10", CK_AMDFAM10)
2355 .Case("btver1", CK_BTVER1)
2356 .Case("btver2", CK_BTVER2)
2357 .Case("bdver1", CK_BDVER1)
2358 .Case("bdver2", CK_BDVER2)
2359 .Case("bdver3", CK_BDVER3)
2360 .Case("bdver4", CK_BDVER4)
2361 .Case("x86-64", CK_x86_64)
2362 .Case("geode", CK_Geode)
2363 .Default(CK_Generic);
2364 }
2365
Rafael Espindolaeb265472013-08-21 21:59:03 +00002366 enum FPMathKind {
2367 FP_Default,
2368 FP_SSE,
2369 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002370 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002371
Eli Friedman3fd920a2008-08-20 02:34:37 +00002372public:
Craig Topper543f3bd2015-10-14 23:47:57 +00002373 X86TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002374 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002375 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002376 }
Craig Topper3164f332014-03-11 03:39:26 +00002377 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002378 // X87 evaluates with 80 bits "long double" precision.
2379 return SSELevel == NoSSE ? 2 : 0;
2380 }
Craig Topper6c03a542015-10-19 04:51:35 +00002381 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2382 return llvm::makeArrayRef(BuiltinInfo,
2383 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002384 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002385 ArrayRef<const char *> getGCCRegNames() const override {
2386 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002387 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002388 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2389 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002390 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002391 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2392 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002393 }
Eric Christopherd9832702015-06-29 21:00:05 +00002394 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002395 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002396 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002397
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002398 bool validateGlobalRegisterVariable(StringRef RegName,
2399 unsigned RegSize,
2400 bool &HasSizeMismatch) const override {
2401 // esp and ebp are the only 32-bit registers the x86 backend can currently
2402 // handle.
2403 if (RegName.equals("esp") || RegName.equals("ebp")) {
2404 // Check that the register size is 32-bit.
2405 HasSizeMismatch = RegSize != 32;
2406 return true;
2407 }
2408
2409 return false;
2410 }
2411
Akira Hatanaka974131e2014-09-18 18:17:18 +00002412 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2413
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002414 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2415
Akira Hatanaka974131e2014-09-18 18:17:18 +00002416 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2417
Craig Topper3164f332014-03-11 03:39:26 +00002418 std::string convertConstraint(const char *&Constraint) const override;
2419 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002420 return "~{dirflag},~{fpsr},~{flags}";
2421 }
Craig Topper3164f332014-03-11 03:39:26 +00002422 void getTargetDefines(const LangOptions &Opts,
2423 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002424 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2425 bool Enabled);
2426 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2427 bool Enabled);
2428 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2429 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002430 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2431 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002432 setFeatureEnabledImpl(Features, Name, Enabled);
2433 }
2434 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002435 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002436 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2437 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002438 bool
2439 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2440 StringRef CPU,
2441 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002442 bool hasFeature(StringRef Feature) const override;
2443 bool handleTargetFeatures(std::vector<std::string> &Features,
2444 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002445 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002446 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2447 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002448 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002449 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002450 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002451 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002452 return "no-mmx";
2453 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002454 }
Craig Topper3164f332014-03-11 03:39:26 +00002455 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002456 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002457
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002458 // Perform any per-CPU checks necessary to determine if this CPU is
2459 // acceptable.
2460 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2461 // invalid without explaining *why*.
2462 switch (CPU) {
2463 case CK_Generic:
2464 // No processor selected!
2465 return false;
2466
2467 case CK_i386:
2468 case CK_i486:
2469 case CK_WinChipC6:
2470 case CK_WinChip2:
2471 case CK_C3:
2472 case CK_i586:
2473 case CK_Pentium:
2474 case CK_PentiumMMX:
2475 case CK_i686:
2476 case CK_PentiumPro:
2477 case CK_Pentium2:
2478 case CK_Pentium3:
2479 case CK_Pentium3M:
2480 case CK_PentiumM:
2481 case CK_Yonah:
2482 case CK_C3_2:
2483 case CK_Pentium4:
2484 case CK_Pentium4M:
2485 case CK_Prescott:
2486 case CK_K6:
2487 case CK_K6_2:
2488 case CK_K6_3:
2489 case CK_Athlon:
2490 case CK_AthlonThunderbird:
2491 case CK_Athlon4:
2492 case CK_AthlonXP:
2493 case CK_AthlonMP:
2494 case CK_Geode:
2495 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002496 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002497 return false;
2498
2499 // Fallthrough
2500 case CK_Nocona:
2501 case CK_Core2:
2502 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002503 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002504 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002505 case CK_Nehalem:
2506 case CK_Westmere:
2507 case CK_SandyBridge:
2508 case CK_IvyBridge:
2509 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002510 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002511 case CK_Skylake:
Craig Topper449314e2013-08-20 07:09:39 +00002512 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002513 case CK_Athlon64:
2514 case CK_Athlon64SSE3:
2515 case CK_AthlonFX:
2516 case CK_K8:
2517 case CK_K8SSE3:
2518 case CK_Opteron:
2519 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002520 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002521 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002522 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002523 case CK_BDVER1:
2524 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002525 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002526 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002527 case CK_x86_64:
2528 return true;
2529 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002530 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002531 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002532
Craig Topper3164f332014-03-11 03:39:26 +00002533 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002534
Craig Topper3164f332014-03-11 03:39:26 +00002535 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002536 // We accept all non-ARM calling conventions
2537 return (CC == CC_X86ThisCall ||
2538 CC == CC_X86FastCall ||
Reid Klecknerd7857f02014-10-24 17:42:17 +00002539 CC == CC_X86StdCall ||
2540 CC == CC_X86VectorCall ||
2541 CC == CC_C ||
Guy Benyeif0a014b2012-12-25 08:53:55 +00002542 CC == CC_X86Pascal ||
2543 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002544 }
2545
Craig Topper3164f332014-03-11 03:39:26 +00002546 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002547 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002548 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002549
2550 bool hasSjLjLowering() const override {
2551 return true;
2552 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002553};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002554
Rafael Espindolaeb265472013-08-21 21:59:03 +00002555bool X86TargetInfo::setFPMath(StringRef Name) {
2556 if (Name == "387") {
2557 FPMath = FP_387;
2558 return true;
2559 }
2560 if (Name == "sse") {
2561 FPMath = FP_SSE;
2562 return true;
2563 }
2564 return false;
2565}
2566
Eric Christopher007b0a02015-08-28 22:32:01 +00002567bool X86TargetInfo::initFeatureMap(
2568 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002569 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002570 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002571 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002572 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002573 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002574
Eric Christopher2b4a7252015-08-27 00:05:52 +00002575 switch (getCPUKind(CPU)) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002576 case CK_Generic:
2577 case CK_i386:
2578 case CK_i486:
2579 case CK_i586:
2580 case CK_Pentium:
2581 case CK_i686:
2582 case CK_PentiumPro:
Chandler Carruth212334f2011-09-28 08:55:37 +00002583 break;
2584 case CK_PentiumMMX:
2585 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002586 case CK_K6:
2587 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002588 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002589 break;
2590 case CK_Pentium3:
2591 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002592 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002593 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002594 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002595 break;
2596 case CK_PentiumM:
2597 case CK_Pentium4:
2598 case CK_Pentium4M:
2599 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002600 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002601 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002602 break;
2603 case CK_Yonah:
2604 case CK_Prescott:
2605 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002606 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002607 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002608 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002609 break;
2610 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002611 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002612 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002613 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002614 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002615 break;
2616 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002617 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002618 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002619 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002620 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002621 case CK_Skylake:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002622 setFeatureEnabledImpl(Features, "avx512f", true);
2623 setFeatureEnabledImpl(Features, "avx512cd", true);
2624 setFeatureEnabledImpl(Features, "avx512dq", true);
2625 setFeatureEnabledImpl(Features, "avx512bw", true);
2626 setFeatureEnabledImpl(Features, "avx512vl", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002627 setFeatureEnabledImpl(Features, "xsavec", true);
2628 setFeatureEnabledImpl(Features, "xsaves", true);
Asaf Badouha9d1e182015-12-31 14:14:07 +00002629 setFeatureEnabledImpl(Features, "pku", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002630 // FALLTHROUGH
2631 case CK_Broadwell:
2632 setFeatureEnabledImpl(Features, "rdseed", true);
2633 setFeatureEnabledImpl(Features, "adx", true);
2634 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002635 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002636 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002637 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002638 setFeatureEnabledImpl(Features, "bmi", true);
2639 setFeatureEnabledImpl(Features, "bmi2", true);
2640 setFeatureEnabledImpl(Features, "rtm", true);
2641 setFeatureEnabledImpl(Features, "fma", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002642 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002643 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002644 setFeatureEnabledImpl(Features, "rdrnd", true);
2645 setFeatureEnabledImpl(Features, "f16c", true);
2646 setFeatureEnabledImpl(Features, "fsgsbase", true);
2647 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002648 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002649 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002650 setFeatureEnabledImpl(Features, "xsave", true);
2651 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002652 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002653 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002654 case CK_Silvermont:
2655 setFeatureEnabledImpl(Features, "aes", true);
2656 setFeatureEnabledImpl(Features, "pclmul", true);
2657 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002658 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002659 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002660 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002661 setFeatureEnabledImpl(Features, "cx16", true);
2662 break;
2663 case CK_KNL:
2664 setFeatureEnabledImpl(Features, "avx512f", true);
2665 setFeatureEnabledImpl(Features, "avx512cd", true);
2666 setFeatureEnabledImpl(Features, "avx512er", true);
2667 setFeatureEnabledImpl(Features, "avx512pf", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002668 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002669 setFeatureEnabledImpl(Features, "rdseed", true);
2670 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002671 setFeatureEnabledImpl(Features, "lzcnt", true);
2672 setFeatureEnabledImpl(Features, "bmi", true);
2673 setFeatureEnabledImpl(Features, "bmi2", true);
2674 setFeatureEnabledImpl(Features, "rtm", true);
2675 setFeatureEnabledImpl(Features, "fma", true);
2676 setFeatureEnabledImpl(Features, "rdrnd", true);
2677 setFeatureEnabledImpl(Features, "f16c", true);
2678 setFeatureEnabledImpl(Features, "fsgsbase", true);
2679 setFeatureEnabledImpl(Features, "aes", true);
2680 setFeatureEnabledImpl(Features, "pclmul", true);
2681 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002682 setFeatureEnabledImpl(Features, "xsaveopt", true);
2683 setFeatureEnabledImpl(Features, "xsave", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002684 break;
2685 case CK_K6_2:
2686 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00002687 case CK_WinChip2:
2688 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002689 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002690 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002691 case CK_Athlon:
2692 case CK_AthlonThunderbird:
2693 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00002694 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00002695 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00002696 case CK_Athlon4:
2697 case CK_AthlonXP:
2698 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00002699 setFeatureEnabledImpl(Features, "sse", true);
2700 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002701 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002702 break;
2703 case CK_K8:
2704 case CK_Opteron:
2705 case CK_Athlon64:
2706 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00002707 setFeatureEnabledImpl(Features, "sse2", true);
2708 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002709 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002710 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002711 case CK_AMDFAM10:
2712 setFeatureEnabledImpl(Features, "sse4a", true);
2713 setFeatureEnabledImpl(Features, "lzcnt", true);
2714 setFeatureEnabledImpl(Features, "popcnt", true);
2715 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00002716 case CK_K8SSE3:
2717 case CK_OpteronSSE3:
2718 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00002719 setFeatureEnabledImpl(Features, "sse3", true);
2720 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002721 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00002722 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00002723 case CK_BTVER2:
2724 setFeatureEnabledImpl(Features, "avx", true);
2725 setFeatureEnabledImpl(Features, "aes", true);
2726 setFeatureEnabledImpl(Features, "pclmul", true);
2727 setFeatureEnabledImpl(Features, "bmi", true);
2728 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002729 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002730 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00002731 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00002732 setFeatureEnabledImpl(Features, "ssse3", true);
2733 setFeatureEnabledImpl(Features, "sse4a", true);
2734 setFeatureEnabledImpl(Features, "lzcnt", true);
2735 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002736 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002737 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002738 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002739 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002740 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00002741 case CK_BDVER4:
2742 setFeatureEnabledImpl(Features, "avx2", true);
2743 setFeatureEnabledImpl(Features, "bmi2", true);
2744 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002745 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00002746 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002747 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00002748 // FALLTHROUGH
2749 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00002750 setFeatureEnabledImpl(Features, "bmi", true);
2751 setFeatureEnabledImpl(Features, "fma", true);
2752 setFeatureEnabledImpl(Features, "f16c", true);
2753 setFeatureEnabledImpl(Features, "tbm", true);
2754 // FALLTHROUGH
2755 case CK_BDVER1:
2756 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00002757 setFeatureEnabledImpl(Features, "xop", true);
2758 setFeatureEnabledImpl(Features, "lzcnt", true);
2759 setFeatureEnabledImpl(Features, "aes", true);
2760 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00002761 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002762 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002763 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002764 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002765 break;
Eli Friedman33465822011-07-08 23:31:17 +00002766 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00002767 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
2768 return false;
2769
2770 // Can't do this earlier because we need to be able to explicitly enable
2771 // or disable these features and the things that they depend upon.
2772
2773 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2774 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002775 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002776 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
2777 FeaturesVec.end())
2778 Features["popcnt"] = true;
2779
2780 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2781 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002782 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00002783 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
2784 FeaturesVec.end())
2785 Features["prfchw"] = true;
2786
Eric Christophera7260af2015-10-08 20:10:18 +00002787 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2788 // then enable MMX.
2789 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00002790 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00002791 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
2792 FeaturesVec.end())
2793 Features["mmx"] = true;
2794
Eric Christopherbbd746d2015-10-08 20:10:14 +00002795 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002796}
2797
Rafael Espindolae62e2792013-08-20 13:44:29 +00002798void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002799 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002800 if (Enabled) {
2801 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002802 case AVX512F:
2803 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002804 case AVX2:
2805 Features["avx2"] = true;
2806 case AVX:
2807 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00002808 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002809 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002810 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002811 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002812 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002813 case SSSE3:
2814 Features["ssse3"] = true;
2815 case SSE3:
2816 Features["sse3"] = true;
2817 case SSE2:
2818 Features["sse2"] = true;
2819 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00002820 Features["sse"] = true;
2821 case NoSSE:
2822 break;
2823 }
2824 return;
2825 }
2826
2827 switch (Level) {
2828 case NoSSE:
2829 case SSE1:
2830 Features["sse"] = false;
2831 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00002832 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2833 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002834 case SSE3:
2835 Features["sse3"] = false;
2836 setXOPLevel(Features, NoXOP, false);
2837 case SSSE3:
2838 Features["ssse3"] = false;
2839 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00002840 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002841 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00002842 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002843 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00002844 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
2845 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00002846 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00002847 case AVX2:
2848 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00002849 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00002850 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00002851 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2852 Features["avx512vl"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002853 }
2854}
2855
2856void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00002857 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002858 if (Enabled) {
2859 switch (Level) {
2860 case AMD3DNowAthlon:
2861 Features["3dnowa"] = true;
2862 case AMD3DNow:
2863 Features["3dnow"] = true;
2864 case MMX:
2865 Features["mmx"] = true;
2866 case NoMMX3DNow:
2867 break;
2868 }
2869 return;
2870 }
2871
2872 switch (Level) {
2873 case NoMMX3DNow:
2874 case MMX:
2875 Features["mmx"] = false;
2876 case AMD3DNow:
2877 Features["3dnow"] = false;
2878 case AMD3DNowAthlon:
2879 Features["3dnowa"] = false;
2880 }
2881}
2882
2883void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00002884 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002885 if (Enabled) {
2886 switch (Level) {
2887 case XOP:
2888 Features["xop"] = true;
2889 case FMA4:
2890 Features["fma4"] = true;
2891 setSSELevel(Features, AVX, true);
2892 case SSE4A:
2893 Features["sse4a"] = true;
2894 setSSELevel(Features, SSE3, true);
2895 case NoXOP:
2896 break;
2897 }
2898 return;
2899 }
2900
2901 switch (Level) {
2902 case NoXOP:
2903 case SSE4A:
2904 Features["sse4a"] = false;
2905 case FMA4:
2906 Features["fma4"] = false;
2907 case XOP:
2908 Features["xop"] = false;
2909 }
2910}
2911
Craig Topper86d79ef2013-09-17 04:51:29 +00002912void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2913 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00002914 // This is a bit of a hack to deal with the sse4 target feature when used
2915 // as part of the target attribute. We handle sse4 correctly everywhere
2916 // else. See below for more information on how we handle the sse4 options.
2917 if (Name != "sse4")
2918 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00002919
Craig Topper29561122013-09-19 01:13:07 +00002920 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002921 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002922 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002923 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002924 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002925 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002926 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002927 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002928 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002929 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002930 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002931 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002932 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002933 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002934 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002935 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002936 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002937 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002938 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002939 if (Enabled)
2940 setSSELevel(Features, SSE2, Enabled);
2941 } else if (Name == "pclmul") {
2942 if (Enabled)
2943 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002944 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002945 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002946 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002947 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00002948 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002949 setSSELevel(Features, AVX512F, Enabled);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002950 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2951 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
Craig Topper679b53a2013-08-21 05:29:10 +00002952 if (Enabled)
2953 setSSELevel(Features, AVX512F, Enabled);
2954 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00002955 if (Enabled)
2956 setSSELevel(Features, AVX, Enabled);
2957 } else if (Name == "fma4") {
2958 setXOPLevel(Features, FMA4, Enabled);
2959 } else if (Name == "xop") {
2960 setXOPLevel(Features, XOP, Enabled);
2961 } else if (Name == "sse4a") {
2962 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00002963 } else if (Name == "f16c") {
2964 if (Enabled)
2965 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00002966 } else if (Name == "sha") {
2967 if (Enabled)
2968 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00002969 } else if (Name == "sse4") {
2970 // We can get here via the __target__ attribute since that's not controlled
2971 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
2972 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
2973 // disabled.
2974 if (Enabled)
2975 setSSELevel(Features, SSE42, Enabled);
2976 else
2977 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00002978 } else if (Name == "xsave") {
2979 if (Enabled)
2980 setSSELevel(Features, AVX, Enabled);
2981 else
2982 Features["xsaveopt"] = false;
2983 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
2984 if (Enabled) {
2985 Features["xsave"] = true;
2986 setSSELevel(Features, AVX, Enabled);
2987 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002988 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00002989}
2990
Eric Christopher3ff21b32013-10-16 21:26:26 +00002991/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002992/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00002993bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00002994 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00002995 for (const auto &Feature : Features) {
2996 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00002997 continue;
2998
Eric Christopher610fe112015-08-26 08:21:55 +00002999 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003000 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003001 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003002 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003003 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003004 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003005 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003006 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003007 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003008 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003009 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003010 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003011 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003012 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003013 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003014 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003015 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003016 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003017 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003018 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003019 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003020 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003021 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003022 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003023 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003024 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003025 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003026 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003027 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003028 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003029 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003030 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003031 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003032 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003033 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003034 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003035 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003036 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003037 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003038 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003039 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003040 HasAVX512VL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003041 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003042 HasSHA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003043 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003044 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003045 } else if (Feature == "+fxsr") {
3046 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003047 } else if (Feature == "+xsave") {
3048 HasXSAVE = true;
3049 } else if (Feature == "+xsaveopt") {
3050 HasXSAVEOPT = true;
3051 } else if (Feature == "+xsavec") {
3052 HasXSAVEC = true;
3053 } else if (Feature == "+xsaves") {
3054 HasXSAVES = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003055 } else if (Feature == "+pku") {
3056 HasPKU = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003057 }
3058
Benjamin Kramer27402c62012-03-05 15:10:44 +00003059 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003060 .Case("+avx512f", AVX512F)
3061 .Case("+avx2", AVX2)
3062 .Case("+avx", AVX)
3063 .Case("+sse4.2", SSE42)
3064 .Case("+sse4.1", SSE41)
3065 .Case("+ssse3", SSSE3)
3066 .Case("+sse3", SSE3)
3067 .Case("+sse2", SSE2)
3068 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003069 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003070 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003071
Eli Friedman33465822011-07-08 23:31:17 +00003072 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003073 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003074 .Case("+3dnowa", AMD3DNowAthlon)
3075 .Case("+3dnow", AMD3DNow)
3076 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003077 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003078 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003079
3080 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003081 .Case("+xop", XOP)
3082 .Case("+fma4", FMA4)
3083 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003084 .Default(NoXOP);
3085 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003086 }
Eli Friedman33465822011-07-08 23:31:17 +00003087
Rafael Espindolaeb265472013-08-21 21:59:03 +00003088 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3089 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003090 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3091 (FPMath == FP_387 && SSELevel >= SSE1)) {
3092 Diags.Report(diag::err_target_unsupported_fpmath) <<
3093 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003094 return false;
3095 }
3096
Alexey Bataev00396512015-07-02 03:40:19 +00003097 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003098 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003099 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003100}
Chris Lattnerecd49032009-03-02 22:27:17 +00003101
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003102/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3103/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003104void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003105 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003106 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003107 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003108 Builder.defineMacro("__amd64__");
3109 Builder.defineMacro("__amd64");
3110 Builder.defineMacro("__x86_64");
3111 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003112 if (getTriple().getArchName() == "x86_64h") {
3113 Builder.defineMacro("__x86_64h");
3114 Builder.defineMacro("__x86_64h__");
3115 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003116 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003117 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003118 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003119
Chris Lattnerecd49032009-03-02 22:27:17 +00003120 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003121 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3122 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003123 switch (CPU) {
3124 case CK_Generic:
3125 break;
3126 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003127 // The rest are coming from the i386 define above.
3128 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003129 break;
3130 case CK_i486:
3131 case CK_WinChipC6:
3132 case CK_WinChip2:
3133 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003134 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003135 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003136 case CK_PentiumMMX:
3137 Builder.defineMacro("__pentium_mmx__");
3138 Builder.defineMacro("__tune_pentium_mmx__");
3139 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003140 case CK_i586:
3141 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003142 defineCPUMacros(Builder, "i586");
3143 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003144 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003145 case CK_Pentium3:
3146 case CK_Pentium3M:
3147 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003148 Builder.defineMacro("__tune_pentium3__");
3149 // Fallthrough
3150 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003151 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003152 Builder.defineMacro("__tune_pentium2__");
3153 // Fallthrough
3154 case CK_PentiumPro:
3155 Builder.defineMacro("__tune_i686__");
3156 Builder.defineMacro("__tune_pentiumpro__");
3157 // Fallthrough
3158 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003159 Builder.defineMacro("__i686");
3160 Builder.defineMacro("__i686__");
3161 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3162 Builder.defineMacro("__pentiumpro");
3163 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003164 break;
3165 case CK_Pentium4:
3166 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003167 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003168 break;
3169 case CK_Yonah:
3170 case CK_Prescott:
3171 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003172 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003173 break;
3174 case CK_Core2:
3175 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003176 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003177 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003178 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003179 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003180 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003181 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003182 defineCPUMacros(Builder, "slm");
3183 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003184 case CK_Nehalem:
3185 case CK_Westmere:
3186 case CK_SandyBridge:
3187 case CK_IvyBridge:
3188 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003189 case CK_Broadwell:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003190 // FIXME: Historically, we defined this legacy name, it would be nice to
3191 // remove it at some point. We've never exposed fine-grained names for
3192 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003193 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003194 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003195 case CK_Skylake:
3196 // FIXME: Historically, we defined this legacy name, it would be nice to
3197 // remove it at some point. This is the only fine-grained CPU macro in the
3198 // main intel CPU line, and it would be better to not have these and force
3199 // people to use ISA macros.
3200 defineCPUMacros(Builder, "skx");
3201 break;
Craig Topper449314e2013-08-20 07:09:39 +00003202 case CK_KNL:
3203 defineCPUMacros(Builder, "knl");
3204 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003205 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003206 Builder.defineMacro("__k6_2__");
3207 Builder.defineMacro("__tune_k6_2__");
3208 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003209 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003210 if (CPU != CK_K6_2) { // In case of fallthrough
3211 // FIXME: GCC may be enabling these in cases where some other k6
3212 // architecture is specified but -m3dnow is explicitly provided. The
3213 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003214 Builder.defineMacro("__k6_3__");
3215 Builder.defineMacro("__tune_k6_3__");
3216 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003217 // Fallthrough
3218 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003219 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003220 break;
3221 case CK_Athlon:
3222 case CK_AthlonThunderbird:
3223 case CK_Athlon4:
3224 case CK_AthlonXP:
3225 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003226 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003227 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003228 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003229 Builder.defineMacro("__tune_athlon_sse__");
3230 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003231 break;
3232 case CK_K8:
3233 case CK_K8SSE3:
3234 case CK_x86_64:
3235 case CK_Opteron:
3236 case CK_OpteronSSE3:
3237 case CK_Athlon64:
3238 case CK_Athlon64SSE3:
3239 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003240 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003241 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003242 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003243 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003244 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003245 case CK_BTVER1:
3246 defineCPUMacros(Builder, "btver1");
3247 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003248 case CK_BTVER2:
3249 defineCPUMacros(Builder, "btver2");
3250 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003251 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003252 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003253 break;
3254 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003255 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003256 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003257 case CK_BDVER3:
3258 defineCPUMacros(Builder, "bdver3");
3259 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003260 case CK_BDVER4:
3261 defineCPUMacros(Builder, "bdver4");
3262 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003263 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003264 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003265 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003266 }
Chris Lattner96e43572009-03-02 22:40:39 +00003267
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003268 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003269 Builder.defineMacro("__REGISTER_PREFIX__", "");
3270
Chris Lattner6df41af2009-04-19 17:32:33 +00003271 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3272 // functions in glibc header files that use FP Stack inline asm which the
3273 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003274 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003275
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003276 if (HasAES)
3277 Builder.defineMacro("__AES__");
3278
Craig Topper3f122a72012-05-31 05:18:48 +00003279 if (HasPCLMUL)
3280 Builder.defineMacro("__PCLMUL__");
3281
Craig Topper22967d42011-12-25 05:06:45 +00003282 if (HasLZCNT)
3283 Builder.defineMacro("__LZCNT__");
3284
Benjamin Kramer1e250392012-07-07 09:39:18 +00003285 if (HasRDRND)
3286 Builder.defineMacro("__RDRND__");
3287
Craig Topper8c7f2512014-11-03 06:51:41 +00003288 if (HasFSGSBASE)
3289 Builder.defineMacro("__FSGSBASE__");
3290
Craig Topper22967d42011-12-25 05:06:45 +00003291 if (HasBMI)
3292 Builder.defineMacro("__BMI__");
3293
3294 if (HasBMI2)
3295 Builder.defineMacro("__BMI2__");
3296
Craig Topper1de83482011-12-29 16:10:46 +00003297 if (HasPOPCNT)
3298 Builder.defineMacro("__POPCNT__");
3299
Michael Liao625a8752012-11-10 05:17:46 +00003300 if (HasRTM)
3301 Builder.defineMacro("__RTM__");
3302
Michael Liao74f4eaf2013-03-26 17:52:08 +00003303 if (HasPRFCHW)
3304 Builder.defineMacro("__PRFCHW__");
3305
Michael Liaoffaae352013-03-29 05:17:55 +00003306 if (HasRDSEED)
3307 Builder.defineMacro("__RDSEED__");
3308
Robert Khasanov50e6f582014-09-19 09:53:48 +00003309 if (HasADX)
3310 Builder.defineMacro("__ADX__");
3311
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003312 if (HasTBM)
3313 Builder.defineMacro("__TBM__");
3314
Rafael Espindolae62e2792013-08-20 13:44:29 +00003315 switch (XOPLevel) {
3316 case XOP:
3317 Builder.defineMacro("__XOP__");
3318 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003319 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003320 case SSE4A:
3321 Builder.defineMacro("__SSE4A__");
3322 case NoXOP:
3323 break;
3324 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003325
Craig Topperbba778b2012-06-03 21:46:30 +00003326 if (HasFMA)
3327 Builder.defineMacro("__FMA__");
3328
Manman Rena45358c2012-10-11 00:59:55 +00003329 if (HasF16C)
3330 Builder.defineMacro("__F16C__");
3331
Craig Topper679b53a2013-08-21 05:29:10 +00003332 if (HasAVX512CD)
3333 Builder.defineMacro("__AVX512CD__");
3334 if (HasAVX512ER)
3335 Builder.defineMacro("__AVX512ER__");
3336 if (HasAVX512PF)
3337 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003338 if (HasAVX512DQ)
3339 Builder.defineMacro("__AVX512DQ__");
3340 if (HasAVX512BW)
3341 Builder.defineMacro("__AVX512BW__");
3342 if (HasAVX512VL)
3343 Builder.defineMacro("__AVX512VL__");
Craig Topper679b53a2013-08-21 05:29:10 +00003344
Ben Langmuir58078d02013-09-19 13:22:04 +00003345 if (HasSHA)
3346 Builder.defineMacro("__SHA__");
3347
Craig Toppere33f51f2015-10-16 06:22:36 +00003348 if (HasFXSR)
3349 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003350 if (HasXSAVE)
3351 Builder.defineMacro("__XSAVE__");
3352 if (HasXSAVEOPT)
3353 Builder.defineMacro("__XSAVEOPT__");
3354 if (HasXSAVEC)
3355 Builder.defineMacro("__XSAVEC__");
3356 if (HasXSAVES)
3357 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003358 if (HasPKU)
3359 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003360 if (HasCX16)
3361 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3362
Chris Lattner96e43572009-03-02 22:40:39 +00003363 // Each case falls through to the previous one here.
3364 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003365 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003366 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003367 case AVX2:
3368 Builder.defineMacro("__AVX2__");
3369 case AVX:
3370 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003371 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003372 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003373 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003374 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003375 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003376 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003377 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003378 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003379 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003380 Builder.defineMacro("__SSE2__");
3381 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003382 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003383 Builder.defineMacro("__SSE__");
3384 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003385 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003386 break;
3387 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003388
Derek Schuffc7dd7222012-10-11 15:52:22 +00003389 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003390 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003391 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003392 case AVX2:
3393 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003394 case SSE42:
3395 case SSE41:
3396 case SSSE3:
3397 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003398 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003399 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003400 break;
3401 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003402 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003403 break;
3404 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003405 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003406 }
3407 }
3408
Anders Carlssone437c682010-01-27 03:47:49 +00003409 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003410 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003411 case AMD3DNowAthlon:
3412 Builder.defineMacro("__3dNOW_A__");
3413 case AMD3DNow:
3414 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003415 case MMX:
3416 Builder.defineMacro("__MMX__");
3417 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003418 break;
3419 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003420
3421 if (CPU >= CK_i486) {
3422 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3423 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3424 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3425 }
3426 if (CPU >= CK_i586)
3427 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003428}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003429
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003430bool X86TargetInfo::hasFeature(StringRef Feature) const {
3431 return llvm::StringSwitch<bool>(Feature)
3432 .Case("aes", HasAES)
3433 .Case("avx", SSELevel >= AVX)
3434 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003435 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003436 .Case("avx512cd", HasAVX512CD)
3437 .Case("avx512er", HasAVX512ER)
3438 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003439 .Case("avx512dq", HasAVX512DQ)
3440 .Case("avx512bw", HasAVX512BW)
3441 .Case("avx512vl", HasAVX512VL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003442 .Case("bmi", HasBMI)
3443 .Case("bmi2", HasBMI2)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003444 .Case("cx16", HasCX16)
3445 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003446 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003447 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003448 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003449 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003450 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003451 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3452 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3453 .Case("mmx", MMX3DNowLevel >= MMX)
Craig Topper3f122a72012-05-31 05:18:48 +00003454 .Case("pclmul", HasPCLMUL)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003455 .Case("popcnt", HasPOPCNT)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003456 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003457 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003458 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003459 .Case("rtm", HasRTM)
Ben Langmuir58078d02013-09-19 13:22:04 +00003460 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003461 .Case("sse", SSELevel >= SSE1)
3462 .Case("sse2", SSELevel >= SSE2)
3463 .Case("sse3", SSELevel >= SSE3)
3464 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003465 .Case("sse4.1", SSELevel >= SSE41)
3466 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003467 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003468 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003469 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003470 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3471 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003472 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003473 .Case("xsave", HasXSAVE)
3474 .Case("xsavec", HasXSAVEC)
3475 .Case("xsaves", HasXSAVES)
3476 .Case("xsaveopt", HasXSAVEOPT)
Asaf Badouha9d1e182015-12-31 14:14:07 +00003477 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003478 .Default(false);
3479}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003480
Eric Christopherd9832702015-06-29 21:00:05 +00003481// We can't use a generic validation scheme for the features accepted here
3482// versus subtarget features accepted in the target attribute because the
3483// bitfield structure that's initialized in the runtime only supports the
3484// below currently rather than the full range of subtarget features. (See
3485// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3486bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3487 return llvm::StringSwitch<bool>(FeatureStr)
3488 .Case("cmov", true)
3489 .Case("mmx", true)
3490 .Case("popcnt", true)
3491 .Case("sse", true)
3492 .Case("sse2", true)
3493 .Case("sse3", true)
3494 .Case("sse4.1", true)
3495 .Case("sse4.2", true)
3496 .Case("avx", true)
3497 .Case("avx2", true)
3498 .Case("sse4a", true)
3499 .Case("fma4", true)
3500 .Case("xop", true)
3501 .Case("fma", true)
3502 .Case("avx512f", true)
3503 .Case("bmi", true)
3504 .Case("bmi2", true)
3505 .Default(false);
3506}
3507
Eli Friedman3fd920a2008-08-20 02:34:37 +00003508bool
Anders Carlsson58436352009-02-28 17:11:49 +00003509X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003510 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003511 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003512 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003513 // Constant constraints.
3514 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3515 // instructions.
3516 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3517 // x86_64 instructions.
3518 case 's':
3519 Info.setRequiresImmediate();
3520 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003521 case 'I':
3522 Info.setRequiresImmediate(0, 31);
3523 return true;
3524 case 'J':
3525 Info.setRequiresImmediate(0, 63);
3526 return true;
3527 case 'K':
3528 Info.setRequiresImmediate(-128, 127);
3529 return true;
3530 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003531 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003532 return true;
3533 case 'M':
3534 Info.setRequiresImmediate(0, 3);
3535 return true;
3536 case 'N':
3537 Info.setRequiresImmediate(0, 255);
3538 return true;
3539 case 'O':
3540 Info.setRequiresImmediate(0, 127);
3541 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003542 // Register constraints.
3543 case 'Y': // 'Y' is the first character for several 2-character constraints.
3544 // Shift the pointer to the second character of the constraint.
3545 Name++;
3546 switch (*Name) {
3547 default:
3548 return false;
3549 case '0': // First SSE register.
3550 case 't': // Any SSE register, when SSE2 is enabled.
3551 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3552 case 'm': // Any MMX register, when inter-unit moves enabled.
3553 Info.setAllowsRegister();
3554 return true;
3555 }
3556 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003557 // Constraint 'f' cannot be used for output operands.
3558 if (Info.ConstraintStr[0] == '=')
3559 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003560 Info.setAllowsRegister();
3561 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003562 case 'a': // eax.
3563 case 'b': // ebx.
3564 case 'c': // ecx.
3565 case 'd': // edx.
3566 case 'S': // esi.
3567 case 'D': // edi.
3568 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003569 case 't': // Top of floating point stack.
3570 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003571 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003572 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003573 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003574 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003575 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3576 case 'l': // "Index" registers: any general register that can be used as an
3577 // index in a base+index memory access.
3578 Info.setAllowsRegister();
3579 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003580 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003581 case 'C': // SSE floating point constant.
3582 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003583 return true;
3584 }
3585}
3586
Akira Hatanaka974131e2014-09-18 18:17:18 +00003587bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3588 unsigned Size) const {
3589 // Strip off constraint modifiers.
3590 while (Constraint[0] == '=' ||
3591 Constraint[0] == '+' ||
3592 Constraint[0] == '&')
3593 Constraint = Constraint.substr(1);
3594
3595 return validateOperandSize(Constraint, Size);
3596}
3597
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003598bool X86TargetInfo::validateInputSize(StringRef Constraint,
3599 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003600 return validateOperandSize(Constraint, Size);
3601}
3602
3603bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3604 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003605 switch (Constraint[0]) {
3606 default: break;
3607 case 'y':
3608 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003609 case 'f':
3610 case 't':
3611 case 'u':
3612 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003613 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003614 if (SSELevel >= AVX512F)
3615 // 512-bit zmm registers can be used if target supports AVX512F.
3616 return Size <= 512U;
3617 else if (SSELevel >= AVX)
3618 // 256-bit ymm registers can be used if target supports AVX.
3619 return Size <= 256U;
3620 return Size <= 128U;
3621 case 'Y':
3622 // 'Y' is the first character for several 2-character constraints.
3623 switch (Constraint[1]) {
3624 default: break;
3625 case 'm':
3626 // 'Ym' is synonymous with 'y'.
3627 return Size <= 64;
3628 case 'i':
3629 case 't':
3630 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
3631 if (SSELevel >= AVX512F)
3632 return Size <= 512U;
3633 else if (SSELevel >= AVX)
3634 return Size <= 256U;
3635 return SSELevel >= SSE2 && Size <= 128U;
3636 }
3637
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003638 }
3639
3640 return true;
3641}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00003642
Eli Friedman3fd920a2008-08-20 02:34:37 +00003643std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003644X86TargetInfo::convertConstraint(const char *&Constraint) const {
3645 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003646 case 'a': return std::string("{ax}");
3647 case 'b': return std::string("{bx}");
3648 case 'c': return std::string("{cx}");
3649 case 'd': return std::string("{dx}");
3650 case 'S': return std::string("{si}");
3651 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00003652 case 'p': // address
3653 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00003654 case 't': // top of floating point stack.
3655 return std::string("{st}");
3656 case 'u': // second from top of floating point stack.
3657 return std::string("{st(1)}"); // second from top of floating point stack.
3658 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00003659 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00003660 }
3661}
Chris Lattner5ba61f02006-10-14 07:39:34 +00003662
Eli Friedman3fd920a2008-08-20 02:34:37 +00003663// X86-32 generic target
3664class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00003665public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003666 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003667 DoubleAlign = LongLongAlign = 32;
3668 LongDoubleWidth = 96;
3669 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00003670 SuitableAlign = 128;
Eric Christopher964a5f32015-08-05 23:48:05 +00003671 DataLayoutString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
Eli Friedman32ca82a2009-03-29 20:31:09 +00003672 SizeType = UnsignedInt;
3673 PtrDiffType = SignedInt;
3674 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00003675 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00003676
3677 // Use fpret for all types.
3678 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3679 (1 << TargetInfo::Double) |
3680 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00003681
3682 // x86-32 has atomics up to 8 bytes
3683 // FIXME: Check that we actually have cmpxchg8b before setting
3684 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3685 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003686 }
Craig Topper3164f332014-03-11 03:39:26 +00003687 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00003688 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003689 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003690
Craig Topper3164f332014-03-11 03:39:26 +00003691 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00003692 if (RegNo == 0) return 0;
3693 if (RegNo == 1) return 2;
3694 return -1;
3695 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00003696 bool validateOperandSize(StringRef Constraint,
3697 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00003698 switch (Constraint[0]) {
3699 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003700 case 'R':
3701 case 'q':
3702 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00003703 case 'a':
3704 case 'b':
3705 case 'c':
3706 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003707 case 'S':
3708 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00003709 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003710 case 'A':
3711 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00003712 }
3713
Akira Hatanaka974131e2014-09-18 18:17:18 +00003714 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00003715 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003716};
Eli Friedman3fd920a2008-08-20 02:34:37 +00003717
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003718class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3719public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003720 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3721 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003722
Craig Topper3164f332014-03-11 03:39:26 +00003723 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00003724 unsigned Major, Minor, Micro;
3725 getTriple().getOSVersion(Major, Minor, Micro);
3726 // New NetBSD uses the default rounding mode.
3727 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3728 return X86_32TargetInfo::getFloatEvalMethod();
3729 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003730 return 1;
3731 }
3732};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00003733
Eli Friedmane3aa4542009-07-05 18:47:56 +00003734class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3735public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003736 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3737 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00003738 SizeType = UnsignedLong;
3739 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00003740 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00003741 }
3742};
Eli Friedmane3aa4542009-07-05 18:47:56 +00003743
Eli Friedman9fa28852012-08-08 23:57:20 +00003744class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3745public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003746 BitrigI386TargetInfo(const llvm::Triple &Triple)
3747 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003748 SizeType = UnsignedLong;
3749 IntPtrType = SignedLong;
3750 PtrDiffType = SignedLong;
3751 }
3752};
Eli Friedman9fa28852012-08-08 23:57:20 +00003753
Torok Edwinb2b37c62009-06-30 17:10:35 +00003754class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003755public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003756 DarwinI386TargetInfo(const llvm::Triple &Triple)
3757 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003758 LongDoubleWidth = 128;
3759 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00003760 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00003761 MaxVectorAlign = 256;
3762 // The watchOS simulator uses the builtin bool type for Objective-C.
3763 llvm::Triple T = llvm::Triple(Triple);
3764 if (T.isWatchOS())
3765 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00003766 SizeType = UnsignedLong;
3767 IntPtrType = SignedLong;
Eric Christopher964a5f32015-08-05 23:48:05 +00003768 DataLayoutString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
Daniel Dunbarbd606522010-05-27 00:35:16 +00003769 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00003770 }
3771
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003772 bool handleTargetFeatures(std::vector<std::string> &Features,
3773 DiagnosticsEngine &Diags) override {
3774 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
3775 Diags))
3776 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00003777 // We now know the features we have: we can decide how to align vectors.
3778 MaxVectorAlign =
3779 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00003780 return true;
3781 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00003782};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003783
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003784// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003785class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003786public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003787 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3788 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
Chris Lattner46be2e12009-06-24 17:12:15 +00003789 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00003790 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00003791 bool IsWinCOFF =
3792 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Eric Christopher964a5f32015-08-05 23:48:05 +00003793 DataLayoutString = IsWinCOFF
3794 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
3795 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32";
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003796 }
Craig Topper3164f332014-03-11 03:39:26 +00003797 void getTargetDefines(const LangOptions &Opts,
3798 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003799 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3800 }
3801};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003802
3803// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003804class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003805public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00003806 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003807 : WindowsX86_32TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00003808 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003809 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3810 }
Craig Topper3164f332014-03-11 03:39:26 +00003811 void getTargetDefines(const LangOptions &Opts,
3812 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003813 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3814 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3815 // The value of the following reflects processor type.
3816 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3817 // We lost the original triple, so we use the default.
3818 Builder.defineMacro("_M_IX86", "600");
3819 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003820};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003821
David Majnemerae1ed0e2015-05-28 04:36:18 +00003822static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00003823 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
3824 // supports __declspec natively under -fms-extensions, but we define a no-op
3825 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00003826 if (Opts.MicrosoftExt)
3827 Builder.defineMacro("__declspec", "__declspec");
3828 else
3829 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3830
3831 if (!Opts.MicrosoftExt) {
3832 // Provide macros for all the calling convention keywords. Provide both
3833 // single and double underscore prefixed variants. These are available on
3834 // x64 as well as x86, even though they have no effect.
3835 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3836 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00003837 std::string GCCSpelling = "__attribute__((__";
3838 GCCSpelling += CC;
3839 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00003840 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3841 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3842 }
3843 }
3844}
3845
David Majnemerae1ed0e2015-05-28 04:36:18 +00003846static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3847 Builder.defineMacro("__MSVCRT__");
3848 Builder.defineMacro("__MINGW32__");
3849 addCygMingDefines(Opts, Builder);
3850}
3851
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003852// x86-32 MinGW target
3853class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3854public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003855 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
Yaron Keren4da1a372015-08-20 21:36:14 +00003856 : WindowsX86_32TargetInfo(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00003857 void getTargetDefines(const LangOptions &Opts,
3858 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003859 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003860 DefineStd(Builder, "WIN32", Opts);
3861 DefineStd(Builder, "WINNT", Opts);
3862 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00003863 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003864 }
3865};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003866
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003867// x86-32 Cygwin target
3868class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3869public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003870 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3871 : X86_32TargetInfo(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003872 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00003873 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00003874 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 +00003875 }
Craig Topper3164f332014-03-11 03:39:26 +00003876 void getTargetDefines(const LangOptions &Opts,
3877 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003878 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00003879 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003880 Builder.defineMacro("__CYGWIN__");
3881 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00003882 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003883 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00003884 if (Opts.CPlusPlus)
3885 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00003886 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003887};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00003888
Chris Lattnerb986aba2010-04-11 19:29:39 +00003889// x86-32 Haiku target
3890class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3891public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003892 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003893 SizeType = UnsignedLong;
Chris Lattner8b290212010-04-22 17:48:00 +00003894 IntPtrType = SignedLong;
3895 PtrDiffType = SignedLong;
Eli Friedman4e91899e2012-11-27 02:58:24 +00003896 ProcessIDType = SignedLong;
James Y Knighta3518ad2016-01-27 01:04:51 +00003897 this->UserLabelPrefix = "";
Benjamin Kramerd0b9f092012-11-08 12:59:15 +00003898 this->TLSSupported = false;
Eli Friedman04831922010-08-22 01:00:03 +00003899 }
Craig Topper3164f332014-03-11 03:39:26 +00003900 void getTargetDefines(const LangOptions &Opts,
3901 MacroBuilder &Builder) const override {
Chris Lattnerb986aba2010-04-11 19:29:39 +00003902 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3903 Builder.defineMacro("__INTEL__");
3904 Builder.defineMacro("__HAIKU__");
3905 }
3906};
Chris Lattnerb986aba2010-04-11 19:29:39 +00003907
Alexey Bataevc99b0492015-11-25 09:24:26 +00003908// X86-32 MCU target
3909class MCUX86_32TargetInfo : public X86_32TargetInfo {
3910public:
3911 MCUX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3912 LongDoubleWidth = 64;
3913 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Andrey Turetskiy8170bab2016-02-10 12:56:10 +00003914 DataLayoutString =
3915 "e-m:e-p:32:32-i64:32-f64:32-f128:32-n8:16:32-a:0:32-S32";
Andrey Bokhanko4f8867f2016-01-14 10:59:36 +00003916 UserLabelPrefix = "";
Andrey Bokhanko6e34c1d2016-02-04 11:54:45 +00003917 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00003918 }
3919
3920 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3921 // On MCU we support only C calling convention.
3922 return CC == CC_C ? CCCR_OK : CCCR_Warning;
3923 }
3924
3925 void getTargetDefines(const LangOptions &Opts,
3926 MacroBuilder &Builder) const override {
3927 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3928 Builder.defineMacro("__iamcu");
3929 Builder.defineMacro("__iamcu__");
3930 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00003931
3932 bool allowsLargerPreferedTypeAlignment() const override {
3933 return false;
3934 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00003935};
3936
Douglas Gregor9fabd852011-07-01 22:41:14 +00003937// RTEMS Target
3938template<typename Target>
3939class RTEMSTargetInfo : public OSTargetInfo<Target> {
3940protected:
Craig Topper3164f332014-03-11 03:39:26 +00003941 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3942 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003943 // RTEMS defines; list based off of gcc output
3944
Douglas Gregor9fabd852011-07-01 22:41:14 +00003945 Builder.defineMacro("__rtems__");
3946 Builder.defineMacro("__ELF__");
3947 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003948
Douglas Gregor9fabd852011-07-01 22:41:14 +00003949public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003950 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
James Y Knighta3518ad2016-01-27 01:04:51 +00003951 this->UserLabelPrefix = "";
3952
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003953 switch (Triple.getArch()) {
3954 default:
3955 case llvm::Triple::x86:
3956 // this->MCountName = ".mcount";
3957 break;
3958 case llvm::Triple::mips:
3959 case llvm::Triple::mipsel:
3960 case llvm::Triple::ppc:
3961 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00003962 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003963 // this->MCountName = "_mcount";
3964 break;
3965 case llvm::Triple::arm:
3966 // this->MCountName = "__mcount";
3967 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00003968 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003969 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00003970};
3971
Douglas Gregor9fabd852011-07-01 22:41:14 +00003972// x86-32 RTEMS target
3973class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3974public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003975 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003976 SizeType = UnsignedLong;
3977 IntPtrType = SignedLong;
3978 PtrDiffType = SignedLong;
James Y Knighta3518ad2016-01-27 01:04:51 +00003979 this->UserLabelPrefix = "";
Douglas Gregor9fabd852011-07-01 22:41:14 +00003980 }
Craig Topper3164f332014-03-11 03:39:26 +00003981 void getTargetDefines(const LangOptions &Opts,
3982 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00003983 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3984 Builder.defineMacro("__INTEL__");
3985 Builder.defineMacro("__rtems__");
3986 }
3987};
Douglas Gregor9fabd852011-07-01 22:41:14 +00003988
Eli Friedman3fd920a2008-08-20 02:34:37 +00003989// x86-64 generic target
3990class X86_64TargetInfo : public X86TargetInfo {
3991public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00003992 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
David Blaikie40f842d2014-07-10 18:46:15 +00003993 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00003994 bool IsWinCOFF =
3995 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00003996 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00003997 LongDoubleWidth = 128;
3998 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00003999 LargeArrayMinWidth = 128;
4000 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004001 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004002 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4003 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4004 IntPtrType = IsX32 ? SignedInt : SignedLong;
4005 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004006 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004007 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004008
Eric Christopher917e9522014-11-18 22:36:15 +00004009 // Pointers are 32-bit in x32.
Eric Christopher964a5f32015-08-05 23:48:05 +00004010 DataLayoutString = IsX32 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4011 : IsWinCOFF
4012 ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4013 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004014
4015 // Use fpret only for long double.
4016 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004017
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004018 // Use fp2ret for _Complex long double.
4019 ComplexLongDoubleUsesFP2Ret = true;
4020
Charles Davisc7d5c942015-09-17 20:55:33 +00004021 // Make __builtin_ms_va_list available.
4022 HasBuiltinMSVaList = true;
4023
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004024 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004025 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004026 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004027 }
Craig Topper3164f332014-03-11 03:39:26 +00004028 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004029 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004030 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004031
Craig Topper3164f332014-03-11 03:39:26 +00004032 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004033 if (RegNo == 0) return 0;
4034 if (RegNo == 1) return 1;
4035 return -1;
4036 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004037
Craig Topper3164f332014-03-11 03:39:26 +00004038 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Charles Davisb5a214e2013-08-30 04:39:01 +00004039 return (CC == CC_C ||
Reid Kleckner80944df2014-10-31 22:00:51 +00004040 CC == CC_X86VectorCall ||
Charles Davisb5a214e2013-08-30 04:39:01 +00004041 CC == CC_IntelOclBicc ||
4042 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004043 }
4044
Craig Topper3164f332014-03-11 03:39:26 +00004045 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004046 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004047 }
4048
Pavel Chupinfd223e12014-08-04 12:39:43 +00004049 // for x32 we need it here explicitly
4050 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004051 unsigned getUnwindWordWidth() const override { return 64; }
4052 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004053
4054 bool validateGlobalRegisterVariable(StringRef RegName,
4055 unsigned RegSize,
4056 bool &HasSizeMismatch) const override {
4057 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4058 // handle.
4059 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4060 // Check that the register size is 64-bit.
4061 HasSizeMismatch = RegSize != 64;
4062 return true;
4063 }
4064
4065 // Check if the register is a 32-bit register the backend can handle.
4066 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4067 HasSizeMismatch);
4068 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004069};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004070
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004071// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004072class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004073public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004074 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
4075 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004076 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004077 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004078 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004079 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004080 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004081 SizeType = UnsignedLongLong;
4082 PtrDiffType = SignedLongLong;
4083 IntPtrType = SignedLongLong;
James Y Knighta3518ad2016-01-27 01:04:51 +00004084 this->UserLabelPrefix = "";
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004085 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004086
Craig Topper3164f332014-03-11 03:39:26 +00004087 void getTargetDefines(const LangOptions &Opts,
4088 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004089 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004090 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004091 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004092
Craig Topper3164f332014-03-11 03:39:26 +00004093 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004094 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004095 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004096
Craig Topper3164f332014-03-11 03:39:26 +00004097 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004098 switch (CC) {
4099 case CC_X86StdCall:
4100 case CC_X86ThisCall:
4101 case CC_X86FastCall:
4102 return CCCR_Ignore;
4103 case CC_C:
4104 case CC_X86VectorCall:
4105 case CC_IntelOclBicc:
4106 case CC_X86_64SysV:
4107 return CCCR_OK;
4108 default:
4109 return CCCR_Warning;
4110 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004111 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004112};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004113
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004114// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004115class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004116public:
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004117 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004118 : WindowsX86_64TargetInfo(Triple) {
Eli Friedman015d6282011-03-22 21:25:11 +00004119 LongDoubleWidth = LongDoubleAlign = 64;
4120 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004121 }
Craig Topper3164f332014-03-11 03:39:26 +00004122 void getTargetDefines(const LangOptions &Opts,
4123 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004124 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4125 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004126 Builder.defineMacro("_M_X64", "100");
4127 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004128 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004129};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004130
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004131// x86-64 MinGW target
4132class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4133public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004134 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
Reid Kleckner11a17192015-10-28 22:29:52 +00004135 : WindowsX86_64TargetInfo(Triple) {
4136 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4137 // with x86 FP ops. Weird.
4138 LongDoubleWidth = LongDoubleAlign = 128;
4139 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4140 }
4141
Craig Topper3164f332014-03-11 03:39:26 +00004142 void getTargetDefines(const LangOptions &Opts,
4143 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004144 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004145 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004146 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004147 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004148
4149 // GCC defines this macro when it is using __gxx_personality_seh0.
4150 if (!Opts.SjLjExceptions)
4151 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004152 }
4153};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004154
Yaron Kerend030d112015-07-22 17:38:19 +00004155// x86-64 Cygwin target
4156class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4157public:
4158 CygwinX86_64TargetInfo(const llvm::Triple &Triple)
4159 : X86_64TargetInfo(Triple) {
4160 TLSSupported = false;
4161 WCharType = UnsignedShort;
4162 }
4163 void getTargetDefines(const LangOptions &Opts,
4164 MacroBuilder &Builder) const override {
4165 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4166 Builder.defineMacro("__x86_64__");
4167 Builder.defineMacro("__CYGWIN__");
4168 Builder.defineMacro("__CYGWIN64__");
4169 addCygMingDefines(Opts, Builder);
4170 DefineStd(Builder, "unix", Opts);
4171 if (Opts.CPlusPlus)
4172 Builder.defineMacro("_GNU_SOURCE");
4173
4174 // GCC defines this macro when it is using __gxx_personality_seh0.
4175 if (!Opts.SjLjExceptions)
4176 Builder.defineMacro("__SEH__");
4177 }
4178};
4179
Eli Friedman2857ccb2009-07-01 03:36:11 +00004180class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4181public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004182 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
4183 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004184 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004185 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4186 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004187 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004188 UseSignedCharForObjCBool = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00004189 DataLayoutString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
Eli Friedman2857ccb2009-07-01 03:36:11 +00004190 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004191
4192 bool handleTargetFeatures(std::vector<std::string> &Features,
4193 DiagnosticsEngine &Diags) override {
4194 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4195 Diags))
4196 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004197 // We now know the features we have: we can decide how to align vectors.
4198 MaxVectorAlign =
4199 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004200 return true;
4201 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004202};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004203
Eli Friedman245f2292009-07-05 22:31:18 +00004204class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4205public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004206 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
4207 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
Eli Friedman245f2292009-07-05 22:31:18 +00004208 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004209 Int64Type = SignedLongLong;
4210 }
4211};
Eli Friedman245f2292009-07-05 22:31:18 +00004212
Eli Friedman9fa28852012-08-08 23:57:20 +00004213class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4214public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004215 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
4216 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
4217 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004218 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004219 }
4220};
Tim Northover9bb857a2013-01-31 12:13:10 +00004221
Eli Friedmanf05b7722008-08-20 07:44:10 +00004222class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004223 // Possible FPU choices.
4224 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004225 VFP2FPU = (1 << 0),
4226 VFP3FPU = (1 << 1),
4227 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004228 NeonFPU = (1 << 3),
4229 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004230 };
4231
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004232 // Possible HWDiv features.
4233 enum HWDivMode {
4234 HWDivThumb = (1 << 0),
4235 HWDivARM = (1 << 1)
4236 };
4237
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004238 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004239 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004240 }
4241
4242 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4243 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004244
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004245 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004246
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004247 StringRef CPUProfile;
4248 StringRef CPUAttr;
4249
Rafael Espindolaeb265472013-08-21 21:59:03 +00004250 enum {
4251 FP_Default,
4252 FP_VFP,
4253 FP_Neon
4254 } FPMath;
4255
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004256 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004257 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004258 unsigned ArchProfile;
4259 unsigned ArchVersion;
4260
Bernard Ogdenda13af32013-10-24 18:32:51 +00004261 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004262
Logan Chien57086ce2012-10-10 06:56:20 +00004263 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004264 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004265
4266 // Initialized via features.
4267 unsigned SoftFloat : 1;
4268 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004269
Bernard Ogden18b57012013-10-29 09:47:51 +00004270 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004271 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004272 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004273 unsigned Unaligned : 1;
4274
4275 enum {
4276 LDREX_B = (1 << 0), /// byte (8-bit)
4277 LDREX_H = (1 << 1), /// half (16-bit)
4278 LDREX_W = (1 << 2), /// word (32-bit)
4279 LDREX_D = (1 << 3), /// double (64-bit)
4280 };
4281
4282 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004283
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004284 // ACLE 6.5.1 Hardware floating point
4285 enum {
4286 HW_FP_HP = (1 << 1), /// half (16-bit)
4287 HW_FP_SP = (1 << 2), /// single (32-bit)
4288 HW_FP_DP = (1 << 3), /// double (64-bit)
4289 };
4290 uint32_t HW_FP;
4291
Chris Lattner5cc15e02010-03-03 19:03:45 +00004292 static const Builtin::Info BuiltinInfo[];
4293
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004294 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004295 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004296
4297 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004298 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004299
Renato Golin9ba39232015-02-27 16:35:48 +00004300 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4301 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4302 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004303 SizeType = UnsignedLong;
4304 else
4305 SizeType = UnsignedInt;
4306
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004307 switch (T.getOS()) {
4308 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004309 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004310 break;
4311 case llvm::Triple::Win32:
4312 WCharType = UnsignedShort;
4313 break;
4314 case llvm::Triple::Linux:
4315 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004316 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4317 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004318 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004319 }
4320
4321 UseBitFieldTypeAlignment = true;
4322
4323 ZeroLengthBitfieldBoundary = 0;
4324
Tim Northover147cd2f2014-10-14 22:12:21 +00004325 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4326 // so set preferred for small types to 32.
4327 if (T.isOSBinFormatMachO()) {
Eric Christopher964a5f32015-08-05 23:48:05 +00004328 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004329 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4330 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
4331 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004332 assert(!BigEndian && "Windows on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004333 DataLayoutString = "e"
4334 "-m:w"
4335 "-p:32:32"
4336 "-i64:64"
4337 "-v128:64:128"
4338 "-a:0:32"
4339 "-n32"
4340 "-S64";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004341 } else if (T.isOSNaCl()) {
4342 assert(!BigEndian && "NaCl on ARM does not support big endian");
Eric Christopher964a5f32015-08-05 23:48:05 +00004343 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004344 } else {
Eric Christopher964a5f32015-08-05 23:48:05 +00004345 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004346 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4347 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004348 }
4349
4350 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004351 }
4352
Tim Northover5627d392015-10-30 16:30:45 +00004353 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004354 const llvm::Triple &T = getTriple();
4355
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004356 IsAAPCS = false;
4357
Tim Northover5627d392015-10-30 16:30:45 +00004358 if (IsAAPCS16)
4359 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4360 else
4361 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004362
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004363 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004364 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004365 SizeType = UnsignedInt;
4366 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004367 SizeType = UnsignedLong;
4368
4369 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4370 WCharType = SignedInt;
4371
4372 // Do not respect the alignment of bit-field types when laying out
4373 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4374 UseBitFieldTypeAlignment = false;
4375
4376 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4377 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4378 /// gcc.
4379 ZeroLengthBitfieldBoundary = 32;
4380
Tim Northover5627d392015-10-30 16:30:45 +00004381 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4382 assert(!BigEndian && "AAPCS16 does not support big-endian");
4383 DataLayoutString = "e-m:o-p:32:32-i64:64-a:0:32-n32-S128";
4384 } else if (T.isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00004385 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004386 BigEndian
4387 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4388 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
4389 else
Eric Christopher964a5f32015-08-05 23:48:05 +00004390 DataLayoutString =
Tim Northover147cd2f2014-10-14 22:12:21 +00004391 BigEndian
4392 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
4393 : "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 +00004394
4395 // FIXME: Override "preferred align" for double and long long.
4396 }
4397
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004398 void setArchInfo() {
4399 StringRef ArchName = getTriple().getArchName();
4400
Renato Goline84b0002015-10-08 16:43:26 +00004401 ArchISA = llvm::ARM::parseArchISA(ArchName);
4402 CPU = llvm::ARM::getDefaultCPU(ArchName);
4403 unsigned AK = llvm::ARM::parseArch(ArchName);
4404 if (AK != llvm::ARM::AK_INVALID)
4405 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004406 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004407 }
4408
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004409 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004410 StringRef SubArch;
4411
4412 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004413 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004414 SubArch = llvm::ARM::getSubArch(ArchKind);
4415 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4416 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004417
4418 // cache CPU related strings
4419 CPUAttr = getCPUAttr();
4420 CPUProfile = getCPUProfile();
4421 }
4422
4423 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004424 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004425 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004426 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004427 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4428 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004429 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004430 if (ArchProfile == llvm::ARM::PK_M) {
4431 MaxAtomicPromoteWidth = 32;
4432 if (ShouldUseInlineAtomic)
4433 MaxAtomicInlineWidth = 32;
4434 }
4435 else {
4436 MaxAtomicPromoteWidth = 64;
4437 if (ShouldUseInlineAtomic)
4438 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004439 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004440 }
4441
4442 bool isThumb() const {
4443 return (ArchISA == llvm::ARM::IK_THUMB);
4444 }
4445
4446 bool supportsThumb() const {
4447 return CPUAttr.count('T') || ArchVersion >= 6;
4448 }
4449
4450 bool supportsThumb2() const {
4451 return CPUAttr.equals("6T2") || ArchVersion >= 7;
4452 }
4453
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004454 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004455 // For most sub-arches, the build attribute CPU name is enough.
4456 // For Cortex variants, it's slightly different.
4457 switch(ArchKind) {
4458 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004459 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004460 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004461 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004462 case llvm::ARM::AK_ARMV7S:
4463 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004464 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004465 return "7A";
4466 case llvm::ARM::AK_ARMV7R:
4467 return "7R";
4468 case llvm::ARM::AK_ARMV7M:
4469 return "7M";
4470 case llvm::ARM::AK_ARMV7EM:
4471 return "7EM";
4472 case llvm::ARM::AK_ARMV8A:
4473 return "8A";
4474 case llvm::ARM::AK_ARMV8_1A:
4475 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004476 case llvm::ARM::AK_ARMV8_2A:
4477 return "8_2A";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004478 }
4479 }
4480
4481 StringRef getCPUProfile() const {
4482 switch(ArchProfile) {
4483 case llvm::ARM::PK_A:
4484 return "A";
4485 case llvm::ARM::PK_R:
4486 return "R";
4487 case llvm::ARM::PK_M:
4488 return "M";
4489 default:
4490 return "";
4491 }
4492 }
4493
Chris Lattner17df24e2008-04-21 18:56:49 +00004494public:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004495 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
Renato Goline84b0002015-10-08 16:43:26 +00004496 : TargetInfo(Triple), FPMath(FP_Default),
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004497 IsAAPCS(true), LDREX(0), HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004498 BigEndian = IsBigEndian;
4499
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004500 switch (getTriple().getOS()) {
4501 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004502 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004503 break;
4504 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004505 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004506 break;
4507 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004508
Renato Goline84b0002015-10-08 16:43:26 +00004509 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004510 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004511
Chris Lattner1a8f3942010-04-23 16:29:58 +00004512 // {} in inline assembly are neon specifiers, not assembly variant
4513 // specifiers.
4514 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004515
Eric Christopher0e261882014-12-05 01:06:59 +00004516 // FIXME: This duplicates code from the driver that sets the -target-abi
4517 // option - this code is used if -target-abi isn't passed and should
4518 // be unified in some way.
4519 if (Triple.isOSBinFormatMachO()) {
4520 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4521 // the frontend matches that.
4522 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4523 Triple.getOS() == llvm::Triple::UnknownOS ||
4524 StringRef(CPU).startswith("cortex-m")) {
4525 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004526 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004527 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004528 } else {
4529 setABI("apcs-gnu");
4530 }
4531 } else if (Triple.isOSWindows()) {
4532 // FIXME: this is invalid for WindowsCE
4533 setABI("aapcs");
4534 } else {
4535 // Select the default based on the platform.
4536 switch (Triple.getEnvironment()) {
4537 case llvm::Triple::Android:
4538 case llvm::Triple::GNUEABI:
4539 case llvm::Triple::GNUEABIHF:
4540 setABI("aapcs-linux");
4541 break;
4542 case llvm::Triple::EABIHF:
4543 case llvm::Triple::EABI:
4544 setABI("aapcs");
4545 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004546 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004547 setABI("apcs-gnu");
4548 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004549 default:
4550 if (Triple.getOS() == llvm::Triple::NetBSD)
4551 setABI("apcs-gnu");
4552 else
4553 setABI("aapcs");
4554 break;
4555 }
4556 }
John McCall86353412010-08-21 22:46:04 +00004557
4558 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004559 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004560
Renato Golin15b86152015-07-03 16:41:13 +00004561 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004562 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004563
James Molloya7139222012-03-12 09:14:10 +00004564 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004565 // the alignment of the zero-length bitfield is greater than the member
4566 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004567 // zero length bitfield.
4568 UseZeroLengthBitfieldAlignment = true;
Eli Friedmanb5366062008-05-20 14:21:01 +00004569 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004570
Alp Toker4925ba72014-06-07 23:30:42 +00004571 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004572
Craig Topper3164f332014-03-11 03:39:26 +00004573 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004574 ABI = Name;
4575
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004576 // The defaults (above) are for AAPCS, check if we need to change them.
4577 //
4578 // FIXME: We need support for -meabi... we could just mangle it into the
4579 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004580 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004581 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004582 return true;
4583 }
4584 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4585 setABIAAPCS();
4586 return true;
4587 }
4588 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004589 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004590
Renato Golinf5c4dec2015-05-27 13:33:00 +00004591 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004592 bool
4593 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4594 StringRef CPU,
4595 const std::vector<std::string> &FeaturesVec) const override {
4596
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004597 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004598 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004599
4600 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004601 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004602 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4603
4604 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004605 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004606 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4607
4608 for (const char *Feature : TargetFeatures)
4609 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004610 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004611
Eric Christopher007b0a02015-08-28 22:32:01 +00004612 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004613 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004614
Craig Topper3164f332014-03-11 03:39:26 +00004615 bool handleTargetFeatures(std::vector<std::string> &Features,
4616 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004617 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00004618 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00004619 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004620 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004621 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004622 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004623 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004624
Ranjeet Singhac08e532015-06-24 23:39:25 +00004625 // This does not diagnose illegal cases like having both
4626 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
4627 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004628 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004629 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004630 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004631 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00004632 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004633 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004634 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004635 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004636 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004637 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004638 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004639 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004640 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004641 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004642 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004643 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004644 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004645 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004646 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00004647 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004648 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004649 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004650 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004651 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004652 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00004653 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004654 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00004655 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00004656 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004657 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004658 } else if (Feature == "+fp-only-sp") {
Richard Barton7dacc242015-10-21 10:03:55 +00004659 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004660 } else if (Feature == "+strict-align") {
4661 Unaligned = 0;
4662 } else if (Feature == "+fp16") {
4663 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004664 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004665 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00004666 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004667
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004668 switch (ArchVersion) {
4669 case 6:
4670 if (ArchProfile == llvm::ARM::PK_M)
4671 LDREX = 0;
4672 else if (ArchKind == llvm::ARM::AK_ARMV6K)
4673 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4674 else
4675 LDREX = LDREX_W;
4676 break;
4677 case 7:
4678 if (ArchProfile == llvm::ARM::PK_M)
4679 LDREX = LDREX_W | LDREX_H | LDREX_B ;
4680 else
4681 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4682 break;
4683 case 8:
4684 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
4685 }
4686
Rafael Espindolaeb265472013-08-21 21:59:03 +00004687 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4688 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4689 return false;
4690 }
4691
4692 if (FPMath == FP_Neon)
4693 Features.push_back("+neonfp");
4694 else if (FPMath == FP_VFP)
4695 Features.push_back("-neonfp");
4696
Daniel Dunbar893d4752009-12-19 04:15:38 +00004697 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00004698 auto Feature =
4699 std::find(Features.begin(), Features.end(), "+soft-float-abi");
4700 if (Feature != Features.end())
4701 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00004702
Rafael Espindolaeb265472013-08-21 21:59:03 +00004703 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004704 }
4705
Craig Topper3164f332014-03-11 03:39:26 +00004706 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004707 return llvm::StringSwitch<bool>(Feature)
4708 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00004709 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004710 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004711 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00004712 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004713 .Case("hwdiv", HWDiv & HWDivThumb)
4714 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004715 .Default(false);
4716 }
Renato Golin15b86152015-07-03 16:41:13 +00004717
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004718 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004719 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004720 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004721
Renato Golin15b86152015-07-03 16:41:13 +00004722 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004723 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004724 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004725 CPU = Name;
4726 return true;
4727 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004728
Craig Topper3164f332014-03-11 03:39:26 +00004729 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004730
Craig Topper3164f332014-03-11 03:39:26 +00004731 void getTargetDefines(const LangOptions &Opts,
4732 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00004733 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004734 Builder.defineMacro("__arm");
4735 Builder.defineMacro("__arm__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004736
Chris Lattnerecd49032009-03-02 22:27:17 +00004737 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004738 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00004739
4740 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
4741 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00004742 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00004743 Builder.defineMacro("__ARM_ARCH_7K__", "2");
4744
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004745 if (!CPUAttr.empty())
4746 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004747
4748 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004749 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00004750 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004751
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004752 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004753 // ACLE 6.5.7 Crypto Extension
4754 if (Crypto)
4755 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
4756 // ACLE 6.5.8 CRC32 Extension
4757 if (CRC)
4758 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
4759 // ACLE 6.5.10 Numeric Maximum and Minimum
4760 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
4761 // ACLE 6.5.9 Directed Rounding
4762 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00004763 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004764
4765 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4766 // is not defined for the M-profile.
4767 // NOTE that the deffault profile is assumed to be 'A'
4768 if (CPUProfile.empty() || CPUProfile != "M")
4769 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4770
4771 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4772 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4773 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004774 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004775 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004776 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004777 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4778
4779 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4780 // instruction set such as ARM or Thumb.
4781 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4782
4783 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4784
4785 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004786 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00004787 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004788
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004789 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00004790 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004791 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00004792
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004793 // ACLE 6.4.4 LDREX/STREX
4794 if (LDREX)
4795 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
4796
4797 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00004798 if (ArchVersion == 5 ||
4799 (ArchVersion == 6 && CPUProfile != "M") ||
4800 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004801 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
4802
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004803 // ACLE 6.5.1 Hardware Floating Point
4804 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00004805 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004806
Yi Konga44c4d72014-06-27 21:25:42 +00004807 // ACLE predefines.
4808 Builder.defineMacro("__ARM_ACLE", "200");
4809
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004810 // FP16 support (we currently only support IEEE format).
4811 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
4812 Builder.defineMacro("__ARM_FP16_ARGS", "1");
4813
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004814 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
4815 if (ArchVersion >= 7 && (CPUProfile != "M" || CPUAttr == "7EM"))
4816 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
4817
Mike Stump9d54bd72009-04-08 02:07:04 +00004818 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004819
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004820 // FIXME: It's more complicated than this and we don't really support
4821 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004822 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004823 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004824 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004825
David Tweed8f676532012-10-25 13:33:01 +00004826 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00004827 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00004828 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4829 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00004830 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004831 Builder.defineMacro("__ARM_PCS", "1");
4832
David Tweed8f676532012-10-25 13:33:01 +00004833 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00004834 Builder.defineMacro("__ARM_PCS_VFP", "1");
4835 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004836
Daniel Dunbar893d4752009-12-19 04:15:38 +00004837 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004838 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004839
4840 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004841 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004842
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004843 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004844 Builder.defineMacro("__THUMBEL__");
4845 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004846 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004847 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004848 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004849
4850 // ACLE 6.4.9 32-bit SIMD instructions
4851 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
4852 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
4853
4854 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00004855 if (((HWDiv & HWDivThumb) && isThumb()) ||
4856 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004857 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004858 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004859 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00004860
4861 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004862 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004863
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004864 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004865 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004866 if (FPU & VFP2FPU)
4867 Builder.defineMacro("__ARM_VFPV2__");
4868 if (FPU & VFP3FPU)
4869 Builder.defineMacro("__ARM_VFPV3__");
4870 if (FPU & VFP4FPU)
4871 Builder.defineMacro("__ARM_VFPV4__");
4872 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00004873
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004874 // This only gets set when Neon instructions are actually available, unlike
4875 // the VFP define, hence the soft float and arch check. This is subtly
4876 // different from gcc, we follow the intent which was that it should be set
4877 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004878 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004879 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004880 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004881 // current AArch32 NEON implementations do not support double-precision
4882 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00004883 Builder.defineMacro("__ARM_NEON_FP",
4884 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00004885 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00004886
Bradley Smith0f28f0c2014-01-20 10:52:00 +00004887 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4888 Opts.ShortWChar ? "2" : "4");
4889
4890 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4891 Opts.ShortEnums ? "1" : "4");
4892
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004893 if (ArchVersion >= 6 && CPUAttr != "6M") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00004894 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4895 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4896 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4897 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4898 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00004899
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004900 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004901 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004902 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004903 }
4904
4905 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004906 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004907 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
4908 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004909 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004910 }
4911
4912 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004913 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004914 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00004915
4916 if (Opts.UnsafeFPMath)
4917 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00004918
4919 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
4920 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00004921 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004922
Craig Topper6c03a542015-10-19 04:51:35 +00004923 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4924 return llvm::makeArrayRef(BuiltinInfo,
4925 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00004926 }
Craig Topper3164f332014-03-11 03:39:26 +00004927 bool isCLZForZeroUndef() const override { return false; }
4928 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00004929 return IsAAPCS
4930 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00004931 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
4932 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00004933 }
Craig Topperf054e3a2015-10-19 03:52:27 +00004934 ArrayRef<const char *> getGCCRegNames() const override;
4935 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00004936 bool validateAsmConstraint(const char *&Name,
4937 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00004938 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00004939 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00004940 case 'l': // r0-r7
4941 case 'h': // r8-r15
4942 case 'w': // VFP Floating point register single precision
4943 case 'P': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00004944 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00004945 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004946 case 'I':
4947 case 'J':
4948 case 'K':
4949 case 'L':
4950 case 'M':
4951 // FIXME
4952 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00004953 case 'Q': // A memory address that is a single base register.
4954 Info.setAllowsMemory();
4955 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004956 case 'U': // a memory reference...
4957 switch (Name[1]) {
4958 case 'q': // ...ARMV4 ldrsb
4959 case 'v': // ...VFP load/store (reg+constant offset)
4960 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00004961 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00004962 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00004963 case 'n': // valid address for Neon doubleword vector load/store
4964 case 'm': // valid address for Neon element and structure load/store
4965 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00004966 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004967 Info.setAllowsMemory();
4968 Name++;
4969 return true;
4970 }
Nate Begeman2908fa02008-04-22 05:03:19 +00004971 }
Chris Lattner17df24e2008-04-21 18:56:49 +00004972 return false;
4973 }
Craig Topper3164f332014-03-11 03:39:26 +00004974 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004975 std::string R;
4976 switch (*Constraint) {
4977 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00004978 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004979 Constraint++;
4980 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00004981 case 'p': // 'p' should be translated to 'r' by default.
4982 R = std::string("r");
4983 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004984 default:
4985 return std::string(1, *Constraint);
4986 }
4987 return R;
4988 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00004989 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00004990 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00004991 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00004992 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00004993 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00004994
Bill Wendling9d1ee112012-10-25 23:28:48 +00004995 // Strip off constraint modifiers.
4996 while (Constraint[0] == '=' ||
4997 Constraint[0] == '+' ||
4998 Constraint[0] == '&')
4999 Constraint = Constraint.substr(1);
5000
5001 switch (Constraint[0]) {
5002 default: break;
5003 case 'r': {
5004 switch (Modifier) {
5005 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005006 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005007 case 'q':
5008 // A register of size 32 cannot fit a vector type.
5009 return false;
5010 }
5011 }
5012 }
5013
5014 return true;
5015 }
Craig Topper3164f332014-03-11 03:39:26 +00005016 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005017 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005018 return "";
5019 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005020
Craig Topper3164f332014-03-11 03:39:26 +00005021 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005022 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
5023 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005024
Craig Topper3164f332014-03-11 03:39:26 +00005025 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005026 if (RegNo == 0) return 0;
5027 if (RegNo == 1) return 1;
5028 return -1;
5029 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005030
5031 bool hasSjLjLowering() const override {
5032 return true;
5033 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005034};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005035
Rafael Espindolaeb265472013-08-21 21:59:03 +00005036bool ARMTargetInfo::setFPMath(StringRef Name) {
5037 if (Name == "neon") {
5038 FPMath = FP_Neon;
5039 return true;
5040 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5041 Name == "vfp4") {
5042 FPMath = FP_VFP;
5043 return true;
5044 }
5045 return false;
5046}
5047
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005048const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005049 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005050 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005051 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5052
5053 // Float registers
5054 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5055 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5056 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005057 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005058
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005059 // Double registers
5060 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5061 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005062 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5063 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005064
5065 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005066 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5067 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005068};
5069
Craig Topperf054e3a2015-10-19 03:52:27 +00005070ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5071 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005072}
5073
5074const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005075 { { "a1" }, "r0" },
5076 { { "a2" }, "r1" },
5077 { { "a3" }, "r2" },
5078 { { "a4" }, "r3" },
5079 { { "v1" }, "r4" },
5080 { { "v2" }, "r5" },
5081 { { "v3" }, "r6" },
5082 { { "v4" }, "r7" },
5083 { { "v5" }, "r8" },
5084 { { "v6", "rfp" }, "r9" },
5085 { { "sl" }, "r10" },
5086 { { "fp" }, "r11" },
5087 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005088 { { "r13" }, "sp" },
5089 { { "r14" }, "lr" },
5090 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005091 // The S, D and Q registers overlap, but aren't really aliases; we
5092 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005093};
5094
Craig Topperf054e3a2015-10-19 03:52:27 +00005095ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5096 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005097}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005098
5099const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005100#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005101 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005102#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5103 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005104#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005105
Craig Topper07d3b622015-08-07 05:14:44 +00005106#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005107 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005108#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005109 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005110#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5111 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005112#include "clang/Basic/BuiltinsARM.def"
5113};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005114
5115class ARMleTargetInfo : public ARMTargetInfo {
5116public:
5117 ARMleTargetInfo(const llvm::Triple &Triple)
5118 : ARMTargetInfo(Triple, false) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005119 void getTargetDefines(const LangOptions &Opts,
5120 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005121 Builder.defineMacro("__ARMEL__");
5122 ARMTargetInfo::getTargetDefines(Opts, Builder);
5123 }
5124};
5125
5126class ARMbeTargetInfo : public ARMTargetInfo {
5127public:
5128 ARMbeTargetInfo(const llvm::Triple &Triple)
5129 : ARMTargetInfo(Triple, true) { }
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005130 void getTargetDefines(const LangOptions &Opts,
5131 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005132 Builder.defineMacro("__ARMEB__");
5133 Builder.defineMacro("__ARM_BIG_ENDIAN");
5134 ARMTargetInfo::getTargetDefines(Opts, Builder);
5135 }
5136};
Chris Lattner17df24e2008-04-21 18:56:49 +00005137
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005138class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5139 const llvm::Triple Triple;
5140public:
5141 WindowsARMTargetInfo(const llvm::Triple &Triple)
5142 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005143 WCharType = UnsignedShort;
5144 SizeType = UnsignedInt;
James Y Knighta3518ad2016-01-27 01:04:51 +00005145 UserLabelPrefix = "";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005146 }
5147 void getVisualStudioDefines(const LangOptions &Opts,
5148 MacroBuilder &Builder) const {
5149 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5150
5151 // FIXME: this is invalid for WindowsCE
5152 Builder.defineMacro("_M_ARM_NT", "1");
5153 Builder.defineMacro("_M_ARMT", "_M_ARM");
5154 Builder.defineMacro("_M_THUMB", "_M_ARM");
5155
5156 assert((Triple.getArch() == llvm::Triple::arm ||
5157 Triple.getArch() == llvm::Triple::thumb) &&
5158 "invalid architecture for Windows ARM target info");
5159 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5160 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5161
5162 // TODO map the complete set of values
5163 // 31: VFPv3 40: VFPv4
5164 Builder.defineMacro("_M_ARM_FP", "31");
5165 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005166 BuiltinVaListKind getBuiltinVaListKind() const override {
5167 return TargetInfo::CharPtrBuiltinVaList;
5168 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005169 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5170 switch (CC) {
5171 case CC_X86StdCall:
5172 case CC_X86ThisCall:
5173 case CC_X86FastCall:
5174 case CC_X86VectorCall:
5175 return CCCR_Ignore;
5176 case CC_C:
5177 return CCCR_OK;
5178 default:
5179 return CCCR_Warning;
5180 }
5181 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005182};
5183
5184// Windows ARM + Itanium C++ ABI Target
5185class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5186public:
5187 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
5188 : WindowsARMTargetInfo(Triple) {
5189 TheCXXABI.set(TargetCXXABI::GenericARM);
5190 }
5191
5192 void getTargetDefines(const LangOptions &Opts,
5193 MacroBuilder &Builder) const override {
5194 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5195
5196 if (Opts.MSVCCompat)
5197 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5198 }
5199};
5200
5201// Windows ARM, MS (C++) ABI
5202class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5203public:
5204 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
5205 : WindowsARMTargetInfo(Triple) {
5206 TheCXXABI.set(TargetCXXABI::Microsoft);
5207 }
5208
5209 void getTargetDefines(const LangOptions &Opts,
5210 MacroBuilder &Builder) const override {
5211 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5212 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5213 }
5214};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005215
Yaron Keren321249c2015-07-15 13:32:23 +00005216// ARM MinGW target
5217class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5218public:
5219 MinGWARMTargetInfo(const llvm::Triple &Triple)
5220 : WindowsARMTargetInfo(Triple) {
5221 TheCXXABI.set(TargetCXXABI::GenericARM);
5222 }
5223
5224 void getTargetDefines(const LangOptions &Opts,
5225 MacroBuilder &Builder) const override {
5226 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5227 DefineStd(Builder, "WIN32", Opts);
5228 DefineStd(Builder, "WINNT", Opts);
5229 Builder.defineMacro("_ARM_");
5230 addMinGWDefines(Opts, Builder);
5231 }
5232};
5233
5234// ARM Cygwin target
5235class CygwinARMTargetInfo : public ARMleTargetInfo {
5236public:
5237 CygwinARMTargetInfo(const llvm::Triple &Triple) : ARMleTargetInfo(Triple) {
5238 TLSSupported = false;
5239 WCharType = UnsignedShort;
5240 DoubleAlign = LongLongAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00005241 DataLayoutString = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
Yaron Keren321249c2015-07-15 13:32:23 +00005242 }
5243 void getTargetDefines(const LangOptions &Opts,
5244 MacroBuilder &Builder) const override {
5245 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5246 Builder.defineMacro("_ARM_");
5247 Builder.defineMacro("__CYGWIN__");
5248 Builder.defineMacro("__CYGWIN32__");
5249 DefineStd(Builder, "unix", Opts);
5250 if (Opts.CPlusPlus)
5251 Builder.defineMacro("_GNU_SOURCE");
5252 }
5253};
5254
Mike Stump11289f42009-09-09 15:08:12 +00005255class DarwinARMTargetInfo :
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005256 public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005257protected:
Craig Topper3164f332014-03-11 03:39:26 +00005258 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5259 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005260 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005261 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005262
Torok Edwinb2b37c62009-06-30 17:10:35 +00005263public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005264 DarwinARMTargetInfo(const llvm::Triple &Triple)
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005265 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005266 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005267 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005268 // FIXME: This should be based off of the target features in
5269 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005270 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005271
Tim Northoverd88ecb32016-01-27 19:32:40 +00005272 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005273 // Darwin on iOS uses a variant of the ARM C++ ABI.
5274 TheCXXABI.set(TargetCXXABI::WatchOS);
5275
5276 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5277 // size_t is long, it's a bit weird for it to be int.
5278 PtrDiffType = SignedLong;
5279
5280 // BOOL should be a real boolean on the new ABI
5281 UseSignedCharForObjCBool = false;
5282 } else
5283 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005284 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005285};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005286
Tim Northover573cbee2014-05-24 12:52:07 +00005287class AArch64TargetInfo : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005288 virtual void setDataLayoutString() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005289 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5290 static const char *const GCCRegNames[];
5291
James Molloy75f5f9e2014-04-16 15:33:48 +00005292 enum FPUModeEnum {
5293 FPUMode,
5294 NeonMode
5295 };
5296
5297 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005298 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005299 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005300 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005301 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005302
Tim Northovera2ee4332014-03-29 15:09:45 +00005303 static const Builtin::Info BuiltinInfo[];
5304
5305 std::string ABI;
5306
5307public:
Tim Northover573cbee2014-05-24 12:52:07 +00005308 AArch64TargetInfo(const llvm::Triple &Triple)
Tim Northovera2ee4332014-03-29 15:09:45 +00005309 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005310
5311 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5312 WCharType = SignedInt;
5313
5314 // NetBSD apparently prefers consistency across ARM targets to consistency
5315 // across 64-bit targets.
5316 Int64Type = SignedLongLong;
5317 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005318 } else {
5319 WCharType = UnsignedInt;
5320 Int64Type = SignedLong;
5321 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005322 }
5323
Tim Northovera2ee4332014-03-29 15:09:45 +00005324 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005325 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005326 MaxAtomicInlineWidth = 128;
5327 MaxAtomicPromoteWidth = 128;
5328
Tim Northovera6a19f12015-02-06 01:25:07 +00005329 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005330 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5331
Tim Northovera2ee4332014-03-29 15:09:45 +00005332 // {} in inline assembly are neon specifiers, not assembly variant
5333 // specifiers.
5334 NoAsmVariants = true;
5335
Tim Northover7ad87af2015-01-16 18:44:04 +00005336 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5337 // contributes to the alignment of the containing aggregate in the same way
5338 // a plain (non bit-field) member of that type would, without exception for
5339 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005340 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005341 UseZeroLengthBitfieldAlignment = true;
5342
Tim Northover573cbee2014-05-24 12:52:07 +00005343 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005344 TheCXXABI.set(TargetCXXABI::GenericAArch64);
5345 }
5346
Alp Toker4925ba72014-06-07 23:30:42 +00005347 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005348 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005349 if (Name != "aapcs" && Name != "darwinpcs")
5350 return false;
5351
5352 ABI = Name;
5353 return true;
5354 }
5355
David Blaikie1cbb9712014-11-14 19:09:44 +00005356 bool setCPU(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005357 bool CPUKnown = llvm::StringSwitch<bool>(Name)
James Molloy5e73df52014-04-16 15:06:20 +00005358 .Case("generic", true)
MinSeong Kim50d9c152016-01-05 12:53:24 +00005359 .Cases("cortex-a53", "cortex-a57", "cortex-a72",
5360 "cortex-a35", "exynos-m1", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005361 .Case("cyclone", true)
Chad Rosierb0ce1952016-02-11 18:09:31 +00005362 .Case("kryo", true)
Tim Northovera2ee4332014-03-29 15:09:45 +00005363 .Default(false);
5364 return CPUKnown;
5365 }
5366
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005367 void getTargetDefines(const LangOptions &Opts,
5368 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005369 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005370 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005371
5372 // Target properties.
5373 Builder.defineMacro("_LP64");
5374 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005375
5376 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5377 Builder.defineMacro("__ARM_ACLE", "200");
5378 Builder.defineMacro("__ARM_ARCH", "8");
5379 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5380
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005381 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005382 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005383 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005384
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005385 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5386 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5387 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5388 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005389 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005390 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5391 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005392
5393 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5394
5395 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005396 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005397
5398 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5399 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005400 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5401 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005402
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005403 if (Opts.UnsafeFPMath)
5404 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005405
5406 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5407
5408 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5409 Opts.ShortEnums ? "1" : "4");
5410
James Molloy75f5f9e2014-04-16 15:33:48 +00005411 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005412 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005413 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005414 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005415 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005416
Bradley Smith418c5932014-05-02 15:17:51 +00005417 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005418 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005419
James Molloy75f5f9e2014-04-16 15:33:48 +00005420 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005421 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5422
5423 if (Unaligned)
5424 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005425
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005426 if (V8_1A)
5427 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5428
Reid Klecknerd167d422015-05-06 15:31:46 +00005429 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5430 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5431 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5432 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5433 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005434 }
5435
Craig Topper6c03a542015-10-19 04:51:35 +00005436 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5437 return llvm::makeArrayRef(BuiltinInfo,
5438 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005439 }
5440
David Blaikie1cbb9712014-11-14 19:09:44 +00005441 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005442 return Feature == "aarch64" ||
5443 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005444 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005445 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005446 }
5447
James Molloy5e73df52014-04-16 15:06:20 +00005448 bool handleTargetFeatures(std::vector<std::string> &Features,
5449 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005450 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005451 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005452 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005453 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005454 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005455
Eric Christopher610fe112015-08-26 08:21:55 +00005456 for (const auto &Feature : Features) {
5457 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005458 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005459 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005460 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005461 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005462 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005463 if (Feature == "+strict-align")
5464 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005465 if (Feature == "+v8.1a")
5466 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005467 }
5468
Eric Christopher964a5f32015-08-05 23:48:05 +00005469 setDataLayoutString();
James Molloy5e73df52014-04-16 15:06:20 +00005470
5471 return true;
5472 }
5473
David Blaikie1cbb9712014-11-14 19:09:44 +00005474 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005475
David Blaikie1cbb9712014-11-14 19:09:44 +00005476 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005477 return TargetInfo::AArch64ABIBuiltinVaList;
5478 }
5479
Craig Topperf054e3a2015-10-19 03:52:27 +00005480 ArrayRef<const char *> getGCCRegNames() const override;
5481 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005482
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005483 bool validateAsmConstraint(const char *&Name,
5484 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005485 switch (*Name) {
5486 default:
5487 return false;
5488 case 'w': // Floating point and SIMD registers (V0-V31)
5489 Info.setAllowsRegister();
5490 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005491 case 'I': // Constant that can be used with an ADD instruction
5492 case 'J': // Constant that can be used with a SUB instruction
5493 case 'K': // Constant that can be used with a 32-bit logical instruction
5494 case 'L': // Constant that can be used with a 64-bit logical instruction
5495 case 'M': // Constant that can be used as a 32-bit MOV immediate
5496 case 'N': // Constant that can be used as a 64-bit MOV immediate
5497 case 'Y': // Floating point constant zero
5498 case 'Z': // Integer constant zero
5499 return true;
5500 case 'Q': // A memory reference with base register and no offset
5501 Info.setAllowsMemory();
5502 return true;
5503 case 'S': // A symbolic address
5504 Info.setAllowsRegister();
5505 return true;
5506 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005507 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5508 // Utf: A memory address suitable for ldp/stp in TF mode.
5509 // Usa: An absolute symbolic address.
5510 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5511 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005512 case 'z': // Zero register, wzr or xzr
5513 Info.setAllowsRegister();
5514 return true;
5515 case 'x': // Floating point and SIMD registers (V0-V15)
5516 Info.setAllowsRegister();
5517 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005518 }
5519 return false;
5520 }
5521
Akira Hatanaka987f1862014-08-22 06:05:21 +00005522 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005523 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005524 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005525 // Strip off constraint modifiers.
5526 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5527 Constraint = Constraint.substr(1);
5528
5529 switch (Constraint[0]) {
5530 default:
5531 return true;
5532 case 'z':
5533 case 'r': {
5534 switch (Modifier) {
5535 case 'x':
5536 case 'w':
5537 // For now assume that the person knows what they're
5538 // doing with the modifier.
5539 return true;
5540 default:
5541 // By default an 'r' constraint will be in the 'x'
5542 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005543 if (Size == 64)
5544 return true;
5545
5546 SuggestedModifier = "w";
5547 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005548 }
5549 }
5550 }
5551 }
5552
David Blaikie1cbb9712014-11-14 19:09:44 +00005553 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005554
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005555 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005556 if (RegNo == 0)
5557 return 0;
5558 if (RegNo == 1)
5559 return 1;
5560 return -1;
5561 }
5562};
5563
Tim Northover573cbee2014-05-24 12:52:07 +00005564const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005565 // 32-bit Integer registers
5566 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5567 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5568 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5569
5570 // 64-bit Integer registers
5571 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5572 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5573 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5574
5575 // 32-bit floating point regsisters
5576 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5577 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5578 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5579
5580 // 64-bit floating point regsisters
5581 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5582 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5583 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5584
5585 // Vector registers
5586 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5587 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5588 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
5589};
5590
Craig Topperf054e3a2015-10-19 03:52:27 +00005591ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
5592 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00005593}
5594
Tim Northover573cbee2014-05-24 12:52:07 +00005595const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005596 { { "w31" }, "wsp" },
5597 { { "x29" }, "fp" },
5598 { { "x30" }, "lr" },
5599 { { "x31" }, "sp" },
5600 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
5601 // don't want to substitute one of these for a different-sized one.
5602};
5603
Craig Topperf054e3a2015-10-19 03:52:27 +00005604ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
5605 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00005606}
5607
Tim Northover573cbee2014-05-24 12:52:07 +00005608const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005609#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005610 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005611#include "clang/Basic/BuiltinsNEON.def"
5612
5613#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00005614 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00005615#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00005616};
James Molloy5e73df52014-04-16 15:06:20 +00005617
Tim Northover573cbee2014-05-24 12:52:07 +00005618class AArch64leTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005619 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005620 if (getTriple().isOSBinFormatMachO())
Eric Christopher964a5f32015-08-05 23:48:05 +00005621 DataLayoutString = "e-m:o-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005622 else
Eric Christopher964a5f32015-08-05 23:48:05 +00005623 DataLayoutString = "e-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005624 }
5625
5626public:
Tim Northover573cbee2014-05-24 12:52:07 +00005627 AArch64leTargetInfo(const llvm::Triple &Triple)
5628 : AArch64TargetInfo(Triple) {
James Molloy5e73df52014-04-16 15:06:20 +00005629 BigEndian = false;
5630 }
5631 void getTargetDefines(const LangOptions &Opts,
5632 MacroBuilder &Builder) const override {
5633 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00005634 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005635 }
5636};
5637
Tim Northover573cbee2014-05-24 12:52:07 +00005638class AArch64beTargetInfo : public AArch64TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00005639 void setDataLayoutString() override {
James Molloy5e73df52014-04-16 15:06:20 +00005640 assert(!getTriple().isOSBinFormatMachO());
Eric Christopher964a5f32015-08-05 23:48:05 +00005641 DataLayoutString = "E-m:e-i64:64-i128:128-n32:64-S128";
James Molloy5e73df52014-04-16 15:06:20 +00005642 }
5643
5644public:
Tim Northover573cbee2014-05-24 12:52:07 +00005645 AArch64beTargetInfo(const llvm::Triple &Triple)
5646 : AArch64TargetInfo(Triple) { }
James Molloy5e73df52014-04-16 15:06:20 +00005647 void getTargetDefines(const LangOptions &Opts,
5648 MacroBuilder &Builder) const override {
5649 Builder.defineMacro("__AARCH64EB__");
5650 Builder.defineMacro("__AARCH_BIG_ENDIAN");
5651 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00005652 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00005653 }
5654};
Tim Northovera2ee4332014-03-29 15:09:45 +00005655
Tim Northover573cbee2014-05-24 12:52:07 +00005656class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00005657protected:
5658 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5659 MacroBuilder &Builder) const override {
5660 Builder.defineMacro("__AARCH64_SIMD__");
5661 Builder.defineMacro("__ARM64_ARCH_8__");
5662 Builder.defineMacro("__ARM_NEON__");
5663 Builder.defineMacro("__LITTLE_ENDIAN__");
5664 Builder.defineMacro("__REGISTER_PREFIX__", "");
5665 Builder.defineMacro("__arm64", "1");
5666 Builder.defineMacro("__arm64__", "1");
5667
5668 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
5669 }
5670
Tim Northovera2ee4332014-03-29 15:09:45 +00005671public:
Tim Northover573cbee2014-05-24 12:52:07 +00005672 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
5673 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
Tim Northovera2ee4332014-03-29 15:09:45 +00005674 Int64Type = SignedLongLong;
5675 WCharType = SignedInt;
5676 UseSignedCharForObjCBool = false;
5677
Tim Northovera6a19f12015-02-06 01:25:07 +00005678 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005679 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
5680
5681 TheCXXABI.set(TargetCXXABI::iOS64);
5682 }
5683
David Blaikie1cbb9712014-11-14 19:09:44 +00005684 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005685 return TargetInfo::CharPtrBuiltinVaList;
5686 }
5687};
Tim Northovera2ee4332014-03-29 15:09:45 +00005688
Tony Linthicum76329bf2011-12-12 21:14:55 +00005689// Hexagon abstract base class
5690class HexagonTargetInfo : public TargetInfo {
5691 static const Builtin::Info BuiltinInfo[];
5692 static const char * const GCCRegNames[];
5693 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5694 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005695 bool HasHVX, HasHVXDouble;
5696
Tony Linthicum76329bf2011-12-12 21:14:55 +00005697public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00005698 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00005699 BigEndian = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005700 DataLayoutString = "e-m:e-p:32:32:32-"
5701 "i64:64:64-i32:32:32-i16:16:16-i1:8:8-"
5702 "f64:64:64-f32:32:32-v64:64:64-v32:32:32-a:0-n16:32";
5703 SizeType = UnsignedInt;
5704 PtrDiffType = SignedInt;
5705 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005706
5707 // {} in inline assembly are packet specifiers, not assembly variant
5708 // specifiers.
5709 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005710
5711 LargeArrayMinWidth = 64;
5712 LargeArrayAlign = 64;
5713 UseBitFieldTypeAlignment = true;
5714 ZeroLengthBitfieldBoundary = 32;
5715 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005716 }
5717
Craig Topper6c03a542015-10-19 04:51:35 +00005718 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5719 return llvm::makeArrayRef(BuiltinInfo,
5720 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005721 }
5722
Craig Topper3164f332014-03-11 03:39:26 +00005723 bool validateAsmConstraint(const char *&Name,
5724 TargetInfo::ConstraintInfo &Info) const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005725 return true;
5726 }
5727
Craig Topper3164f332014-03-11 03:39:26 +00005728 void getTargetDefines(const LangOptions &Opts,
5729 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005730
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005731 bool isCLZForZeroUndef() const override { return false; }
5732
Craig Topper3164f332014-03-11 03:39:26 +00005733 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005734 return llvm::StringSwitch<bool>(Feature)
5735 .Case("hexagon", true)
5736 .Case("hvx", HasHVX)
5737 .Case("hvx-double", HasHVXDouble)
5738 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005739 }
Craig Topper3164f332014-03-11 03:39:26 +00005740
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005741 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5742 StringRef CPU, const std::vector<std::string> &FeaturesVec)
5743 const override;
5744
5745 bool handleTargetFeatures(std::vector<std::string> &Features,
5746 DiagnosticsEngine &Diags) override;
5747
Craig Topper3164f332014-03-11 03:39:26 +00005748 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005749 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005750 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005751 ArrayRef<const char *> getGCCRegNames() const override;
5752 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005753 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005754 return "";
5755 }
Sebastian Pop86500282012-01-13 20:37:10 +00005756
5757 static const char *getHexagonCPUSuffix(StringRef Name) {
5758 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00005759 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005760 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005761 .Case("hexagonv55", "55")
5762 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00005763 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00005764 }
5765
Craig Topper3164f332014-03-11 03:39:26 +00005766 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00005767 if (!getHexagonCPUSuffix(Name))
5768 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00005769 CPU = Name;
5770 return true;
5771 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005772
5773 int getEHDataRegisterNumber(unsigned RegNo) const override {
5774 return RegNo < 2 ? RegNo : -1;
5775 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005776};
5777
5778void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005779 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005780 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00005781 Builder.defineMacro("__hexagon__", "1");
5782
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005783 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005784 Builder.defineMacro("__HEXAGON_V4__");
5785 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005786 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005787 Builder.defineMacro("__QDSP6_V4__");
5788 Builder.defineMacro("__QDSP6_ARCH__", "4");
5789 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005790 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005791 Builder.defineMacro("__HEXAGON_V5__");
5792 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5793 if(Opts.HexagonQdsp6Compat) {
5794 Builder.defineMacro("__QDSP6_V5__");
5795 Builder.defineMacro("__QDSP6_ARCH__", "5");
5796 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005797 } else if (CPU == "hexagonv60") {
5798 Builder.defineMacro("__HEXAGON_V60__");
5799 Builder.defineMacro("__HEXAGON_ARCH__", "60");
5800 Builder.defineMacro("__QDSP6_V60__");
5801 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00005802 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00005803}
5804
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005805bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
5806 DiagnosticsEngine &Diags) {
5807 for (auto &F : Features) {
5808 if (F == "+hvx")
5809 HasHVX = true;
5810 else if (F == "-hvx")
5811 HasHVX = HasHVXDouble = false;
5812 else if (F == "+hvx-double")
5813 HasHVX = HasHVXDouble = true;
5814 else if (F == "-hvx-double")
5815 HasHVXDouble = false;
5816 }
5817 return true;
5818}
5819
5820bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
5821 DiagnosticsEngine &Diags, StringRef CPU,
5822 const std::vector<std::string> &FeaturesVec) const {
5823 // Default for v60: -hvx, -hvx-double.
5824 Features["hvx"] = false;
5825 Features["hvx-double"] = false;
5826
5827 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
5828}
5829
5830
5831const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00005832 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5833 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5834 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5835 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5836 "p0", "p1", "p2", "p3",
5837 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5838};
5839
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005840ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00005841 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005842}
5843
Tony Linthicum76329bf2011-12-12 21:14:55 +00005844const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5845 { { "sp" }, "r29" },
5846 { { "fp" }, "r30" },
5847 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00005848};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005849
Craig Topperf054e3a2015-10-19 03:52:27 +00005850ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
5851 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00005852}
5853
5854
5855const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005856#define BUILTIN(ID, TYPE, ATTRS) \
5857 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
5858#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5859 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00005860#include "clang/Basic/BuiltinsHexagon.def"
5861};
Tony Linthicum76329bf2011-12-12 21:14:55 +00005862
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005863// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5864class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00005865 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5866 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005867 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00005868public:
Eric Christopher5eaf3812015-05-12 00:04:20 +00005869 SparcTargetInfo(const llvm::Triple &Triple)
James Y Knighta3518ad2016-01-27 01:04:51 +00005870 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00005871
Craig Topper3164f332014-03-11 03:39:26 +00005872 bool handleTargetFeatures(std::vector<std::string> &Features,
5873 DiagnosticsEngine &Diags) override {
Eric Christopher5eaf3812015-05-12 00:04:20 +00005874 // The backend doesn't actually handle soft float yet, but in case someone
5875 // is using the support for the front end continue to support it.
Eric Christopherfb481a42015-04-29 23:32:17 +00005876 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
5877 if (Feature != Features.end()) {
5878 SoftFloat = true;
5879 Features.erase(Feature);
5880 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00005881 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005882 }
Craig Topper3164f332014-03-11 03:39:26 +00005883 void getTargetDefines(const LangOptions &Opts,
5884 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005885 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005886 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00005887
5888 if (SoftFloat)
5889 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00005890 }
Craig Topper3164f332014-03-11 03:39:26 +00005891
5892 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005893 return llvm::StringSwitch<bool>(Feature)
5894 .Case("softfloat", SoftFloat)
5895 .Case("sparc", true)
5896 .Default(false);
5897 }
Craig Topper3164f332014-03-11 03:39:26 +00005898
Craig Topper6c03a542015-10-19 04:51:35 +00005899 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005900 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00005901 return None;
Gabor Greif49991682008-02-21 16:29:08 +00005902 }
Craig Topper3164f332014-03-11 03:39:26 +00005903 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00005904 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00005905 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005906 ArrayRef<const char *> getGCCRegNames() const override;
5907 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005908 bool validateAsmConstraint(const char *&Name,
5909 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005910 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005911 switch (*Name) {
5912 case 'I': // Signed 13-bit constant
5913 case 'J': // Zero
5914 case 'K': // 32-bit constant with the low 12 bits clear
5915 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5916 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5917 case 'N': // Same as 'K' but zext (required for SIMode)
5918 case 'O': // The constant 4096
5919 return true;
5920 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005921 return false;
Gabor Greif49991682008-02-21 16:29:08 +00005922 }
Craig Topper3164f332014-03-11 03:39:26 +00005923 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00005924 // FIXME: Implement!
5925 return "";
Gabor Greif49991682008-02-21 16:29:08 +00005926 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00005927
5928 // No Sparc V7 for now, the backend doesn't support it anyway.
5929 enum CPUKind {
5930 CK_GENERIC,
5931 CK_V8,
5932 CK_SUPERSPARC,
5933 CK_SPARCLITE,
5934 CK_F934,
5935 CK_HYPERSPARC,
5936 CK_SPARCLITE86X,
5937 CK_SPARCLET,
5938 CK_TSC701,
5939 CK_V9,
5940 CK_ULTRASPARC,
5941 CK_ULTRASPARC3,
5942 CK_NIAGARA,
5943 CK_NIAGARA2,
5944 CK_NIAGARA3,
5945 CK_NIAGARA4
5946 } CPU = CK_GENERIC;
5947
5948 enum CPUGeneration {
5949 CG_V8,
5950 CG_V9,
5951 };
5952
5953 CPUGeneration getCPUGeneration(CPUKind Kind) const {
5954 switch (Kind) {
5955 case CK_GENERIC:
5956 case CK_V8:
5957 case CK_SUPERSPARC:
5958 case CK_SPARCLITE:
5959 case CK_F934:
5960 case CK_HYPERSPARC:
5961 case CK_SPARCLITE86X:
5962 case CK_SPARCLET:
5963 case CK_TSC701:
5964 return CG_V8;
5965 case CK_V9:
5966 case CK_ULTRASPARC:
5967 case CK_ULTRASPARC3:
5968 case CK_NIAGARA:
5969 case CK_NIAGARA2:
5970 case CK_NIAGARA3:
5971 case CK_NIAGARA4:
5972 return CG_V9;
5973 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00005974 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00005975 }
5976
5977 CPUKind getCPUKind(StringRef Name) const {
5978 return llvm::StringSwitch<CPUKind>(Name)
5979 .Case("v8", CK_V8)
5980 .Case("supersparc", CK_SUPERSPARC)
5981 .Case("sparclite", CK_SPARCLITE)
5982 .Case("f934", CK_F934)
5983 .Case("hypersparc", CK_HYPERSPARC)
5984 .Case("sparclite86x", CK_SPARCLITE86X)
5985 .Case("sparclet", CK_SPARCLET)
5986 .Case("tsc701", CK_TSC701)
5987 .Case("v9", CK_V9)
5988 .Case("ultrasparc", CK_ULTRASPARC)
5989 .Case("ultrasparc3", CK_ULTRASPARC3)
5990 .Case("niagara", CK_NIAGARA)
5991 .Case("niagara2", CK_NIAGARA2)
5992 .Case("niagara3", CK_NIAGARA3)
5993 .Case("niagara4", CK_NIAGARA4)
5994 .Default(CK_GENERIC);
5995 }
5996
5997 bool setCPU(const std::string &Name) override {
5998 CPU = getCPUKind(Name);
5999 return CPU != CK_GENERIC;
6000 }
Gabor Greif49991682008-02-21 16:29:08 +00006001};
6002
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006003const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006004 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6005 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6006 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6007 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6008};
6009
Craig Topperf054e3a2015-10-19 03:52:27 +00006010ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6011 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006012}
6013
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006014const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006015 { { "g0" }, "r0" },
6016 { { "g1" }, "r1" },
6017 { { "g2" }, "r2" },
6018 { { "g3" }, "r3" },
6019 { { "g4" }, "r4" },
6020 { { "g5" }, "r5" },
6021 { { "g6" }, "r6" },
6022 { { "g7" }, "r7" },
6023 { { "o0" }, "r8" },
6024 { { "o1" }, "r9" },
6025 { { "o2" }, "r10" },
6026 { { "o3" }, "r11" },
6027 { { "o4" }, "r12" },
6028 { { "o5" }, "r13" },
6029 { { "o6", "sp" }, "r14" },
6030 { { "o7" }, "r15" },
6031 { { "l0" }, "r16" },
6032 { { "l1" }, "r17" },
6033 { { "l2" }, "r18" },
6034 { { "l3" }, "r19" },
6035 { { "l4" }, "r20" },
6036 { { "l5" }, "r21" },
6037 { { "l6" }, "r22" },
6038 { { "l7" }, "r23" },
6039 { { "i0" }, "r24" },
6040 { { "i1" }, "r25" },
6041 { { "i2" }, "r26" },
6042 { { "i3" }, "r27" },
6043 { { "i4" }, "r28" },
6044 { { "i5" }, "r29" },
6045 { { "i6", "fp" }, "r30" },
6046 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006047};
6048
Craig Topperf054e3a2015-10-19 03:52:27 +00006049ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6050 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006051}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006052
6053// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6054class SparcV8TargetInfo : public SparcTargetInfo {
6055public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006056 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00006057 DataLayoutString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
Brad Smith73859112015-08-13 21:45:57 +00006058 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6059 switch (getTriple().getOS()) {
6060 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006061 SizeType = UnsignedInt;
6062 IntPtrType = SignedInt;
6063 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006064 break;
6065 case llvm::Triple::NetBSD:
6066 case llvm::Triple::OpenBSD:
6067 SizeType = UnsignedLong;
6068 IntPtrType = SignedLong;
6069 PtrDiffType = SignedLong;
6070 break;
Brad Smith56495d52015-08-13 22:00:53 +00006071 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006072 }
6073
Craig Topper3164f332014-03-11 03:39:26 +00006074 void getTargetDefines(const LangOptions &Opts,
6075 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006076 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006077 switch (getCPUGeneration(CPU)) {
6078 case CG_V8:
6079 Builder.defineMacro("__sparcv8");
6080 if (getTriple().getOS() != llvm::Triple::Solaris)
6081 Builder.defineMacro("__sparcv8__");
6082 break;
6083 case CG_V9:
6084 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006085 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006086 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006087 Builder.defineMacro("__sparc_v9__");
6088 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006089 break;
6090 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006091 }
6092};
6093
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006094// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6095class SparcV8elTargetInfo : public SparcV8TargetInfo {
6096 public:
6097 SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) {
Eric Christopher964a5f32015-08-05 23:48:05 +00006098 DataLayoutString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64";
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006099 BigEndian = false;
6100 }
6101};
6102
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006103// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6104class SparcV9TargetInfo : public SparcTargetInfo {
6105public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006106 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006107 // FIXME: Support Sparc quad-precision long double?
Eric Christopher964a5f32015-08-05 23:48:05 +00006108 DataLayoutString = "E-m:e-i64:64-n32:64-S128";
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006109 // This is an LP64 platform.
6110 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006111
6112 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006113 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006114 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006115 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006116 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006117 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006118
6119 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6120 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6121 LongDoubleWidth = 128;
6122 LongDoubleAlign = 128;
6123 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006124 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006125 }
6126
Craig Topper3164f332014-03-11 03:39:26 +00006127 void getTargetDefines(const LangOptions &Opts,
6128 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006129 SparcTargetInfo::getTargetDefines(Opts, Builder);
6130 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006131 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006132 // Solaris doesn't need these variants, but the BSDs do.
6133 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006134 Builder.defineMacro("__sparc64__");
6135 Builder.defineMacro("__sparc_v9__");
6136 Builder.defineMacro("__sparcv9__");
6137 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006138 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006139
Craig Topper3164f332014-03-11 03:39:26 +00006140 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006141 if (!SparcTargetInfo::setCPU(Name))
6142 return false;
6143 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006144 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006145};
6146
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006147class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006148 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006149 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006150 std::string CPU;
6151 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006152 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006153
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006154public:
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006155 SystemZTargetInfo(const llvm::Triple &Triple)
Eric Christopherb093d692015-10-09 18:39:59 +00006156 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6157 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006158 IntMaxType = SignedLong;
6159 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006160 TLSSupported = true;
6161 IntWidth = IntAlign = 32;
6162 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6163 PointerWidth = PointerAlign = 64;
6164 LongDoubleWidth = 128;
6165 LongDoubleAlign = 64;
6166 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006167 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006168 MinGlobalAlign = 16;
Eric Christopher964a5f32015-08-05 23:48:05 +00006169 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 +00006170 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6171 }
6172 void getTargetDefines(const LangOptions &Opts,
6173 MacroBuilder &Builder) const override {
6174 Builder.defineMacro("__s390__");
6175 Builder.defineMacro("__s390x__");
6176 Builder.defineMacro("__zarch__");
6177 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006178
6179 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6180 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6181 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6182 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6183
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006184 if (HasTransactionalExecution)
6185 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006186 if (Opts.ZVector)
6187 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006188 }
Craig Topper6c03a542015-10-19 04:51:35 +00006189 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6190 return llvm::makeArrayRef(BuiltinInfo,
6191 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006192 }
6193
Craig Topperf054e3a2015-10-19 03:52:27 +00006194 ArrayRef<const char *> getGCCRegNames() const override;
6195 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006196 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006197 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006198 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006199 bool validateAsmConstraint(const char *&Name,
6200 TargetInfo::ConstraintInfo &info) const override;
6201 const char *getClobbers() const override {
6202 // FIXME: Is this really right?
6203 return "";
6204 }
6205 BuiltinVaListKind getBuiltinVaListKind() const override {
6206 return TargetInfo::SystemZBuiltinVaList;
6207 }
6208 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006209 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006210 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6211 .Case("z10", true)
6212 .Case("z196", true)
6213 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006214 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006215 .Default(false);
6216
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006217 return CPUKnown;
6218 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006219 bool
6220 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6221 StringRef CPU,
6222 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006223 if (CPU == "zEC12")
6224 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006225 if (CPU == "z13") {
6226 Features["transactional-execution"] = true;
6227 Features["vector"] = true;
6228 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006229 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006230 }
6231
6232 bool handleTargetFeatures(std::vector<std::string> &Features,
6233 DiagnosticsEngine &Diags) override {
6234 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006235 for (const auto &Feature : Features) {
6236 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006237 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006238 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006239 HasVector = true;
6240 }
6241 // If we use the vector ABI, vector types are 64-bit aligned.
6242 if (HasVector) {
6243 MaxVectorAlign = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00006244 DataLayoutString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6245 "-v128:64-a:8:16-n32:64";
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006246 }
6247 return true;
6248 }
6249
6250 bool hasFeature(StringRef Feature) const override {
6251 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006252 .Case("systemz", true)
6253 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006254 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006255 .Default(false);
6256 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006257
6258 StringRef getABI() const override {
6259 if (HasVector)
6260 return "vector";
6261 return "";
6262 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006263
6264 bool useFloat128ManglingForLongDouble() const override {
6265 return true;
6266 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006267};
6268
6269const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6270#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006271 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006272#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006273};
6274
6275const char *const SystemZTargetInfo::GCCRegNames[] = {
6276 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6277 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6278 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6279 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6280};
6281
Craig Topperf054e3a2015-10-19 03:52:27 +00006282ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6283 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006284}
6285
6286bool SystemZTargetInfo::
6287validateAsmConstraint(const char *&Name,
6288 TargetInfo::ConstraintInfo &Info) const {
6289 switch (*Name) {
6290 default:
6291 return false;
6292
6293 case 'a': // Address register
6294 case 'd': // Data register (equivalent to 'r')
6295 case 'f': // Floating-point register
6296 Info.setAllowsRegister();
6297 return true;
6298
6299 case 'I': // Unsigned 8-bit constant
6300 case 'J': // Unsigned 12-bit constant
6301 case 'K': // Signed 16-bit constant
6302 case 'L': // Signed 20-bit displacement (on all targets we support)
6303 case 'M': // 0x7fffffff
6304 return true;
6305
6306 case 'Q': // Memory with base and unsigned 12-bit displacement
6307 case 'R': // Likewise, plus an index
6308 case 'S': // Memory with base and signed 20-bit displacement
6309 case 'T': // Likewise, plus an index
6310 Info.setAllowsMemory();
6311 return true;
6312 }
6313}
Ulrich Weigand47445072013-05-06 16:26:41 +00006314
Eric Christopherc48497a2015-09-18 21:26:24 +00006315class MSP430TargetInfo : public TargetInfo {
6316 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006317
Eric Christopherc48497a2015-09-18 21:26:24 +00006318public:
6319 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6320 BigEndian = false;
6321 TLSSupported = false;
6322 IntWidth = 16;
6323 IntAlign = 16;
6324 LongWidth = 32;
6325 LongLongWidth = 64;
6326 LongAlign = LongLongAlign = 16;
6327 PointerWidth = 16;
6328 PointerAlign = 16;
6329 SuitableAlign = 16;
6330 SizeType = UnsignedInt;
6331 IntMaxType = SignedLongLong;
6332 IntPtrType = SignedInt;
6333 PtrDiffType = SignedInt;
6334 SigAtomicType = SignedLong;
6335 DataLayoutString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006336 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006337 void getTargetDefines(const LangOptions &Opts,
6338 MacroBuilder &Builder) const override {
6339 Builder.defineMacro("MSP430");
6340 Builder.defineMacro("__MSP430__");
6341 // FIXME: defines for different 'flavours' of MCU
6342 }
Craig Topper6c03a542015-10-19 04:51:35 +00006343 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006344 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006345 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006346 }
6347 bool hasFeature(StringRef Feature) const override {
6348 return Feature == "msp430";
6349 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006350 ArrayRef<const char *> getGCCRegNames() const override;
6351 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006352 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006353 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006354 }
6355 bool validateAsmConstraint(const char *&Name,
6356 TargetInfo::ConstraintInfo &info) const override {
6357 // FIXME: implement
6358 switch (*Name) {
6359 case 'K': // the constant 1
6360 case 'L': // constant -1^20 .. 1^19
6361 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006362 return true;
6363 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006364 // No target constraints for now.
6365 return false;
6366 }
6367 const char *getClobbers() const override {
6368 // FIXME: Is this really right?
6369 return "";
6370 }
6371 BuiltinVaListKind getBuiltinVaListKind() const override {
6372 // FIXME: implement
6373 return TargetInfo::CharPtrBuiltinVaList;
6374 }
6375};
6376
6377const char *const MSP430TargetInfo::GCCRegNames[] = {
6378 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6379 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
6380
Craig Topperf054e3a2015-10-19 03:52:27 +00006381ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
6382 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00006383}
6384
6385// LLVM and Clang cannot be used directly to output native binaries for
6386// target, but is used to compile C code to llvm bitcode with correct
6387// type and alignment information.
6388//
6389// TCE uses the llvm bitcode as input and uses it for generating customized
6390// target processor and program binary. TCE co-design environment is
6391// publicly available in http://tce.cs.tut.fi
6392
6393static const unsigned TCEOpenCLAddrSpaceMap[] = {
6394 3, // opencl_global
6395 4, // opencl_local
6396 5, // opencl_constant
6397 // FIXME: generic has to be added to the target
6398 0, // opencl_generic
6399 0, // cuda_device
6400 0, // cuda_constant
6401 0 // cuda_shared
6402};
6403
6404class TCETargetInfo : public TargetInfo {
6405public:
6406 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6407 TLSSupported = false;
6408 IntWidth = 32;
6409 LongWidth = LongLongWidth = 32;
6410 PointerWidth = 32;
6411 IntAlign = 32;
6412 LongAlign = LongLongAlign = 32;
6413 PointerAlign = 32;
6414 SuitableAlign = 32;
6415 SizeType = UnsignedInt;
6416 IntMaxType = SignedLong;
6417 IntPtrType = SignedInt;
6418 PtrDiffType = SignedInt;
6419 FloatWidth = 32;
6420 FloatAlign = 32;
6421 DoubleWidth = 32;
6422 DoubleAlign = 32;
6423 LongDoubleWidth = 32;
6424 LongDoubleAlign = 32;
6425 FloatFormat = &llvm::APFloat::IEEEsingle;
6426 DoubleFormat = &llvm::APFloat::IEEEsingle;
6427 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
6428 DataLayoutString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
6429 "-f64:32-v64:32-v128:32-a:0:32-n32";
6430 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
6431 UseAddrSpaceMapMangling = true;
6432 }
6433
6434 void getTargetDefines(const LangOptions &Opts,
6435 MacroBuilder &Builder) const override {
6436 DefineStd(Builder, "tce", Opts);
6437 Builder.defineMacro("__TCE__");
6438 Builder.defineMacro("__TCE_V1__");
6439 }
6440 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
6441
Craig Topper6c03a542015-10-19 04:51:35 +00006442 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006443 const char *getClobbers() const override { return ""; }
6444 BuiltinVaListKind getBuiltinVaListKind() const override {
6445 return TargetInfo::VoidPtrBuiltinVaList;
6446 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006447 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00006448 bool validateAsmConstraint(const char *&Name,
6449 TargetInfo::ConstraintInfo &info) const override {
6450 return true;
6451 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006452 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6453 return None;
6454 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006455};
Eli Friedmana9c3d712009-08-19 20:47:07 +00006456
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006457class BPFTargetInfo : public TargetInfo {
6458public:
6459 BPFTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6460 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6461 SizeType = UnsignedLong;
6462 PtrDiffType = SignedLong;
6463 IntPtrType = SignedLong;
6464 IntMaxType = SignedLong;
6465 Int64Type = SignedLong;
6466 RegParmMax = 5;
6467 if (Triple.getArch() == llvm::Triple::bpfeb) {
6468 BigEndian = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00006469 DataLayoutString = "E-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006470 } else {
6471 BigEndian = false;
Eric Christopher964a5f32015-08-05 23:48:05 +00006472 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006473 }
6474 MaxAtomicPromoteWidth = 64;
6475 MaxAtomicInlineWidth = 64;
6476 TLSSupported = false;
6477 }
6478 void getTargetDefines(const LangOptions &Opts,
6479 MacroBuilder &Builder) const override {
6480 DefineStd(Builder, "bpf", Opts);
6481 Builder.defineMacro("__BPF__");
6482 }
6483 bool hasFeature(StringRef Feature) const override {
6484 return Feature == "bpf";
6485 }
6486
Craig Topper6c03a542015-10-19 04:51:35 +00006487 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006488 const char *getClobbers() const override {
6489 return "";
6490 }
6491 BuiltinVaListKind getBuiltinVaListKind() const override {
6492 return TargetInfo::VoidPtrBuiltinVaList;
6493 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006494 ArrayRef<const char *> getGCCRegNames() const override {
6495 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006496 }
6497 bool validateAsmConstraint(const char *&Name,
6498 TargetInfo::ConstraintInfo &info) const override {
6499 return true;
6500 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006501 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
6502 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00006503 }
6504};
6505
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006506class MipsTargetInfoBase : public TargetInfo {
Eric Christopher964a5f32015-08-05 23:48:05 +00006507 virtual void setDataLayoutString() = 0;
Akira Hatanaka9064e362013-10-29 18:30:33 +00006508
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006509 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006510 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00006511 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00006512 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006513 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00006514 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006515 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00006516 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006517 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006518 enum DspRevEnum {
6519 NoDSP, DSP1, DSP2
6520 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00006521 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006522
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006523protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00006524 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006525 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006526
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006527public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006528 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
6529 const std::string &CPUStr)
6530 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006531 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
Zoran Jovanovic26a12162015-02-18 15:21:35 +00006532 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
6533 TheCXXABI.set(TargetCXXABI::GenericMIPS);
6534 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006535
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006536 bool isNaN2008Default() const {
6537 return CPU == "mips32r6" || CPU == "mips64r6";
6538 }
6539
6540 bool isFP64Default() const {
6541 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
6542 }
6543
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00006544 bool isNan2008() const override {
6545 return IsNan2008;
6546 }
6547
Alp Toker4925ba72014-06-07 23:30:42 +00006548 StringRef getABI() const override { return ABI; }
Craig Topper3164f332014-03-11 03:39:26 +00006549 bool setCPU(const std::string &Name) override {
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006550 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
6551 getTriple().getArch() == llvm::Triple::mipsel;
Eric Christopher0b26a612010-03-02 02:41:08 +00006552 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006553 return llvm::StringSwitch<bool>(Name)
Simon Atanasyan26610c52014-07-04 12:36:56 +00006554 .Case("mips1", IsMips32)
6555 .Case("mips2", IsMips32)
6556 .Case("mips3", true)
6557 .Case("mips4", true)
6558 .Case("mips5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006559 .Case("mips32", IsMips32)
6560 .Case("mips32r2", IsMips32)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006561 .Case("mips32r3", IsMips32)
6562 .Case("mips32r5", IsMips32)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006563 .Case("mips32r6", IsMips32)
6564 .Case("mips64", true)
6565 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00006566 .Case("mips64r3", true)
6567 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006568 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006569 .Case("octeon", true)
Daniel Sandersff952582015-10-05 12:24:30 +00006570 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00006571 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00006572 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006573 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00006574 bool
6575 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6576 StringRef CPU,
6577 const std::vector<std::string> &FeaturesVec) const override {
Simon Atanasyan4e16a422014-07-04 12:37:04 +00006578 if (CPU == "octeon")
6579 Features["mips64r2"] = Features["cnmips"] = true;
6580 else
6581 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00006582 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00006583 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006584
Craig Topper3164f332014-03-11 03:39:26 +00006585 void getTargetDefines(const LangOptions &Opts,
6586 MacroBuilder &Builder) const override {
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006587 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00006588 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006589 if (Opts.GNUMode)
6590 Builder.defineMacro("mips");
6591
Simon Atanasyan683535b2012-08-29 19:14:58 +00006592 Builder.defineMacro("__REGISTER_PREFIX__", "");
6593
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006594 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006595 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006596 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006597 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006598 case SoftFloat:
6599 Builder.defineMacro("__mips_soft_float", Twine(1));
6600 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00006601 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00006602
Simon Atanasyan16071912013-04-14 14:07:30 +00006603 if (IsSingleFloat)
6604 Builder.defineMacro("__mips_single_float", Twine(1));
6605
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006606 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
6607 Builder.defineMacro("_MIPS_FPSET",
6608 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
6609
Simon Atanasyan72244b62012-07-05 16:06:06 +00006610 if (IsMips16)
6611 Builder.defineMacro("__mips16", Twine(1));
6612
Simon Atanasyan60777612013-04-14 14:07:51 +00006613 if (IsMicromips)
6614 Builder.defineMacro("__mips_micromips", Twine(1));
6615
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006616 if (IsNan2008)
6617 Builder.defineMacro("__mips_nan2008", Twine(1));
6618
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006619 switch (DspRev) {
6620 default:
6621 break;
6622 case DSP1:
6623 Builder.defineMacro("__mips_dsp_rev", Twine(1));
6624 Builder.defineMacro("__mips_dsp", Twine(1));
6625 break;
6626 case DSP2:
6627 Builder.defineMacro("__mips_dsp_rev", Twine(2));
6628 Builder.defineMacro("__mips_dspr2", Twine(1));
6629 Builder.defineMacro("__mips_dsp", Twine(1));
6630 break;
6631 }
6632
Jack Carter44ff1e52013-08-12 17:20:29 +00006633 if (HasMSA)
6634 Builder.defineMacro("__mips_msa", Twine(1));
6635
Simon Atanasyan26f19672012-04-05 19:28:31 +00006636 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
6637 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
6638 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00006639
6640 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
6641 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00006642
6643 // These shouldn't be defined for MIPS-I but there's no need to check
6644 // for that since MIPS-I isn't supported.
6645 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6646 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6647 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006648 }
6649
Craig Topper6c03a542015-10-19 04:51:35 +00006650 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6651 return llvm::makeArrayRef(BuiltinInfo,
6652 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006653 }
Craig Topper3164f332014-03-11 03:39:26 +00006654 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00006655 return llvm::StringSwitch<bool>(Feature)
6656 .Case("mips", true)
6657 .Case("fp64", HasFP64)
6658 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006659 }
Craig Topper3164f332014-03-11 03:39:26 +00006660 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006661 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006662 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006663 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00006664 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00006665 // CPU register names
6666 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006667 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
6668 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
6669 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006670 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
6671 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006672 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
6673 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
6674 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
6675 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00006676 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006677 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Daniel Sanders8b59af12013-11-12 12:56:01 +00006678 "$fcc5","$fcc6","$fcc7",
6679 // MSA register names
6680 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
6681 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
6682 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
6683 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
6684 // MSA control register names
6685 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
6686 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006687 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006688 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006689 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006690 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override = 0;
Craig Topper3164f332014-03-11 03:39:26 +00006691 bool validateAsmConstraint(const char *&Name,
6692 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006693 switch (*Name) {
6694 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00006695 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006696 case 'r': // CPU registers.
6697 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00006698 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006699 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00006700 case 'c': // $25 for indirect jumps
6701 case 'l': // lo register
6702 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006703 Info.setAllowsRegister();
6704 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006705 case 'I': // Signed 16-bit constant
6706 case 'J': // Integer 0
6707 case 'K': // Unsigned 16-bit constant
6708 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
6709 case 'M': // Constants not loadable via lui, addiu, or ori
6710 case 'N': // Constant -1 to -65535
6711 case 'O': // A signed 15-bit constant
6712 case 'P': // A constant between 1 go 65535
6713 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00006714 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00006715 Info.setAllowsMemory();
6716 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006717 case 'Z':
6718 if (Name[1] == 'C') { // An address usable by ll, and sc.
6719 Info.setAllowsMemory();
6720 Name++; // Skip over 'Z'.
6721 return true;
6722 }
6723 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006724 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006725 }
6726
Daniel Sanders48fa39e2015-03-30 13:47:23 +00006727 std::string convertConstraint(const char *&Constraint) const override {
6728 std::string R;
6729 switch (*Constraint) {
6730 case 'Z': // Two-character constraint; add "^" hint for later parsing.
6731 if (Constraint[1] == 'C') {
6732 R = std::string("^") + std::string(Constraint, 2);
6733 Constraint++;
6734 return R;
6735 }
6736 break;
6737 }
6738 return TargetInfo::convertConstraint(Constraint);
6739 }
6740
Craig Topper3164f332014-03-11 03:39:26 +00006741 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00006742 // In GCC, $1 is not widely used in generated code (it's used only in a few
6743 // specific situations), so there is no real need for users to add it to
6744 // the clobbers list if they want to use it in their inline assembly code.
6745 //
6746 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
6747 // code generation, so using it in inline assembly without adding it to the
6748 // clobbers list can cause conflicts between the inline assembly code and
6749 // the surrounding generated code.
6750 //
6751 // Another problem is that LLVM is allowed to choose $1 for inline assembly
6752 // operands, which will conflict with the ".set at" assembler option (which
6753 // we use only for inline assembly, in order to maintain compatibility with
6754 // GCC) and will also conflict with the user's usage of $1.
6755 //
6756 // The easiest way to avoid these conflicts and keep $1 as an allocatable
6757 // register for generated code is to automatically clobber $1 for all inline
6758 // assembly code.
6759 //
6760 // FIXME: We should automatically clobber $1 only for inline assembly code
6761 // which actually uses it. This would allow LLVM to use $1 for inline
6762 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00006763 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006764 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006765
Craig Topper3164f332014-03-11 03:39:26 +00006766 bool handleTargetFeatures(std::vector<std::string> &Features,
6767 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00006768 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00006769 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006770 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00006771 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006772 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006773 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006774 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006775
Eric Christopher610fe112015-08-26 08:21:55 +00006776 for (const auto &Feature : Features) {
6777 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00006778 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006779 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006780 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00006781 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00006782 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006783 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00006784 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006785 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006786 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00006787 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00006788 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00006789 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00006790 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006791 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006792 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006793 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00006794 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006795 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006796 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006797 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00006798 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006799 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00006800
Eric Christopher964a5f32015-08-05 23:48:05 +00006801 setDataLayoutString();
Akira Hatanaka9064e362013-10-29 18:30:33 +00006802
Rafael Espindolaeb265472013-08-21 21:59:03 +00006803 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006804 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00006805
Craig Topper3164f332014-03-11 03:39:26 +00006806 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00006807 if (RegNo == 0) return 4;
6808 if (RegNo == 1) return 5;
6809 return -1;
6810 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00006811
6812 bool isCLZForZeroUndef() const override { return false; }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006813};
6814
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006815const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006816#define BUILTIN(ID, TYPE, ATTRS) \
6817 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6818#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6819 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00006820#include "clang/Basic/BuiltinsMips.def"
6821};
6822
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006823class Mips32TargetInfoBase : public MipsTargetInfoBase {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006824public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006825 Mips32TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006826 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006827 SizeType = UnsignedInt;
6828 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006829 Int64Type = SignedLongLong;
6830 IntMaxType = Int64Type;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006831 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Akira Hatanaka8cc2e862011-11-05 01:48:34 +00006832 }
Craig Topper3164f332014-03-11 03:39:26 +00006833 bool setABI(const std::string &Name) override {
Simon Atanasyan755d7f92014-06-28 15:56:03 +00006834 if (Name == "o32" || Name == "eabi") {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006835 ABI = Name;
6836 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006837 }
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006838 return false;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006839 }
Craig Topper3164f332014-03-11 03:39:26 +00006840 void getTargetDefines(const LangOptions &Opts,
6841 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006842 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006843
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006844 Builder.defineMacro("__mips", "32");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006845 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
6846
6847 const std::string& CPUStr = getCPU();
6848 if (CPUStr == "mips32")
6849 Builder.defineMacro("__mips_isa_rev", "1");
6850 else if (CPUStr == "mips32r2")
6851 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00006852 else if (CPUStr == "mips32r3")
6853 Builder.defineMacro("__mips_isa_rev", "3");
6854 else if (CPUStr == "mips32r5")
6855 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00006856 else if (CPUStr == "mips32r6")
6857 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006858
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006859 if (ABI == "o32") {
6860 Builder.defineMacro("__mips_o32");
6861 Builder.defineMacro("_ABIO32", "1");
6862 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
6863 }
6864 else if (ABI == "eabi")
6865 Builder.defineMacro("__mips_eabi");
6866 else
David Blaikie83d382b2011-09-23 05:06:16 +00006867 llvm_unreachable("Invalid ABI for Mips32.");
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006868 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006869 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006870 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6871 { { "at" }, "$1" },
6872 { { "v0" }, "$2" },
6873 { { "v1" }, "$3" },
6874 { { "a0" }, "$4" },
6875 { { "a1" }, "$5" },
6876 { { "a2" }, "$6" },
6877 { { "a3" }, "$7" },
6878 { { "t0" }, "$8" },
6879 { { "t1" }, "$9" },
6880 { { "t2" }, "$10" },
6881 { { "t3" }, "$11" },
6882 { { "t4" }, "$12" },
6883 { { "t5" }, "$13" },
6884 { { "t6" }, "$14" },
6885 { { "t7" }, "$15" },
6886 { { "s0" }, "$16" },
6887 { { "s1" }, "$17" },
6888 { { "s2" }, "$18" },
6889 { { "s3" }, "$19" },
6890 { { "s4" }, "$20" },
6891 { { "s5" }, "$21" },
6892 { { "s6" }, "$22" },
6893 { { "s7" }, "$23" },
6894 { { "t8" }, "$24" },
6895 { { "t9" }, "$25" },
6896 { { "k0" }, "$26" },
6897 { { "k1" }, "$27" },
6898 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00006899 { { "sp","$sp" }, "$29" },
6900 { { "fp","$fp" }, "$30" },
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006901 { { "ra" }, "$31" }
6902 };
Craig Topperf054e3a2015-10-19 03:52:27 +00006903 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006904 }
6905};
6906
6907class Mips32EBTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006908 void setDataLayoutString() override {
6909 DataLayoutString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006910 }
6911
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006912public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006913 Mips32EBTargetInfo(const llvm::Triple &Triple)
6914 : Mips32TargetInfoBase(Triple) {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006915 }
Craig Topper3164f332014-03-11 03:39:26 +00006916 void getTargetDefines(const LangOptions &Opts,
6917 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006918 DefineStd(Builder, "MIPSEB", Opts);
6919 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006920 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006921 }
6922};
6923
6924class Mips32ELTargetInfo : public Mips32TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00006925 void setDataLayoutString() override {
6926 DataLayoutString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
Akira Hatanaka9064e362013-10-29 18:30:33 +00006927 }
6928
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006929public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006930 Mips32ELTargetInfo(const llvm::Triple &Triple)
6931 : Mips32TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006932 BigEndian = false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006933 }
Craig Topper3164f332014-03-11 03:39:26 +00006934 void getTargetDefines(const LangOptions &Opts,
6935 MacroBuilder &Builder) const override {
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006936 DefineStd(Builder, "MIPSEL", Opts);
6937 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006938 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00006939 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00006940};
Akira Hatanakabef17452011-09-20 19:21:49 +00006941
6942class Mips64TargetInfoBase : public MipsTargetInfoBase {
Akira Hatanakabef17452011-09-20 19:21:49 +00006943public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00006944 Mips64TargetInfoBase(const llvm::Triple &Triple)
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00006945 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006946 LongDoubleWidth = LongDoubleAlign = 128;
6947 LongDoubleFormat = &llvm::APFloat::IEEEquad;
David Chisnalla87d8592012-12-08 09:06:08 +00006948 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6949 LongDoubleWidth = LongDoubleAlign = 64;
6950 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6951 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006952 setN64ABITypes();
Nick Lewyckyf59e1292011-12-16 22:34:14 +00006953 SuitableAlign = 128;
Akira Hatanakab2206e72013-01-18 21:58:11 +00006954 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Akira Hatanakac12a2712011-10-22 00:07:27 +00006955 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006956
6957 void setN64ABITypes() {
6958 LongWidth = LongAlign = 64;
6959 PointerWidth = PointerAlign = 64;
6960 SizeType = UnsignedLong;
6961 PtrDiffType = SignedLong;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006962 Int64Type = SignedLong;
6963 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006964 }
6965
6966 void setN32ABITypes() {
6967 LongWidth = LongAlign = 32;
6968 PointerWidth = PointerAlign = 32;
6969 SizeType = UnsignedInt;
6970 PtrDiffType = SignedInt;
Simon Atanasyan495523e42015-01-22 23:16:48 +00006971 Int64Type = SignedLongLong;
6972 IntMaxType = Int64Type;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006973 }
6974
Craig Topper3164f332014-03-11 03:39:26 +00006975 bool setABI(const std::string &Name) override {
Akira Hatanakac12a2712011-10-22 00:07:27 +00006976 if (Name == "n32") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006977 setN32ABITypes();
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006978 ABI = Name;
6979 return true;
Simon Atanasyan98ba8a62014-06-28 15:56:08 +00006980 }
Simon Atanasyanad805952014-07-01 10:59:09 +00006981 if (Name == "n64") {
Daniel Sandersff1c0442014-04-24 09:58:52 +00006982 setN64ABITypes();
Simon Atanasyanad805952014-07-01 10:59:09 +00006983 ABI = Name;
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006984 return true;
Daniel Sandersff1c0442014-04-24 09:58:52 +00006985 }
6986 return false;
Akira Hatanakabef17452011-09-20 19:21:49 +00006987 }
Daniel Sandersff1c0442014-04-24 09:58:52 +00006988
Craig Topper3164f332014-03-11 03:39:26 +00006989 void getTargetDefines(const LangOptions &Opts,
6990 MacroBuilder &Builder) const override {
Simon Atanasyan16ee0052012-08-29 19:59:32 +00006991 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanaka6976ec82012-03-23 23:07:09 +00006992
Simon Atanasyan26292cc2014-01-27 13:59:11 +00006993 Builder.defineMacro("__mips", "64");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00006994 Builder.defineMacro("__mips64");
6995 Builder.defineMacro("__mips64__");
Matheus Almeidab84b37d2014-06-05 14:59:18 +00006996 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6997
6998 const std::string& CPUStr = getCPU();
6999 if (CPUStr == "mips64")
7000 Builder.defineMacro("__mips_isa_rev", "1");
7001 else if (CPUStr == "mips64r2")
7002 Builder.defineMacro("__mips_isa_rev", "2");
Simon Atanasyan162feb52015-02-20 23:37:40 +00007003 else if (CPUStr == "mips64r3")
7004 Builder.defineMacro("__mips_isa_rev", "3");
7005 else if (CPUStr == "mips64r5")
7006 Builder.defineMacro("__mips_isa_rev", "5");
Simon Atanasyane6694eb2015-01-15 07:04:48 +00007007 else if (CPUStr == "mips64r6")
7008 Builder.defineMacro("__mips_isa_rev", "6");
Simon Atanasyanc6a0be02012-08-29 20:50:11 +00007009
Akira Hatanakabef17452011-09-20 19:21:49 +00007010 if (ABI == "n32") {
7011 Builder.defineMacro("__mips_n32");
7012 Builder.defineMacro("_ABIN32", "2");
7013 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7014 }
7015 else if (ABI == "n64") {
7016 Builder.defineMacro("__mips_n64");
7017 Builder.defineMacro("_ABI64", "3");
7018 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7019 }
7020 else
David Blaikie83d382b2011-09-23 05:06:16 +00007021 llvm_unreachable("Invalid ABI for Mips64.");
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007022
7023 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanakabef17452011-09-20 19:21:49 +00007024 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007025 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007026 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
7027 { { "at" }, "$1" },
7028 { { "v0" }, "$2" },
7029 { { "v1" }, "$3" },
7030 { { "a0" }, "$4" },
7031 { { "a1" }, "$5" },
7032 { { "a2" }, "$6" },
7033 { { "a3" }, "$7" },
7034 { { "a4" }, "$8" },
7035 { { "a5" }, "$9" },
7036 { { "a6" }, "$10" },
7037 { { "a7" }, "$11" },
7038 { { "t0" }, "$12" },
7039 { { "t1" }, "$13" },
7040 { { "t2" }, "$14" },
7041 { { "t3" }, "$15" },
7042 { { "s0" }, "$16" },
7043 { { "s1" }, "$17" },
7044 { { "s2" }, "$18" },
7045 { { "s3" }, "$19" },
7046 { { "s4" }, "$20" },
7047 { { "s5" }, "$21" },
7048 { { "s6" }, "$22" },
7049 { { "s7" }, "$23" },
7050 { { "t8" }, "$24" },
7051 { { "t9" }, "$25" },
7052 { { "k0" }, "$26" },
7053 { { "k1" }, "$27" },
7054 { { "gp" }, "$28" },
Eric Christopher8b6d0512012-03-27 19:56:11 +00007055 { { "sp","$sp" }, "$29" },
7056 { { "fp","$fp" }, "$30" },
Akira Hatanakabef17452011-09-20 19:21:49 +00007057 { { "ra" }, "$31" }
7058 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007059 return llvm::makeArrayRef(GCCRegAliases);
Akira Hatanakabef17452011-09-20 19:21:49 +00007060 }
Daniel Sanders81ea6012014-04-24 16:05:26 +00007061
7062 bool hasInt128Type() const override { return true; }
Akira Hatanakabef17452011-09-20 19:21:49 +00007063};
7064
7065class Mips64EBTargetInfo : 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 Hatanaka9064e362013-10-29 18:30:33 +00007071
Akira Hatanakabef17452011-09-20 19:21:49 +00007072 }
Akira Hatanaka9064e362013-10-29 18:30:33 +00007073
Akira Hatanakabef17452011-09-20 19:21:49 +00007074public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007075 Mips64EBTargetInfo(const llvm::Triple &Triple)
Akira Hatanaka9064e362013-10-29 18:30:33 +00007076 : Mips64TargetInfoBase(Triple) {}
Craig Topper3164f332014-03-11 03:39:26 +00007077 void getTargetDefines(const LangOptions &Opts,
7078 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007079 DefineStd(Builder, "MIPSEB", Opts);
7080 Builder.defineMacro("_MIPSEB");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007081 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007082 }
7083};
7084
7085class Mips64ELTargetInfo : public Mips64TargetInfoBase {
Eric Christopher964a5f32015-08-05 23:48:05 +00007086 void setDataLayoutString() override {
Akira Hatanaka9064e362013-10-29 18:30:33 +00007087 if (ABI == "n32")
Eric Christopher964a5f32015-08-05 23:48:05 +00007088 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 +00007089 else
Eric Christopher964a5f32015-08-05 23:48:05 +00007090 DataLayoutString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Akira Hatanakabef17452011-09-20 19:21:49 +00007091 }
7092public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007093 Mips64ELTargetInfo(const llvm::Triple &Triple)
7094 : Mips64TargetInfoBase(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007095 // Default ABI is n64.
7096 BigEndian = false;
Akira Hatanakabef17452011-09-20 19:21:49 +00007097 }
Craig Topper3164f332014-03-11 03:39:26 +00007098 void getTargetDefines(const LangOptions &Opts,
7099 MacroBuilder &Builder) const override {
Akira Hatanakabef17452011-09-20 19:21:49 +00007100 DefineStd(Builder, "MIPSEL", Opts);
7101 Builder.defineMacro("_MIPSEL");
Simon Atanasyan16ee0052012-08-29 19:59:32 +00007102 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
Akira Hatanakabef17452011-09-20 19:21:49 +00007103 }
7104};
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007105
Ivan Krasindd7403e2011-08-24 20:22:22 +00007106class PNaClTargetInfo : public TargetInfo {
7107public:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007108 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007109 BigEndian = false;
James Y Knighta3518ad2016-01-27 01:04:51 +00007110 this->UserLabelPrefix = "";
Ivan Krasindd7403e2011-08-24 20:22:22 +00007111 this->LongAlign = 32;
7112 this->LongWidth = 32;
7113 this->PointerAlign = 32;
7114 this->PointerWidth = 32;
7115 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007116 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007117 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007118 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007119 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007120 this->SizeType = TargetInfo::UnsignedInt;
7121 this->PtrDiffType = TargetInfo::SignedInt;
7122 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007123 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007124 }
7125
Craig Toppere6f17d02014-03-11 04:07:52 +00007126 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007127 Builder.defineMacro("__le32__");
7128 Builder.defineMacro("__pnacl__");
7129 }
Craig Topper3164f332014-03-11 03:39:26 +00007130 void getTargetDefines(const LangOptions &Opts,
7131 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007132 getArchDefines(Opts, Builder);
7133 }
Craig Topper3164f332014-03-11 03:39:26 +00007134 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007135 return Feature == "pnacl";
7136 }
Craig Topper6c03a542015-10-19 04:51:35 +00007137 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007138 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007139 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007140 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007141 ArrayRef<const char *> getGCCRegNames() const override;
7142 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007143 bool validateAsmConstraint(const char *&Name,
7144 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007145 return false;
7146 }
7147
Craig Topper3164f332014-03-11 03:39:26 +00007148 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007149 return "";
7150 }
7151};
7152
Craig Topperf054e3a2015-10-19 03:52:27 +00007153ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7154 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007155}
7156
Craig Topperf054e3a2015-10-19 03:52:27 +00007157ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7158 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007159}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007160
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007161// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
7162class NaClMips32ELTargetInfo : public Mips32ELTargetInfo {
7163public:
7164 NaClMips32ELTargetInfo(const llvm::Triple &Triple) :
Petar Jovanovic2e0551f2015-08-11 21:27:39 +00007165 Mips32ELTargetInfo(Triple) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007166 }
7167
7168 BuiltinVaListKind getBuiltinVaListKind() const override {
7169 return TargetInfo::PNaClABIBuiltinVaList;
7170 }
7171};
7172
JF Bastien643817d2014-09-12 17:52:47 +00007173class Le64TargetInfo : public TargetInfo {
7174 static const Builtin::Info BuiltinInfo[];
7175
7176public:
7177 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7178 BigEndian = false;
7179 NoAsmVariants = true;
7180 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7181 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eric Christopher964a5f32015-08-05 23:48:05 +00007182 DataLayoutString = "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
JF Bastien643817d2014-09-12 17:52:47 +00007183 }
7184
7185 void getTargetDefines(const LangOptions &Opts,
7186 MacroBuilder &Builder) const override {
7187 DefineStd(Builder, "unix", Opts);
7188 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7189 Builder.defineMacro("__ELF__");
7190 }
Craig Topper6c03a542015-10-19 04:51:35 +00007191 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7192 return llvm::makeArrayRef(BuiltinInfo,
7193 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007194 }
7195 BuiltinVaListKind getBuiltinVaListKind() const override {
7196 return TargetInfo::PNaClABIBuiltinVaList;
7197 }
7198 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007199 ArrayRef<const char *> getGCCRegNames() const override {
7200 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007201 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007202 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7203 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007204 }
7205 bool validateAsmConstraint(const char *&Name,
7206 TargetInfo::ConstraintInfo &Info) const override {
7207 return false;
7208 }
7209
7210 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007211};
Dan Gohmanc2853072015-09-03 22:51:53 +00007212
7213class WebAssemblyTargetInfo : public TargetInfo {
7214 static const Builtin::Info BuiltinInfo[];
7215
7216 enum SIMDEnum {
7217 NoSIMD,
7218 SIMD128,
7219 } SIMDLevel;
7220
7221public:
7222 explicit WebAssemblyTargetInfo(const llvm::Triple &T)
7223 : TargetInfo(T), SIMDLevel(NoSIMD) {
7224 BigEndian = false;
7225 NoAsmVariants = true;
7226 SuitableAlign = 128;
7227 LargeArrayMinWidth = 128;
7228 LargeArrayAlign = 128;
7229 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007230 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007231 LongDoubleWidth = LongDoubleAlign = 128;
7232 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007233 }
7234
7235protected:
7236 void getTargetDefines(const LangOptions &Opts,
7237 MacroBuilder &Builder) const override {
7238 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7239 if (SIMDLevel >= SIMD128)
7240 Builder.defineMacro("__wasm_simd128__");
7241 }
7242
7243private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007244 bool
7245 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7246 StringRef CPU,
7247 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007248 if (CPU == "bleeding-edge")
7249 Features["simd128"] = true;
7250 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7251 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007252 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007253 return llvm::StringSwitch<bool>(Feature)
7254 .Case("simd128", SIMDLevel >= SIMD128)
7255 .Default(false);
7256 }
7257 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007258 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007259 for (const auto &Feature : Features) {
7260 if (Feature == "+simd128") {
7261 SIMDLevel = std::max(SIMDLevel, SIMD128);
7262 continue;
7263 }
7264 if (Feature == "-simd128") {
7265 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7266 continue;
7267 }
7268
7269 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7270 << "-target-feature";
7271 return false;
7272 }
7273 return true;
7274 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007275 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007276 return llvm::StringSwitch<bool>(Name)
7277 .Case("mvp", true)
7278 .Case("bleeding-edge", true)
7279 .Case("generic", true)
7280 .Default(false);
7281 }
Craig Topper6c03a542015-10-19 04:51:35 +00007282 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7283 return llvm::makeArrayRef(BuiltinInfo,
7284 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007285 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007286 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007287 return VoidPtrBuiltinVaList;
7288 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007289 ArrayRef<const char *> getGCCRegNames() const final {
7290 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007291 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007292 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7293 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007294 }
7295 bool
7296 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007297 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007298 return false;
7299 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007300 const char *getClobbers() const final { return ""; }
7301 bool isCLZForZeroUndef() const final { return false; }
7302 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007303 IntType getIntTypeByWidth(unsigned BitWidth,
7304 bool IsSigned) const final {
7305 // WebAssembly prefers long long for explicitly 64-bit integers.
7306 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7307 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7308 }
7309 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7310 bool IsSigned) const final {
7311 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7312 return BitWidth == 64
7313 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7314 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7315 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007316};
7317
7318const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7319#define BUILTIN(ID, TYPE, ATTRS) \
7320 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7321#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7322 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7323#include "clang/Basic/BuiltinsWebAssembly.def"
7324};
7325
7326class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7327public:
7328 explicit WebAssembly32TargetInfo(const llvm::Triple &T)
7329 : WebAssemblyTargetInfo(T) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007330 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Dan Gohman0d75f2c2016-01-07 03:20:15 +00007331 DataLayoutString = "e-m:e-p:32:32-i64:64-n32:64-S128";
Dan Gohmanc2853072015-09-03 22:51:53 +00007332 }
7333
7334protected:
7335 void getTargetDefines(const LangOptions &Opts,
7336 MacroBuilder &Builder) const override {
7337 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7338 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7339 }
7340};
7341
7342class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7343public:
7344 explicit WebAssembly64TargetInfo(const llvm::Triple &T)
7345 : WebAssemblyTargetInfo(T) {
7346 LongAlign = LongWidth = 64;
7347 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007348 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Dan Gohman0d75f2c2016-01-07 03:20:15 +00007349 DataLayoutString = "e-m:e-p:64:64-i64:64-n32:64-S128";
Dan Gohmanc2853072015-09-03 22:51:53 +00007350 }
7351
7352protected:
7353 void getTargetDefines(const LangOptions &Opts,
7354 MacroBuilder &Builder) const override {
7355 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7356 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7357 }
7358};
7359
JF Bastien643817d2014-09-12 17:52:47 +00007360const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7361#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007362 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007363#include "clang/Basic/BuiltinsLe64.def"
7364};
7365
Eric Christopherc48497a2015-09-18 21:26:24 +00007366static const unsigned SPIRAddrSpaceMap[] = {
7367 1, // opencl_global
7368 3, // opencl_local
7369 2, // opencl_constant
7370 4, // opencl_generic
7371 0, // cuda_device
7372 0, // cuda_constant
7373 0 // cuda_shared
7374};
7375class SPIRTargetInfo : public TargetInfo {
7376public:
7377 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7378 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7379 "SPIR target must use unknown OS");
7380 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7381 "SPIR target must use unknown environment type");
7382 BigEndian = false;
7383 TLSSupported = false;
7384 LongWidth = LongAlign = 64;
7385 AddrSpaceMap = &SPIRAddrSpaceMap;
7386 UseAddrSpaceMapMangling = true;
7387 // Define available target features
7388 // These must be defined in sorted order!
7389 NoAsmVariants = true;
7390 }
7391 void getTargetDefines(const LangOptions &Opts,
7392 MacroBuilder &Builder) const override {
7393 DefineStd(Builder, "SPIR", Opts);
7394 }
7395 bool hasFeature(StringRef Feature) const override {
7396 return Feature == "spir";
7397 }
Craig Topper3164f332014-03-11 03:39:26 +00007398
Craig Topper6c03a542015-10-19 04:51:35 +00007399 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007400 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007401 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007402 bool validateAsmConstraint(const char *&Name,
7403 TargetInfo::ConstraintInfo &info) const override {
7404 return true;
7405 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007406 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7407 return None;
7408 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007409 BuiltinVaListKind getBuiltinVaListKind() const override {
7410 return TargetInfo::VoidPtrBuiltinVaList;
7411 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007412
Eric Christopherc48497a2015-09-18 21:26:24 +00007413 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7414 return (CC == CC_SpirFunction || CC == CC_SpirKernel) ? CCCR_OK
7415 : CCCR_Warning;
7416 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007417
Eric Christopherc48497a2015-09-18 21:26:24 +00007418 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
7419 return CC_SpirFunction;
7420 }
7421};
Guy Benyeib798fc92012-12-11 21:38:14 +00007422
Eric Christopherc48497a2015-09-18 21:26:24 +00007423class SPIR32TargetInfo : public SPIRTargetInfo {
7424public:
7425 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7426 PointerWidth = PointerAlign = 32;
7427 SizeType = TargetInfo::UnsignedInt;
7428 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
7429 DataLayoutString = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
7430 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7431 }
7432 void getTargetDefines(const LangOptions &Opts,
7433 MacroBuilder &Builder) const override {
7434 DefineStd(Builder, "SPIR32", Opts);
7435 }
7436};
Guy Benyeib798fc92012-12-11 21:38:14 +00007437
Eric Christopherc48497a2015-09-18 21:26:24 +00007438class SPIR64TargetInfo : public SPIRTargetInfo {
7439public:
7440 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
7441 PointerWidth = PointerAlign = 64;
7442 SizeType = TargetInfo::UnsignedLong;
7443 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
7444 DataLayoutString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
7445 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
7446 }
7447 void getTargetDefines(const LangOptions &Opts,
7448 MacroBuilder &Builder) const override {
7449 DefineStd(Builder, "SPIR64", Opts);
7450 }
7451};
Guy Benyeib798fc92012-12-11 21:38:14 +00007452
Robert Lytton0e076492013-08-13 09:43:10 +00007453class XCoreTargetInfo : public TargetInfo {
7454 static const Builtin::Info BuiltinInfo[];
7455public:
7456 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
7457 BigEndian = false;
7458 NoAsmVariants = true;
7459 LongLongAlign = 32;
7460 SuitableAlign = 32;
7461 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00007462 SizeType = UnsignedInt;
7463 PtrDiffType = SignedInt;
7464 IntPtrType = SignedInt;
7465 WCharType = UnsignedChar;
7466 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00007467 UseZeroLengthBitfieldAlignment = true;
Eric Christopher964a5f32015-08-05 23:48:05 +00007468 DataLayoutString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
7469 "-f64:32-a:0:32-n32";
Robert Lytton0e076492013-08-13 09:43:10 +00007470 }
Craig Topper3164f332014-03-11 03:39:26 +00007471 void getTargetDefines(const LangOptions &Opts,
7472 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007473 Builder.defineMacro("__XS1B__");
7474 }
Craig Topper6c03a542015-10-19 04:51:35 +00007475 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7476 return llvm::makeArrayRef(BuiltinInfo,
7477 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00007478 }
Craig Topper3164f332014-03-11 03:39:26 +00007479 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007480 return TargetInfo::VoidPtrBuiltinVaList;
7481 }
Craig Topper3164f332014-03-11 03:39:26 +00007482 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007483 return "";
7484 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007485 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007486 static const char * const GCCRegNames[] = {
7487 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7488 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
7489 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007490 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00007491 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007492 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7493 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00007494 }
Craig Topper3164f332014-03-11 03:39:26 +00007495 bool validateAsmConstraint(const char *&Name,
7496 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00007497 return false;
7498 }
Craig Topper3164f332014-03-11 03:39:26 +00007499 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00007500 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
7501 return (RegNo < 2)? RegNo : -1;
7502 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00007503 bool allowsLargerPreferedTypeAlignment() const override {
7504 return false;
7505 }
Robert Lytton0e076492013-08-13 09:43:10 +00007506};
7507
7508const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007509#define BUILTIN(ID, TYPE, ATTRS) \
7510 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7511#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7512 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00007513#include "clang/Basic/BuiltinsXCore.def"
7514};
Robert Lytton0e076492013-08-13 09:43:10 +00007515
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007516// x86_32 Android target
7517class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
7518public:
7519 AndroidX86_32TargetInfo(const llvm::Triple &Triple)
7520 : LinuxTargetInfo<X86_32TargetInfo>(Triple) {
7521 SuitableAlign = 32;
7522 LongDoubleWidth = 64;
7523 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7524 }
7525};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007526
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007527// x86_64 Android target
7528class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
7529public:
7530 AndroidX86_64TargetInfo(const llvm::Triple &Triple)
7531 : LinuxTargetInfo<X86_64TargetInfo>(Triple) {
7532 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7533 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00007534
7535 bool useFloat128ManglingForLongDouble() const override {
7536 return true;
7537 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007538};
7539} // end anonymous namespace
7540
Chris Lattner5ba61f02006-10-14 07:39:34 +00007541//===----------------------------------------------------------------------===//
7542// Driver code
7543//===----------------------------------------------------------------------===//
7544
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007545static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
Daniel Dunbar52322032009-08-18 05:47:58 +00007546 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00007547
Daniel Dunbar52322032009-08-18 05:47:58 +00007548 switch (Triple.getArch()) {
7549 default:
Craig Topperf1186c52014-05-08 06:41:40 +00007550 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00007551
Tim Northover2a0783d2014-05-30 14:14:07 +00007552 case llvm::Triple::xcore:
7553 return new XCoreTargetInfo(Triple);
7554
7555 case llvm::Triple::hexagon:
7556 return new HexagonTargetInfo(Triple);
7557
7558 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00007559 if (Triple.isOSDarwin())
Tim Northover573cbee2014-05-24 12:52:07 +00007560 return new DarwinAArch64TargetInfo(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007561
7562 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00007563 case llvm::Triple::CloudABI:
7564 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple);
Ed Maste6a9eda52014-11-13 16:55:42 +00007565 case llvm::Triple::FreeBSD:
7566 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007567 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007568 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007569 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007570 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
Tim Northovera2ee4332014-03-29 15:09:45 +00007571 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007572 return new AArch64leTargetInfo(Triple);
James Molloy5e73df52014-04-16 15:06:20 +00007573 }
7574
Christian Pirker9b019ae2014-02-25 13:51:00 +00007575 case llvm::Triple::aarch64_be:
7576 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00007577 case llvm::Triple::FreeBSD:
7578 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007579 case llvm::Triple::Linux:
Tim Northover573cbee2014-05-24 12:52:07 +00007580 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007581 case llvm::Triple::NetBSD:
Tim Northover573cbee2014-05-24 12:52:07 +00007582 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
Christian Pirker9b019ae2014-02-25 13:51:00 +00007583 default:
Tim Northover573cbee2014-05-24 12:52:07 +00007584 return new AArch64beTargetInfo(Triple);
Tim Northover9bb857a2013-01-31 12:13:10 +00007585 }
7586
Daniel Dunbar52322032009-08-18 05:47:58 +00007587 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00007588 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00007589 if (Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007590 return new DarwinARMTargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007591
Daniel Dunbar52322032009-08-18 05:47:58 +00007592 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00007593 case llvm::Triple::Linux:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007594 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007595 case llvm::Triple::FreeBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007596 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007597 case llvm::Triple::NetBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007598 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007599 case llvm::Triple::OpenBSD:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007600 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007601 case llvm::Triple::Bitrig:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007602 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007603 case llvm::Triple::RTEMS:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007604 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007605 case llvm::Triple::NaCl:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007606 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007607 case llvm::Triple::Win32:
7608 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00007609 case llvm::Triple::Cygnus:
7610 return new CygwinARMTargetInfo(Triple);
7611 case llvm::Triple::GNU:
7612 return new MinGWARMTargetInfo(Triple);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007613 case llvm::Triple::Itanium:
7614 return new ItaniumWindowsARMleTargetInfo(Triple);
7615 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007616 default: // Assume MSVC for unknown environments
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00007617 return new MicrosoftARMleTargetInfo(Triple);
7618 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007619 default:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007620 return new ARMleTargetInfo(Triple);
7621 }
7622
7623 case llvm::Triple::armeb:
7624 case llvm::Triple::thumbeb:
7625 if (Triple.isOSDarwin())
7626 return new DarwinARMTargetInfo(Triple);
7627
7628 switch (os) {
7629 case llvm::Triple::Linux:
7630 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
7631 case llvm::Triple::FreeBSD:
7632 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
7633 case llvm::Triple::NetBSD:
7634 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
7635 case llvm::Triple::OpenBSD:
7636 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
7637 case llvm::Triple::Bitrig:
7638 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
7639 case llvm::Triple::RTEMS:
7640 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
7641 case llvm::Triple::NaCl:
7642 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
7643 default:
7644 return new ARMbeTargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007645 }
Eli Friedmanb5366062008-05-20 14:21:01 +00007646
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007647 case llvm::Triple::bpfeb:
7648 case llvm::Triple::bpfel:
7649 return new BPFTargetInfo(Triple);
7650
Daniel Dunbar52322032009-08-18 05:47:58 +00007651 case llvm::Triple::msp430:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007652 return new MSP430TargetInfo(Triple);
Eli Friedmanb5366062008-05-20 14:21:01 +00007653
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007654 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007655 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007656 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007657 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007658 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007659 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007660 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007661 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007662 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007663 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007664 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007665 return new Mips32EBTargetInfo(Triple);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00007666 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007667
7668 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007669 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007670 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007671 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007672 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007673 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007674 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007675 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007676 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007677 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00007678 case llvm::Triple::NaCl:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007679 return new NaClTargetInfo<NaClMips32ELTargetInfo>(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007680 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007681 return new Mips32ELTargetInfo(Triple);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00007682 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007683
Akira Hatanakabef17452011-09-20 19:21:49 +00007684 case llvm::Triple::mips64:
7685 switch (os) {
7686 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007687 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007688 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007689 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007690 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007691 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007692 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007693 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007694 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007695 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007696 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007697 return new Mips64EBTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007698 }
7699
7700 case llvm::Triple::mips64el:
7701 switch (os) {
7702 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007703 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007704 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007705 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007706 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007707 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007708 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007709 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007710 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007711 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007712 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007713 return new Mips64ELTargetInfo(Triple);
Akira Hatanakabef17452011-09-20 19:21:49 +00007714 }
7715
Ivan Krasindd7403e2011-08-24 20:22:22 +00007716 case llvm::Triple::le32:
7717 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00007718 case llvm::Triple::NaCl:
7719 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
7720 default:
7721 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007722 }
7723
JF Bastien643817d2014-09-12 17:52:47 +00007724 case llvm::Triple::le64:
7725 return new Le64TargetInfo(Triple);
7726
Daniel Dunbar52322032009-08-18 05:47:58 +00007727 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007728 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007729 return new DarwinPPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007730 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007731 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007732 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007733 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007734 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007735 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007736 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007737 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007738 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007739 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007740 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007741 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007742 return new PPC32TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007743 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007744
7745 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007746 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007747 return new DarwinPPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007748 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007749 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007750 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007751 case llvm::Triple::Lv2:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007752 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007753 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007754 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007755 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007756 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007757 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007758 return new PPC64TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007759 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007760
Bill Schmidt778d3872013-07-26 01:36:11 +00007761 case llvm::Triple::ppc64le:
7762 switch (os) {
7763 case llvm::Triple::Linux:
7764 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00007765 case llvm::Triple::NetBSD:
7766 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
Bill Schmidt778d3872013-07-26 01:36:11 +00007767 default:
7768 return new PPC64TargetInfo(Triple);
7769 }
7770
Peter Collingbournec947aae2012-05-20 23:28:41 +00007771 case llvm::Triple::nvptx:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007772 return new NVPTX32TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007773 case llvm::Triple::nvptx64:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007774 return new NVPTX64TargetInfo(Triple);
Peter Collingbournec947aae2012-05-20 23:28:41 +00007775
Tom Stellardd8e38a32015-01-06 20:34:47 +00007776 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00007777 case llvm::Triple::r600:
Matt Arsenault3ea39f92015-06-19 17:54:10 +00007778 return new AMDGPUTargetInfo(Triple);
Eli Friedmand13b41e2012-10-12 23:32:00 +00007779
Daniel Dunbar52322032009-08-18 05:47:58 +00007780 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007781 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00007782 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007783 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007784 case llvm::Triple::Solaris:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007785 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007786 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007787 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
Hans Wennborg0bb84622012-08-02 13:45:48 +00007788 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007789 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007790 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007791 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007792 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007793 return new SparcV8TargetInfo(Triple);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00007794 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007795
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007796 // The 'sparcel' architecture copies all the above cases except for Solaris.
7797 case llvm::Triple::sparcel:
7798 switch (os) {
7799 case llvm::Triple::Linux:
7800 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple);
7801 case llvm::Triple::NetBSD:
7802 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7803 case llvm::Triple::OpenBSD:
7804 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple);
7805 case llvm::Triple::RTEMS:
7806 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple);
7807 default:
7808 return new SparcV8elTargetInfo(Triple);
7809 }
7810
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007811 case llvm::Triple::sparcv9:
7812 switch (os) {
7813 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007814 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007815 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007816 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007817 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007818 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007819 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007820 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007821 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007822 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007823 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007824 return new SparcV9TargetInfo(Triple);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007825 }
7826
Ulrich Weigand47445072013-05-06 16:26:41 +00007827 case llvm::Triple::systemz:
7828 switch (os) {
7829 case llvm::Triple::Linux:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007830 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007831 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007832 return new SystemZTargetInfo(Triple);
Ulrich Weigand47445072013-05-06 16:26:41 +00007833 }
7834
Eli Friedmana9c3d712009-08-19 20:47:07 +00007835 case llvm::Triple::tce:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007836 return new TCETargetInfo(Triple);
Eli Friedmana9c3d712009-08-19 20:47:07 +00007837
Daniel Dunbar52322032009-08-18 05:47:58 +00007838 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007839 if (Triple.isOSDarwin())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007840 return new DarwinI386TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007841
Daniel Dunbar52322032009-08-18 05:47:58 +00007842 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00007843 case llvm::Triple::CloudABI:
7844 return new CloudABITargetInfo<X86_32TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007845 case llvm::Triple::Linux: {
7846 switch (Triple.getEnvironment()) {
7847 default:
7848 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
7849 case llvm::Triple::Android:
7850 return new AndroidX86_32TargetInfo(Triple);
7851 }
7852 }
Daniel Dunbar52322032009-08-18 05:47:58 +00007853 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007854 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007855 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007856 return new NetBSDI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007857 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007858 return new OpenBSDI386TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007859 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007860 return new BitrigI386TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007861 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007862 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007863 case llvm::Triple::KFreeBSD:
7864 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007865 case llvm::Triple::Minix:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007866 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007867 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007868 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007869 case llvm::Triple::Win32: {
7870 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007871 case llvm::Triple::Cygnus:
7872 return new CygwinX86_32TargetInfo(Triple);
7873 case llvm::Triple::GNU:
7874 return new MinGWX86_32TargetInfo(Triple);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00007875 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007876 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007877 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007878 return new MicrosoftX86_32TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007879 }
7880 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00007881 case llvm::Triple::Haiku:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007882 return new HaikuX86_32TargetInfo(Triple);
Douglas Gregor9fabd852011-07-01 22:41:14 +00007883 case llvm::Triple::RTEMS:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007884 return new RTEMSX86_32TargetInfo(Triple);
Eli Benderskyd7c92032012-12-04 18:38:10 +00007885 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007886 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
Alexey Bataevc99b0492015-11-25 09:24:26 +00007887 case llvm::Triple::ELFIAMCU:
7888 return new MCUX86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007889 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007890 return new X86_32TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007891 }
7892
7893 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007894 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007895 return new DarwinX86_64TargetInfo(Triple);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00007896
Daniel Dunbar52322032009-08-18 05:47:58 +00007897 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00007898 case llvm::Triple::CloudABI:
7899 return new CloudABITargetInfo<X86_64TargetInfo>(Triple);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00007900 case llvm::Triple::Linux: {
7901 switch (Triple.getEnvironment()) {
7902 default:
7903 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
7904 case llvm::Triple::Android:
7905 return new AndroidX86_64TargetInfo(Triple);
7906 }
7907 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00007908 case llvm::Triple::DragonFly:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007909 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007910 case llvm::Triple::NetBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007911 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007912 case llvm::Triple::OpenBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007913 return new OpenBSDX86_64TargetInfo(Triple);
Eli Friedman9fa28852012-08-08 23:57:20 +00007914 case llvm::Triple::Bitrig:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007915 return new BitrigX86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007916 case llvm::Triple::FreeBSD:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007917 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00007918 case llvm::Triple::KFreeBSD:
7919 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007920 case llvm::Triple::Solaris:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007921 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007922 case llvm::Triple::Win32: {
7923 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00007924 case llvm::Triple::Cygnus:
7925 return new CygwinX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007926 case llvm::Triple::GNU:
7927 return new MinGWX86_64TargetInfo(Triple);
7928 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00007929 default: // Assume MSVC for unknown environments
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00007930 return new MicrosoftX86_64TargetInfo(Triple);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00007931 }
7932 }
Eli Benderskyd7c92032012-12-04 18:38:10 +00007933 case llvm::Triple::NaCl:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007934 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00007935 case llvm::Triple::PS4:
7936 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007937 default:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00007938 return new X86_64TargetInfo(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007939 }
Guy Benyeib798fc92012-12-11 21:38:14 +00007940
Douglas Katzman78d7c542015-05-12 21:18:10 +00007941 case llvm::Triple::spir: {
7942 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7943 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7944 return nullptr;
7945 return new SPIR32TargetInfo(Triple);
7946 }
7947 case llvm::Triple::spir64: {
7948 if (Triple.getOS() != llvm::Triple::UnknownOS ||
7949 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
7950 return nullptr;
7951 return new SPIR64TargetInfo(Triple);
7952 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007953 case llvm::Triple::wasm32:
7954 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
7955 return nullptr;
7956 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple);
7957 case llvm::Triple::wasm64:
7958 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
7959 return nullptr;
7960 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple);
Daniel Dunbar52322032009-08-18 05:47:58 +00007961 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00007962}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007963
7964/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00007965/// options.
Alp Toker80758082014-07-06 05:26:44 +00007966TargetInfo *
7967TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
7968 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00007969 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007970
7971 // Construct the target
Ahmed Charlesb8984322014-03-07 20:03:18 +00007972 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007973 if (!Target) {
7974 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00007975 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007976 }
Alp Toker80758082014-07-06 05:26:44 +00007977 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007978
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007979 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007980 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
7981 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00007982 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00007983 }
7984
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007985 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00007986 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
7987 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00007988 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007989 }
7990
Rafael Espindolaeb265472013-08-21 21:59:03 +00007991 // Set the fp math unit.
7992 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
7993 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00007994 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00007995 }
7996
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00007997 // Compute the default target features, we need the target to handle this
7998 // because features may have dependencies on one another.
7999 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008000 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8001 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008002 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008003
8004 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008005 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008006 for (const auto &F : Features)
8007 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8008
Eric Christopher3ff21b32013-10-16 21:26:26 +00008009 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008010 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008011
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008012 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008013}